הכלי R8 Configuration Analyzer נועד לעזור לכם למקסם את היתרונות של R8 בביצועים, על ידי מתן תובנות מפורטות לגבי איכות ההגדרה של האפליקציה. הכלי מאפשר לעקוב אחרי האופטימיזציה של R8 ולשפר אותה באמצעות מעקב אחרי מדדים מרכזיים – במיוחד ציוני הכיווץ, האופטימיזציה וההסתרה – שמציינים את אחוז בסיס הקוד שזמין לאופטימיזציה. הכלי לניתוח עוזר לכם לזהות כללי שמירה רחבים או מיותרים, כולל כללים שהוצגו על ידי ספריות של צד שלישי, כדי לשפר את ההגדרה ולוודא ש-R8 יכול לבצע אופטימיזציה יעילה לכמה שיותר מחלקות, שדות ושיטות.
יצירת הדוח
מגרסה AGP 9.3.0-alpha05 ואילך, הדוח נוצר באופן אוטומטי ב-build/outputs/mapping/release/configanalyzer.html כשמריצים build של R8. כדי להשבית את היצירה האוטומטית של הפלט, מגדירים את המאפיין הבא ב-Gradle:
android.experimental.r8.enableR8ConfigurationAnalyzer=false
ב-AGP 9.2 ואילך, מגדירים את מאפיין המערכת com.android.tools.r8.dumpkeepradiushtmltodirectory כשמריצים משימת Gradle עם build שמופעל באמצעות R8.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
לדוגמה, משתמשים בפקודה הבאה כדי ליצור את דוח ה-HTML בספרייה /tmp/r8analysis:
// To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis
// To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis
הסבר על הדוח
כלי הניתוח של הגדרות R8 מספק תובנות לגבי ההגדרות של R8 באפליקציה וההשפעה של כל כלל שמירה ספציפי על האפליקציה. כך אפשר להפיק את האופטימיזציה המקסימלית מ-R8 ולשפר את ביצועי האפליקציה. השתמשו בציונים הבאים כדי להבין כמה מבסיס הקוד שלכם זמין לאופטימיזציה על ידי R8.
הניקוד יורד
כש-R8 מכווץ את האפליקציה, הוא מקטין את הגודל הכולל שלה על ידי זיהוי והסרה של קוד ומשאבים שלא נמצאים בשימוש, כדי להבטיח שה-build הסופי יהיה קטן ככל האפשר. המדד 'הקטנת הנפח' עוקב אחרי אחוז המחלקות, השדות והמתודות שמועדים להקטנת הנפח. לדוגמה, ציון של 66% בהקטנה מציין ש-R8 יכול לבצע הקטנה ב-66% מבסיס הקוד.
ציון האופטימיזציה
R8 מבצע אופטימיזציות כמו הטמעה של שיטות ומיזוג של מחלקות, וכתוצאה מכך משפר את ההפעלה ואת הזיכרון של האפליקציה. ציון האופטימיזציה עוקב אחרי אחוז המחלקות, השדות והשיטות ש-R8 מבצע עליהם אופטימיזציות. לדוגמה, אם ציון האופטימיזציה הוא 66%, המשמעות היא ש-R8 יכול לבצע אופטימיזציה רק ב-66% מבסיס הקוד.
ציון ההסתרה
על ידי ערפול של מחלקות, שדות ושיטות לשמות קצרים יותר, R8 מקטין את טביעת הרגל של המטא-נתונים של האפליקציה כדי לחסוך בזיכרון. ציון הטשטוש מודד את אחוז הקוד שזמין לטשטוש בבסיס הקוד.
שיפור כללי השמירה
כדי לשפר את הציונים ולבצע אופטימיזציה טובה יותר של R8, כדאי לשפר את כללי השמירה כך שלא ימנעו מ-R8 לבצע אופטימיזציה של האפליקציה ללא צורך. צריך לשמור רק מחלקות, שיטות או שדות שאליהם ניגשים באמצעות רפלקציה.
כדי לעשות את זה, משתמשים בניתוח כללי השמירה.
כדי לראות את הניתוח המפורט של כלל, לוחצים עליו כדי לפתוח את מסך הפרטים.
איך משפרים את כללי השמירה
כדי לשפר את כללי השמירה ולממש את מלוא הפוטנציאל של האופטימיזציות של R8 באפליקציה, צריך לבצע את הפעולות הבאות:
- בכלי Configuration Analyzer, בכל כלל שמירה מוצג אחוז המחלקות, השדות והשיטות שלא ניתן לבצע אופטימיזציה שלהם באמצעות R8. אפשר להשתמש בזה כדי לזהות את כללי השמירה שמונעים אופטימיזציה במספר גדול של מחלקות, שדות או שיטות. מוצגים גם נכסי האופטימיזציה שנמנעים על ידי כל כלל שמירה.
- אם אתם רואים כלל keep שמונע אופטימיזציה של מספר גדול של מחלקות, כדאי לבדוק אילו מחלקות, שדות ושיטות נמנעים מאופטימיזציה על ידי כלל ה-keep, כדי לראות אם הכלל הזה שומר על פריטים שלא מופעלים באופן דינמי באמצעות reflection.
- כדי לצמצם את האופטימיזציה שנחסמת על ידי כללי השמירה, מטargetים רק את המחלקות, השדות או השיטות שצריך על ידי בחירת אפשרות השמירה הנכונה ופעולה לפי השיטות המומלצות.
- בודקים ומריצים בדיקות שכוללות את המחלקות, השדות והשיטות המושפעים של כלל השמירה, ומשפרים את כללי השמירה.
בדיקת האופטימיזציה של ספריות
כשמשלבים ספריות של צד שלישי, הן לרוב כוללות כללי שמירה משלהן כדי לעבוד עם R8. מכיוון שיוצר הספרייה לא יכול לחזות את היישום הספציפי שלכם, הוא כותב לפעמים כללים שמרניים ורחבי היקף שמונעים אופטימיזציה ביותר מחלקים, שדות ושיטות מהנדרש. יכול להיות שהדבר ימנע מ-R8 לבצע אופטימיזציה לחלקים באפליקציה שלא קשורים לביצוע בפועל של הספרייה בזמן הריצה. אפשר להשתמש בכלי R8 Configuration Analyzer כדי לזהות ספריות שמציגות כללים שמשפיעים באופן שלילי על האופטימיזציה של האפליקציה.
אפשר להשתמש בכלי לניתוח ההגדרות כדי לבדוק את ההשפעה המשולבת של כל כללי השמירה של הצרכנים שמוזגו. ניתוח ההשפעה של כל כלל שמירה שמגיע מספרייה של צד שלישי מאפשר לכם לזהות ולעקוב אחרי הספריות הספציפיות של צד שלישי שמונעות אופטימיזציה משמעותית באפליקציה.
איך מבצעים אופטימיזציה של ספריות
- אם בספרייה יש כלל רחב מדי, מומלץ לפנות למנהל התחזוקה של הספרייה עם הנתונים מהדוח כדי להראות לו איך הכללים הנוכחיים משפיעים על ציוני האופטימיזציה של האפליקציה. אם מדובר בספרייה חיצונית, כדאי לחפש באגים קיימים בספרייה לפני ששולחים דיווח על בעיות.
- במקרה הצורך, אפשר לבדוק שיפורים פוטנציאליים על ידי סינון כללים מספרייה ספציפית. אפשר לייבא את הכללים של הספרייה לפרויקט, להחריג את הכללים הרחבים ולהפעיל מחדש את כלי הניתוח של ההגדרות כדי למדוד את השיפורים הפוטנציאליים בגודל ובביצועים.
כללים שנכללים בכללים אחרים
יכול להיות שיש מקרים שבהם כמה כללי שמירה חופפים, ואחד מהכללים האלה מונע אופטימיזציה מעבר לנדרש. אם יש שני כללי שמירה בבסיס קוד.
# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }
# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass
כלל השמירה הראשון שמונע אופטימיזציה בחבילה כולה כולל את כלל השמירה השני שמטרגט מחלקה בתוך החבילה שנשמרת על ידי כלל השמירה הראשון. כשכללי השמירה חופפים, יכול להיות שכלל אחד יחסום יותר אופטימיזציות מהנדרש. שיפור הכללים החופפים האלה מאפשר לכם למקסם את האופטימיזציה של R8 ולמנוע חוב טכני. התהליך הזה כולל ייעול של ההגדרה כדי לוודא שרק קוד חיוני נשמר, וגם מיצוי הפוטנציאל המלא של יכולות האופטימיזציה של R8.
אופטימיזציה של כללים שנכללים בכללים אחרים
- אפשר למצוא את כללי השמירה שכוללים כללים אחרים באמצעות הכלי R8 Configuration Analyzer.
- מזהים את המחלקות, השדות או השיטות המדויקים בבסיס הקוד שבאמת מסתמכים על רפלקציה, וצריך לשמור אותם באמצעות כללי שמירה. המידע הזה יעזור לכם לשפר את כללי השמירה.
- בעזרת כלי הניתוח של ההגדרות, אפשר להשוות את ההשפעה של כל כלל שמטרגט את אותם מחלקות, שדות או שיטות. אפשר להשתמש באחוז האופטימיזציה שנמנע על ידי כל כלל שמירה כדי לזהות איזה כלל שמירה רחב ואיזה כלל שמירה צר.
- אם הכלל המצומצם כתוב בצורה מדויקת – הוא כולל רק את החברים או הסוגים המדויקים שאליהם מתבצעת גישה רפלקטיבית – צריך להסיר את כלל השמירה הרחב יותר. כך אפשר להפעיל בבטחה אופטימיזציות של R8 בשאר החבילה.
- אם הכלל הרחב מטפל בכיתות הנכונות, משאירים את הכלל הרחב ומוחקים את הכלל המצומצם. הכלל המצומצם הוא רק עומס מיותר. חשוב להקפיד לצמצם את הכלל הרחב כדי לטרגט רק מחלקות, שדות או שיטות שזיהיתם.
מאמתים ובודקים את השינויים: מריצים מחדש את כלי הניתוח של ההגדרות כדי לוודא שהבעיה נפתרה. לאחר מכן, קמפלו גרסת build להפצה ובדקו את השינויים כדי לוודא שבסיס הקוד פועל כמצופה.
הסרת כללים מיותרים
באמצעות כלי ניתוח ההגדרות, אתם יכולים לבצע ביקורת שיטתית על בסיס הקוד כדי לזהות ולמחוק כללי שמירה שהתיישנו ומעמיסים על ההגדרה. כלי ניתוח ההגדרות של R8 מדגיש במיוחד שני מקורות עיקריים לכללים מיותרים:
- כללים שלא בשימוש: כללים שתואמים לאפס מחלקות, שיטות או שדות ב-build הנוכחי. הן לרוב נשארות גם אחרי שינוי מבנה הקוד, הסרת תלות או העתקה והדבקה של הגדרות שכבר לא רלוונטיות, וכך מוסיפות מורכבות מיותר להגדרות.
- כללים זהים: כללים זהים לשמירה הם כללים שמטרגטים את אותם מחלקות, שדות ושיטות, או הצהרות כפולות של כלל שמירה באותו קובץ של כלל שמירה או בקבצים שונים.
שני סוגי הכללים האלה מוסיפים עומס להגדרות, ולכן קשה יותר לתחזק אותן ולבצע בהן ניפוי באגים. זיהוי המשתנים האלה מאפשר לכם לנקות את ההגדרות.