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

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

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

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

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

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

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

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

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

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

image.png

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

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

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

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

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

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

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

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

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

image.png

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

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

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

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

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

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

image.png

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

הדרכה לשיפור ביצועי האפליקציה

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

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

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

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

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

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

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

עכשיו בודקים אם הפעלתם את R8 בקובץ build.gradle.kts של האפליקציה לגרסת ה-release. כדי להפעיל את התכונה, מגדירים את 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

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

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

תמיכה בכלים

החל מהשקת התכונות ב-Android Studio Narwhal 3, תופיע אזהרת lint כשמשתמשים ב-proguard-android.txt 

image.png

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

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

השלבים הבאים

כדאי לצפות בסרטון Performance Spotlight Week introduction to the R8 optimizer ב-YouTube.

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

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

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

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

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

יש לכם שאלות? בואו לשאול אותן בסשן Ask Android ביום שישי

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

כותב/ת המסמך:
להמשך קריאה