איך Reddit השתמש בכלי האופטימיזציה R8 כדי לשפר את הביצועים באופן משמעותי
משך הקריאה: 4 דקות
בעולם של היום, שבו האפליקציות לנייד הן במרכז הבמה, חוויית משתמש חלקה היא לא רק תכונה – היא הכרח. זמני טעינה ארוכים, ממשקים שלא מגיבים וחוסר יציבות יכולים להיות מכשולים משמעותיים למעורבות המשתמשים ולשימור שלהם. במהלך העבודה עם צוות יחסי המפתחים של Android, צוות ההנדסה ב-Reddit השתמש בציון הביצועים של האפליקציה כדי להעריך את האפליקציה. אחרי הערכת הביצועים, הם זיהו פוטנציאל שיפור משמעותי והחליטו לבצע את השלבים להפעלת מלוא היכולות של R8, הכלי לאופטימיזציה של אפליקציות ל-Android. היוזמה הממוקדת הזו הובילה לשיפורים משמעותיים בזמני ההפעלה, לצמצום של פריימים איטיים או קפואים ושגיאות ANR, ולעלייה כללית בדירוגים בחנות Play. במקרה לדוגמה הזה מפורט איך Reddit השיגה את התוצאות המרשימות האלה.
איך כלי האופטימיזציה R8 עזר ל-Reddit
כלי האופטימיזציה R8 הוא כלי בסיסי לאופטימיזציה של הביצועים ב-Android. יש כמה שלבים לשיפור הביצועים של האפליקציה.נסקור בקצרה את השלבים שהכי משפיעים על הביצועים.
- Tree shaking הוא השלב הכי חשוב להקטנת הגודל של האפליקציה. כאן, קוד שלא בשימוש מהתלויות של האפליקציה ומהאפליקציה עצמה מוסר.
- הטמעה של שיטות מחליפה קריאות לשיטות בקוד בפועל, וכך משפרת את הביצועים של האפליקציה.
- מיזוג כיתות ואסטרטגיות אחרות מיושמות כדי שהקוד יהיה קומפקטי יותר. בשלב הזה כבר לא מדובר בקוד מקור שקריא לבני אדם, אלא בקוד שעבר קומפילציה ופועל במהירות. לכן, הפשטות כמו ממשקים או היררכיות של מחלקות לא חשובות כאן ויוסרו.
- הקטנת מזהים משנה את השמות של מחלקות, שדות ושיטות לשמות קצרים יותר וחסרי משמעות. לכן, במקום
MyDataModelיכול להיות שתיווצר כיתה בשם a. - כיווץ מקורות המידע מסיר מקורות מידע שלא נעשה בהם שימוש, כמו קובצי XML ופריטים גרפיים שניתנים להזזה, כדי להקטין עוד יותר את גודל האפליקציה.
השלבים העיקריים באופטימיזציה של R8
מנתונים קשים לשביעות רצון המשתמשים: זיהוי הצלחה בסביבת הייצור
ב-Reddit נהנו מתוצאות ביצועים משופרות מיד אחרי השקת גרסה חדשה של האפליקציה למשתמשים. בעזרת Android Vitals ו-Crashlytics, הצליחו ב-Reddit לתעד מדדי ביצועים במכשירים אמיתיים עם משתמשים בפועל, וכך להשוות את הגרסה החדשה לגרסאות קודמות.
איך R8 שיפר את ביצועי האפליקציה של Reddit
הצוות הבחין בהפעלה מהירה יותר ב-40% במצב התחלתי (cold start), בירידה של 30% בשגיאות מסוג 'האפליקציה לא מגיבה' (ANR), בשיפור של 25% בעיבוד של פריימים ובירידה של 14% בגודל האפליקציה.
השיפורים האלה חיוניים לשביעות רצון המשתמשים. הפעלה מהירה יותר פירושה פחות זמן המתנה וגישה מהירה יותר לתוכן. פחות ANR מובילים לאפליקציה יציבה ואמינה יותר, ומפחיתים את התסכול של המשתמשים. רינדור חלק יותר של פריימים מסיר את הבעיה של קפיצות בממשק המשתמש, כך שהגלילה והאנימציות מרגישות חלקות ורספונסיביות. ההשפעה הטכנית החיובית הזו הייתה ניכרת גם בדעות של המשתמשים.
מדדי שביעות רצון המשתמשים שמעידים על הצלחת האופטימיזציה היו גלויים ישירות בחנות Google Play. אחרי ההשקה של הגרסה שעברה אופטימיזציה ל-R8, הצוות הבחין בשינוי דרמטי וחיובי בדעות של המשתמשים ובמעורבות שלהם.
Drew Heavner: "הפעלת מיקסום הפוטנציאל של הכלי R8 Optimizer תוך פחות משבועיים"
הדבר המרשים ביותר הוא שההישג הזה הושג באמצעות מאמץ ממוקד. דרו הֶוְנֶר (Drew Heavner), מהנדס תוכנה בכיר ב-Reddit שעבד על היוזמה הזו, ציין שהטמעת השינויים כדי לממש את הפוטנציאל המלא של R8 ארכה פחות משבועיים.
אישור השיפורים: ניתוח מעמיק באמצעות מדדי ביצועים מאקרו
אחרי שצוות ההנדסה של Reddit וצוות יחסי המפתחים של Android ב-Google ראו את השיפורים המשמעותיים בעולם האמיתי, הם ערכו בדיקות השוואה מפורטות כדי לאשר את השיפורים באופן מדעי ולנסות לבצע אופטימיזציות נוספות. לצורך הניתוח הזה, צוות ההנדסה של Reddit סיפק שתי גרסאות של האפליקציה: אחת ללא אופטימיזציות ואחת עם R8 ועוד שני כלי אופטימיזציה בסיסיים לשיפור הביצועים: פרופילים של Baseline ופרופילים להפעלה.
פרופילים של Baseline מעבירים ביעילות את שלבי ההידור Just in Time (JIT) ממכשירי המשתמשים למכונות של המפתחים. הוכח שהקוד המהודר שנוצר מראש (AOT) מפחית את זמן ההפעלה ואת בעיות העיבוד.
כשיוצרים חבילת אפליקציה, הכלי d8 dexer לוקח מחלקות ושיטות ובונה את קובצי ה-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) וירידה של שליש בזמן ההידור בזמן אמת. שיפרנו את עיבוד המסגרות, וכתוצאה מכך עובדו 19% יותר מסגרות במהלך התהליך שעובר המשתמש בהשוואה לנקודת ההשוואה. בסופו של דבר, גודל האפליקציה הוקטן ביותר משליש.
שיפורים כלליים בביצועים של Reddit
אפשר למדוד את זמן ההידור של JIT באמצעות מדד מותאם אישית של קטע מעקב של Macrobenchmark, כמו זה:
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")הפעלת הטכנולוגיה שמאחורי הטרנספורמציה: R8
כדי להפעיל את R8 במצב מלא, מגדירים את הקובץ app/build.gradle.kts על ידי הגדרת minifyEnabled ו-shrinkResources ל-true בסוג ה-build של גרסת 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 לאופטימיזציה.
-
Case StudiesMonzo הוא בנק דיגיטלי בבריטניה עם 15 מיליון לקוחות, והמספרים ממשיכים לגדול. כשהאפליקציה גדלה, צוות ההנדסה זיהה שזמן ההפעלה של האפליקציה הוא תחום קריטי לשיפור, אבל חשש שיידרשו שינויים משמעותיים בבסיס הקוד.
Ben Weiss, Tracy Agyemang • משך הקריאה: 2 דקות -
Case Studiesהצוות יצר בסיס קוד של ממשק משתמש מבוסס-AI, שהוא קטן ב-50% מההטמעה המקורית, ובו בזמן השיג קיצור של 35% בזמן הביצוע של סוכן ה-AI, 32% פחות אינטראקציות בין מהנדס לסוכן וחיסכון של 33% בעלות האסימונים.
Pavlo Stavytskyi, Rebecca Franks • משך הקריאה: 11 דקות -
Case Studiesוואטסאפ היא פלטפורמת המסרים הגדולה בעולם, עם מיליארדי משתמשים ברחבי העולם. זהו כלי התקשורת שברירת המחדל שלו היא הצפנה מקצה לקצה, והוא מאפשר לאנשים באזורים שונים לתקשר ביניהם בצורה פרטית, אמינה ומאובטחת.
Niharika Arora, Tracy Agyemang, Mayank Jain • משך הקריאה: 8 דקות
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?