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

שימוש ב-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 ברשתות החברתיות. במהלך השבוע אנחנו עוקבים אחרי השאלות שלכם ונענה על כמה מהן בסשן Ask Android בנושא ביצועים ביום שישי, 21 בנובמבר. מחר נפרסם מאמר נוסף שבו נסביר איך לפתור בעיות ולנפות באגים בצורה מפורטת יותר. אבל בינתיים, כדאי להתחיל להשתמש ב-R8 כדי להאיץ את הפיתוח של האפליקציה.

נכתב על ידי:
להמשך קריאה