אופטימיזציה של קוד DEX

אופטימיזציה של קוד DEX היא ממצא של תפקוד האפליקציה שעוזר לעקוב אחרי האיכות, הגודל והביצועים של הקומפילציה של האפליקציה ולשפר אותם. אופטימיזציה והסתרת הקוד באמצעות R8 או כלים חלופיים (כמו כלי אופטימיזציה שתואמים ל-ProGuard או מעבדי DEX משניים לאחר העיבוד) מצמצמים את גודל ה-DEX של האפליקציה, משפרים את ביצועי זמן הריצה וממזערים את השימוש בזיכרון.

קבצי DEX, או Dalvik Executable, מכילים את הקוד שעבר קומפילציה ומשמש להפעלת האפליקציה. בדרך כלל הם כוללים קוד Java ו-Kotlin, בניגוד לקוד C++ שעבר קומפילציה או לקבצי .so.

בדוחות של תכונת 'תפקוד האפליקציה' מוצגים מדדים של אופטימיזציה של קוד DEX לכל האפליקציות והמשחקים, אבל ספי איכות נאכפים רק באפליקציות ובמשחקים שעומדים בדרישות גודל ספציפיות.

זיהוי הבעיה

הנתונים של מדד תפקוד האפליקציה יכולים לעזור לכם לגלות מתי רמות האופטימיזציה של קוד ה-DEX של האפליקציה נמוכות. האופטימיזציה כוללת טשטוש, צמצום ואופטימיזציה של אפליקציות ומשחקים שמשתמשים ב-R8. באפליקציות שלא משתמשות ב-R8, תפקוד האפליקציה מנסה לבדוק את שיעורי האופטימיזציה, ההקטנה וערפול הקוד, אבל אם צריך היא משתמשת בהיוריסטיקה של ערפול קוד כפרוקסי.

מעקב אחרי סטטוס האופטימיזציה

הנתונים של מדד תפקוד האפליקציה יכולים לעזור לכם לשפר את הביצועים שלה. לשם כך, תקבלו התראות דרך Play Console אם האפליקציה לא עומדת באחוזים המוגדרים למינימום של אופטימיזציה של הקוד. הגדרות מפורטות של כיווץ, אופטימיזציה והסתרה זמינות במאמר שימוש בכלי לניתוח ההגדרות של R8.

באפליקציות שנוצרו באמצעות הטלאי האחרון של AGP בגרסה 8.10 ואילך, אחוזי הכיסוי האלה נלקחים מקובץ r8.json שכלול באפליקציה.

בגרסאות ישנות יותר של AGP או במקרים שבהם הקובץ r8.json לא נכלל, האחוזים מחושבים מהקובץ mapping.txt אם הוא נכלל, או באמצעות היוריסטיקה של DEX אם קובץ המיפוי לא זמין.

באפליקציות שעברו אופטימיזציה באמצעות כלי אופטימיזציה חלופי של קוד, תפקוד האפליקציה מבצע ניתוח כדי להעריך את אחוז המחלקות, השיטות והשדות שעברו הסתרה בקובץ AAB.

גודל DEX כולל מינימלי

הנתונים של תפקוד האפליקציה ב-Android מחשבים מדדי אופטימיזציה של קוד לכל האפליקציות, אבל תקבלו התראות רק אם חבילת האפליקציה שלכם עומדת בדרישות הבאות לגבי גודל ה-DEX הכולל:

  • אפליקציות: ה-Bundle מכיל לפחות 10MB של קוד DEX שנמדד כגודל לא דחוס
  • משחקים: חבילת האפליקציה מכילה לפחות 50MB של קוד DEX שנמדד כגודל לא דחוס

במדד תפקוד האפליקציה ל-Android מוצג הגודל של קובץ ה-DEX של האפליקציה, אבל אפשר גם למדוד אותו באופן מקומי באמצעות שורת הפקודה:

  unzip -l <yourapp>.aab | grep -E '\.dex$' | awk '{sum+=$1} END {print sum}'

מדידת אופטימיזציה של קוד R8 באופן מקומי

אם האפליקציה שלכם עוברת אופטימיזציה באמצעות R8, אתם יכולים למדוד את האופטימיזציה, ההסתרה והכיווץ של חבילת האפליקציה באמצעות כלי הניתוח של הגדרות R8. דוח הניתוח של הגדרות R8 כלול גם במיומנות R8 Analyzer. הדוח יכול לעזור לכם להבין איך כללי השמירה משפיעים על ציוני האופטימיזציה, ההקטנה וההסתרה, אבל האחוזים בדוח לא יהיו זהים לערכים בתכונה 'תפקוד האפליקציה', כי האחוזים האלה מחושבים לפני האופטימיזציות.

כדי לבדוק את המטא-נתונים המדויקים שמשמשים את תפקוד האפליקציה ב-Android לחישוב הציונים, צריך לחלץ את הקובץ r8.json מחבילת האפליקציה:

unzip -p <yourapp>.aab BUNDLE-METADATA/com.android.tools/r8.json

פתרון הבעיה

כדי לטפל בציוני אופטימיזציה נמוכים של קוד ה-DEX, כדאי לעיין בהמלצות על סמך מערכת הבנייה והאופטימיזציה שלכם:

‫פלאגין של Android Gradle ו-R8

כדי לשפר את ציוני האופטימיזציה של קוד DEX ב-R8, אפשר לעיין בהנחיות במאמר בנושא שיפור האופטימיזציה ב-R8. אפשר גם להשתמש במיומנות R8 Analyzer כדי לקבל הנחיות נוספות לאופטימיזציה של כללי השמירה של האפליקציה.

מערכות build שאינן R8 ומעבדי DEX לאחר עיבוד

אם צינור עיבוד הנתונים שלכם משתמש בכלים מותאמים אישית לבנייה או במעבדי DEX משניים, כדאי לבצע את השלבים הבאים כדי לשפר את האופטימיזציה של האפליקציה:

  • פותחים את חבילת האפליקציות ב-Android Studio ומציגים אותה בכלי לניתוח APK.
  • בוחרים את כל הקבצים .dex.
  • חשוב לשים לב לקבצים עם הגודל הכי גדול כשלוחצים על הלחצן 'הסרת טשטוש של שמות' (הערה: כדי לעשות את זה צריך להעלות קובץ mapping.txt). אם חלק מהקבצים נשארים גדולים אחרי ההסתרה, כנראה שהם מושפעים מכללי שמירה שחלים על כל החבילה.
  • מחפשים בקובץ proguard-rules.pro, configuration.txt, או בקובץ המקביל אם אתם לא משתמשים ב-R8, כללי keep שתואמים לחבילות שלא עוברות obfuscation. לדוגמה, אם com.foo. היא חבילה גדולה ב-dex, מחפשים כללי שמירה בפורמט -keep com.foo.** או -keep com.foo.bar.**.
  • חשוב לזכור שכללי השמירה של צרכני הספרייה לא תמיד קלים לזיהוי. אם אתם חושדים שכלל צרכן של ספרייה משפיע על האופטימיזציה, אתם יכולים לבדוק את זה באופן מקומי. לשם כך, מוסיפים את הכלל לאפליקציית דוגמה עצמאית באמצעות גרסה עדכנית של AGP, ובודקים אותו באמצעות כלי ניתוח ההגדרות של R8.