אירועים ותוכניות

שימוש ב-R8 כדי לצמצם, לבצע אופטימיזציה ולהאיץ את האפליקציה

משך הקריאה: 5 דקות
Ben Weiss
מהנדס קשרי מפתחים

שימוש ב-R8 כדי לצמצם, לבצע אופטימיזציה ולהאיץ את האפליקציה

ברוכים הבאים ליום הראשון של שבוע Android Performance Spotlight!

אנחנו מתחילים עם השינוי היחיד שיש לו את ההשפעה הכי גדולה ודורש הכי פחות מאמץ כדי לשפר את הביצועים של האפליקציה: הפעלת הכלי R8 Optimizer במצב מלא.

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

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

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

איך R8 משפר את הביצועים של האפליקציה

image.png

נציג עכשיו את השלבים העיקריים שהכלי R8 Optimizer מבצע כדי לשפר את ביצועי האפליקציה.

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

הטמעה של שיטה מחליפה הפעלת method בקוד בפועל, וכך משפרת את הביצועים בזמן הריצה.

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

הקטנת קוד משמשת לשינוי השמות של מחלקות, שדות ושיטות לשמות קצרים יותר וחסרי משמעות. לכן, במקום MyDataModel יכול להיות שתקבלו כיתה בשם a. זו הסיבה לבלבול הכי גדול כשקוראים עקבות מחסנית מאפליקציה שעברה אופטימיזציה באמצעות R8. (הערה: שיפרנו את זה ב-AGP 9.0!)

כיווץ מקורות המידע מקטין עוד יותר את גודל האפליקציה על ידי הסרת משאבים שלא נמצאים בשימוש, כמו קובצי XML ומשאבים מסוג drawable.

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

מקרה לדוגמה: שיפורי הביצועים של Reddit באמצעות R8

כדוגמה לשיפורים בביצועים ש-R8 יכול להביא, נבחן דוגמה מ-Reddit. אחרי הפעלת R8 במצב מלא, נרשמו שיפורים משמעותיים בביצועים של אפליקציית Reddit ל-Android בתחומים שונים.

image.png

כיתוב: איך R8 שיפר את ביצועי האפליקציה של Reddit

הצוות הבחין בהפעלה מהירה יותר ב-40% במצב התחלתי (cold start), בירידה של 30% במספר השגיאות מסוג 'האפליקציה לא מגיבה' (ANR), בשיפור של 25% בעיבוד הפריימים ובירידה של 14% בגודל האפליקציה.

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

אפשר לקרוא עוד על השיפורים בבלוג שלנו.

תופעות לוואי לא טכניות של שימוש ב-R8

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

image.png

לכן, אפשר לומר שאופטימיזציה מכוונת של הביצועים היא יתרון.

עוזרים לכם לשפר את הביצועים של האפליקציה

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

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

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

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

הפעלת מיקסום הפוטנציאל של הכלי R8 Optimizer

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

android.enableR8.fullMode=false // delete this line to enable R8's full potential

עכשיו בודקים אם הפעלתם את R8 בקובץ build.gradle.kts של האפליקציה עבור גרסת הפרסום. כדי להפעיל את האפשרות הזו, צריך להגדיר את הערכים isMinifyEnabled ו- isShrinkResources כ-true. בשלב הזה אפשר גם להעביר קובצי הגדרה שמוגדרים כברירת מחדל ובהתאמה אישית.

release {

   isMinifyEnabled = true

   isShrinkResources = true

   proguardFiles(

       getDefaultProguardFile("proguard-android-optimize.txt"),

       "keep-rules.pro"

   )

}

מקרה לדוגמה: שיפורים בביצועים של Disney+‎

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

אחרי שהחליפו את proguard-android.txt ב-proguard-android-optimize.txt, צוות Disney+ הבחין בשיפורים משמעותיים בביצועי האפליקציה.

image.png

אחרי שגרסה חדשה של האפליקציה שכוללת את השינוי הזה הושקה למשתמשים, זמן ההפעלה של האפליקציה ב-Disney+ התקצר ב-30% ומספר מקרי ה-ANR שהשפיעו על המשתמשים ירד ב-25%. 

עד היום, אפליקציות רבות עדיין משתמשות בקובץ proguard-android.txt שמכיל את הדגל ‎-dontoptimize. כאן נכנסים לתמונה השיפורים בכלים שלנו.

תמיכה בכלי פיתוח

החל מ-Android Studio Narwhal 3 Feature Drop, תוצג אזהרת lint כשמשתמשים ב-proguard-android.txt 

image.png

החל מ-AGP 9.0, נפסיק לחלוטין את התמיכה בקובץ. המשמעות היא שתצטרכו לעבור אל proguard-android-optimize.txt.

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

השלבים הבאים

מומלץ לצפות בסרטון ההיכרות עם כלי האופטימיזציה R8 ב-YouTube.

📣 רוצים להשתתף באתגר הביצועים?

הגיע הזמן לראות את היתרונות בעצמכם.

אנחנו ממליצים להפעיל את המצב המלא של R8 באפליקציה עוד היום.

  1. כדי להתחיל, אפשר לעיין במדריכים למפתחים: הפעלת אופטימיזציה של אפליקציות.
  2. בודקים אם אתם עדיין משתמשים ב-proguard-android.txt ומחליפים אותו ב-proguard-android-optimize.txt.
  3. לאחר מכן, מודדים את ההשפעה. אל תסתפקו בתחושה של הבדל, בדקו אותו. כדי למדוד את השיפור בביצועים, אפשר להתאים את הקוד מ אפליקציית הדוגמה Macrobenchmark ב-GitHub כדי למדוד את זמני ההפעלה לפני ואחרי.

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

מוזמנים לשאול שאלות בשישי במפגש Ask Android

אם יש לכם שאלות לגבי הביצועים, אתם יכולים להשתמש בתג #AskAndroid ברשתות החברתיות. במהלך השבוע אנחנו עוקבים אחרי השאלות שלכם, וביום שישי, 21 בנובמבר, נשיב על כמה מהן בסשן Ask Android בנושא ביצועים. מחר נפרסם מאמר נוסף שבו נסביר איך לפתור בעיות ולנפות באגים. אבל בינתיים, כדאי להתחיל להשתמש ב-R8 כדי להאיץ את הפיתוח של האפליקציה.

נכתב על ידי:

להמשך הקריאה