מקרים לדוגמה

איך Reddit השתמשה בכלי האופטימיזציה R8 כדי לשפר את הביצועים באופן משמעותי

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

בעולם של היום, שבו אפליקציות לנייד הן חלק בלתי נפרד מהחיים, חוויית משתמש חלקה היא לא רק תכונה – היא הכרח. זמני טעינה ארוכים, ממשקים שלא מגיבים וחוסר יציבות יכולים לפגוע משמעותית ברמת המעורבות של משתמשים ובשימור שלהם. במהלך העבודה עם הצוות של Android Developer Relations, צוות ההנדסה של Reddit השתמש בציון ביצועי האפליקציה כדי להעריך את האפליקציה. אחרי הערכת הביצועים, הם זיהו פוטנציאל משמעותי לשיפור והחליטו לבצע את השלבים להפעלת היכולות המלאות של R8, הכלי לאופטימיזציה של אפליקציות ל-Android. היוזמה הממוקדת הזו הובילה לשיפורים משמעותיים בזמני ההפעלה, לצמצום מספר הפריימים האיטיים או הקפואים ושגיאות ה-ANR, ולעלייה כללית בדירוגים בחנות Play. במקרה לדוגמה הזה מוסבר איך Reddit השיגה את התוצאות המרשימות האלה.

איך כלי האופטימיזציה R8 עזר ל-Reddit

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

  • Tree shaking הוא השלב הכי חשוב בהקטנת גודל האפליקציה. בשלב הזה, קוד שלא נמצא בשימוש ביחסי התלות של האפליקציה ובאפליקציה עצמה מוסר.
  • הטמעת שיטות מחליפה את הפעלות ה-method בקוד עצמו, וכך משפרת את ביצועי האפליקציה.
  • מיזוג מחלקות ושיטות אחרות מיושמות כדי להפוך את הקוד לקומפקטי יותר. בשלב הזה, כבר לא חשוב שקוד המקור יהיה קריא לאנשים, אלא שהקוד המקומפל יפעל מהר. לכן, הפשטות כמו ממשקים או היררכיות של כיתות לא רלוונטיות כאן ויוסרו.
  • הקטנת מזהים משנה את השמות של המחלקות, השדות והמתודות לשמות קצרים יותר וחסרי משמעות. לכן, במקום MyDataModel, יכול להיות שתקבלו כיתה בשם a.
  • כיווץ מקורות המידע מסיר מקורות מידע שלא בשימוש, כמו קובצי XML ורכיבים גרפיים, כדי להקטין עוד יותר את גודל האפליקציה.
image.png

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

מנתונים קשיחים לשביעות רצון של המשתמשים: זיהוי הצלחה בסביבת הייצור

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

image.png

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

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

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

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

image.png

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

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

אישור השיפורים: ניתוח מעמיק באמצעות בדיקות ביצועים ברמת המאקרו

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

פרופילים של Baseline מעבירים ביעילות את שלבי הקימפול של Just in Time ‏ (JIT) ממכשירי המשתמשים למחשבי הפיתוח. הקוד שנוצר באמצעות הידור מראש (AOT) הוכח כמפחית את זמן ההפעלה וגם את בעיות הרינדור.

כשאפליקציה נארזת, ה-dexer של d8 לוקח מחלקות ושיטות ובונה את קובצי ה-classes.dex של האפליקציה. כשמשתמש פותח את האפליקציה, קובצי ה-dex האלה נטענים בזה אחר זה עד שהאפליקציה יכולה להתחיל לפעול. כשאתם מספקים פרופיל הפעלה, אתם מאפשרים ל-d8 לדעת אילו מחלקות ושיטות לארוז בקובצי classes.dex הראשונים. המבנה הזה מאפשר לאפליקציה לטעון פחות קבצים, וכך משפר את מהירות ההפעלה.

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

בסופו של דבר, כל מה שהיה צריך כדי לכתוב את הבדיקה היה:

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

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

image.png

שיפורים בביצועים הכוללים של Reddit

אתם יכולים למדוד את משך הזמן לקימפול JIT באמצעות מדד מותאם אישית של קטע מעקב ב-Macrobenchmark, למשל:

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

הפעלת הטכנולוגיה שמאחורי השינוי: R8

כדי להפעיל את R8 במצב מלא, מגדירים את הקובץ app/build.gradle.kts על ידי הגדרת minifyEnabled ו-shrinkResources לערך true בסוג ה-build להפצה.

android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

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

                "keep-rules.pro",

            )

        }

    }

}

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

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

איך ליישם את הדוגמה של Reddit באפליקציה שלכם

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

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

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

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