סקירה כללית של פרופילים בסיסיים

פרופילים בסיסיים משפרים את מהירות ביצוע הקוד בכ-30% מהפעלה הראשונה, על ידי הימנעות משלב הפרשנות ומשלבי ההידור בדיוק בזמן (JIT) של נתיבים של קוד שכלולים.

כששולחים פרופיל בסיס באפליקציה או בספרייה, Android Runtime‏ (ART) יכול לבצע אופטימיזציה של נתיבים ספציפיים של קוד באמצעות הידור מראש (AOT), וכך לשפר את הביצועים לכל משתמש חדש וכל עדכון לאפליקציה. האופטימיזציה מבוססת-הפרופיל (PGO) מאפשרת לאפליקציות לבצע אופטימיזציה של ההפעלה, לצמצם את התנודות בזמן האינטראקציה ולשפר את הביצועים הכוללים בסביבת זמן הריצה למשתמשים כבר מהפעלה הראשונה.

שיפורי הביצועים האלה משפיעים ישירות על מדדים עסקיים כמו שימור משתמשים, עסקאות ודירוגים. תוכלו לקרוא מידע נוסף על האופן שבו הביצועים משפיעים על מדדי העסק בסיפורים של Josh,‏ Lyft,‏ TikTok ו-Zomato.

היתרונות של פרופילים Baseline

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

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

כשלא משתמשים בפרופיל בסיס, כל קוד האפליקציה עובר הידור בזמן ריצה (JIT) בזיכרון אחרי שהוא מתורגם, או נכתב לקובץ odex ברקע כשהמכשיר לא פעיל. אחרי התקנה או עדכון של אפליקציה, המשתמשים נהנים מחוויית משתמש לא אופטימלית מהפעם הראשונה שהם מפעילים אותה, עד שהנתיבים החדשים בקוד עוברים אופטימיזציה. באפליקציות רבות נמדדים שיפורים בביצועים של כ-30% לאחר ביצוע אופטימיזציה.

פרופילים של סטארט-אפים

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

שנתחיל?

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

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

  • פלאגין Android Gradle: com.android.tools.build:8.0.0
  • ספריית Macrobenchmark: androidx.benchmark:benchmark-macro-junit4:1.3.3
  • מנהל ההתקנה של הפרופיל: androidx.profileinstaller:profileinstaller:1.4.1

מומלץ להשתמש בגרסה העדכנית ביותר של AGP כדי ליצור ולנהל פרופילים בסיסיים. ריכזנו כאן את הפונקציות העיקריות שמגיעות עם גרסאות שונות של AGP:

גרסת AGP תכונות
8.4 התקנות מקומיות של אפליקציות בגרסאות build שלא ניתן לנפות באגים בהן באמצעות כלי שורת הפקודה של Gradle wrapper או באמצעות פרופיל בסיס להתקנה ב-Android Studio, כדי שהביצועים של גרסת build המהדורה המקומית יהיו דומים יותר לאלה של גרסת הייצור. העדכון הזה לא משפיע על הביצועים בסביבת הייצור של פרופילים בסיסיים.
8.3
  • תמיכה מלאה בספריות של קבצים של קבוצות מקורות (מודולים של ספריות): אפשר להצהיר על כמה קובצי מקור של פרופיל בסיס ולהשתמש בספריות שתומכות בוריאנטים, כמו src/free/generated/baselineProfiles/baseline-prof1.txt, גם במודולים של ספריות וגם במודולים של אפליקציות.
  • פרופילי Baseline כוללים כיתות ללא סוכר.
8.2
  • כתיבה מחדש של כללים ב-R8: D8 ו-R8 יכולים לשנות את הכללים של Baseline ושל Startup Profile שקריאים לבני אדם, כדי לתעד באופן מלא את כל הכללים שדרושים לכם כדי לבצע אופטימיזציה של ביצועי האפליקציה. הוספת השיטות האלה מגדילה את הכיסוי של פרופיל הבסיס בכ-30% ומגבירה את ביצועי האפליקציה בכ-15%.
  • פרופילים של סטארט-אפים: אפשר ליצור את הסוג החדש הזה של פרופיל בסיס כדי להגדיר את הפריסה של הקוד ב-DEX. שיפור של כ-15% בביצועים בזמן ההפעלה, או שיפור משמעותי יותר באפליקציות גדולות.
8.0 גרסה מומלצת מינימלית: שימוש בפלאגין Baseline Profile Gradle כדי ליצור פרופילים בסיסיים באמצעות משימה יחידה ב-Gradle.
  • תמיכה מלאה בספריות של קבוצות מקורות (מודולים של אפליקציות): הכרזה על כמה קובצי מקור של פרופיל בסיס, ושימוש בספריות שמותאמות לוריאנטים, כמו src/free/generated/baselineProfiles/baseline-prof1.txt.
7.4 גרסה מינימלית נתמכת: אפליקציות יכולות לצרוך פרופילים בסיסיים מספריות, ולספק פרופיל בסיסי משלהם בקובץ src/main/baseline-prof.txt.
  • פרופילים בסיסיים נארזים בצורה נכונה כשמפתחים את קובץ ה-APK מ-App Bundle (בעיה מס' 230361284).
  • באפליקציות עם יותר מקובץ .dex אחד, פרופילי Baseline ארוזים בצורה נכונה בקובץ .dex הראשי.

דוגמה ליצירת פרופיל

לפניכם דוגמה לכיתה ליצירת פרופיל בסיס להפעלת האפליקציה, וגם כמה אירועי ניווט וגלילה באמצעות הספרייה המומלצת Macrobenchmark:

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

אפשר לראות את הקוד הזה בהקשר המלא ובפרטים נוספים בדוגמאות לביצועים ב-GitHub.

הפרטים שצריך לכלול

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

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

ספריות יכולות לספק פרופילים בסיסיים משלהם ולשלוח אותם עם גרסאות כדי לשפר את ביצועי האפליקציה. לדוגמה, ראו את הקטע שימוש בפרופיל בסיס לבדיקת הביצועים של Jetpack Compose.

איך פועלים פרופילים Baseline

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

  1. כללי הפרופיל שניתנים לקריאה על ידי בני אדם נוצרים עבור האפליקציה שלכם ומועברים לפורמט בינארי באפליקציה. אפשר למצוא אותם בקובץ assets/dexopt/baseline.prof. לאחר מכן תוכלו להעלות את קובץ ה-AAB ל-Google Play כרגיל.

  2. מערכת Google Play מעבדת את הפרופיל ושולחת אותו ישירות למשתמשים יחד עם קובץ ה-APK. במהלך ההתקנה, ART מבצע הידור AOT של השיטות בפרופיל, וכתוצאה מכך השיטות האלה פועלות מהר יותר. אם הפרופיל מכיל שיטות שנעשה בהן שימוש בהפעלת האפליקציה או במהלך רינדור המסגרות, ייתכן שהמשתמשים ייהנו מזמני הפעלה מהירים יותר ומתנודות פחות חדות.

  3. התהליך הזה פועל בשילוב עם צבירת הנתונים של Cloud Profiles כדי לשפר את הביצועים על סמך השימוש בפועל באפליקציה לאורך זמן.

איור 1. בתרשים הזה מוצג תהליך העבודה של פרופיל הבסיס מהעלאה ועד להעברה למשתמש הקצה, ואיך תהליך העבודה הזה קשור לפרופילים ב-Cloud.

Cloud Profiles

Cloud Profiles מציע צורה נוספת של PGO – שמצטבר על ידי Google Play Store ומופץ לצורך הידור בזמן ההתקנה – יחד עם Baseline Profiles.

פרופילי Cloud מבוססים על אינטראקציות של משתמשים עם האפליקציה בעולם האמיתי, אבל הם מופצים רק אחרי כמה שעות או ימים ממועד העדכון, ולכן הזמינות שלהם מוגבלת. עד שהפרופילים יפורסמו באופן מלא, ביצועי האפליקציות לא יהיו אופטימליים למשתמשים באפליקציות חדשות או באפליקציות מעודכנות. בנוסף, Cloud Profiles תומך רק במכשירי Android עם Android 9 ואילך (רמת API 28 ואילך), והוא מתאים רק לאפליקציות עם בסיס משתמשים גדול מספיק.

התנהגות הידור בגרסאות שונות של Android

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

גרסת Android שיטת הידור הגישה לאופטימיזציה
5 עד 6 (רמת API 21 עד 23) AOT מלא האפליקציה כולה עוברת אופטימיזציה במהלך ההתקנה, וכתוצאה מכך זמן ההמתנה לשימוש באפליקציה ארוך יותר, יש שימוש מוגבר ב-RAM ובמקום בדיסק, וזמן הטעינה של הקוד מהדיסק ארוך יותר, מה שעלול להגדיל את זמני ההפעלה מחדש.
7 עד 8.1 (רמת API 24 עד 27) AOT חלקי (פרופיל Baseline) androidx.profileinstaller מתקין את פרופילי הבסיס בהפעלה הראשונה, כשהתלות הזו מוגדרת על ידי מודול האפליקציה. אפשר לשפר את הביצועים של ART עוד יותר על ידי הוספת כללי פרופיל נוספים במהלך השימוש באפליקציה, ותרגום אותם כשהמכשיר לא פעיל. כך אפשר לבצע אופטימיזציה של שטח הדיסק וזמן הטעינה של הקוד מהדיסק, וכך לקצר את זמן ההמתנה של האפליקציה.
9 (רמת API 28) ואילך AOT חלקי (Baseline +‏ Cloud Profile) במהלך התקנת האפליקציות, מערכת Play משתמשת בפרופילים בסיסיים כדי לבצע אופטימיזציה של פרופיל ה-APK ושל פרופיל Cloud – אם הם זמינים. אחרי ההתקנה, פרופילי ה-ART מועלים ל-Play, נצברים ולאחר מכן מוצגים כפרופילים ב-Cloud למשתמשים אחרים כשהם מתקינים או מעדכנים את האפליקציה.

בעיות מוכרות

בהמשך מפורטות בעיות ופתרונות אפשריים, או בעיות שאנחנו מפתחים דרכים לעקיפתן:

  • יצירת פרופיל בסיס עשויה להיכשל בגלל הגדרות ההרשאות במכשירים מסוימים, כולל מכשירי OnePlus. כדי לעקוף את הבעיה, משביתים את האפשרות השבתה של מעקב ההרשאות בהגדרות של אפשרויות למפתחים.

  • אי אפשר ליצור פרופיל בסיס במכשירי Firebase Test Lab, כולל במכשירי Test Lab בניהול Gradle‏ (בעיה מס' 285187547).

  • כדי לספק פרופילים בסיסיים לספריות, צריך להשתמש ב-Baseline Profile Gradle plugin 1.2.3 או ב-AGP 8.3 לפחות (בעיה מס' 313992099).

  • אם יוצרים פרופילים בסיסיים באמצעות הפקודה ./gradlew app:generateBaselineProfile, גם אמות המידה במודול הבדיקה מופעלות והתוצאות מושמטות. במקרה כזה, תוכלו ליצור רק את הפרופילים הבסיסיים על ידי הפעלת הפקודה עם -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. הבעיה תוקנה ב-AGP 8.2.

  • הפקודה ליצירת פרופילי Baseline לכל סוגי ה-build – ./gradlew app:generateBaselineProfile – יוצרת רק פרופילי Baseline לסוג ה-build של הגרסה המהדורה. הבעיה תוקנה ב-AGP 8.1.

  • יכול להיות שערוצי הפצה של אפליקציות שאינם חנות Google Play לא יתמכו בשימוש בפרופילים בסיסיים בזמן ההתקנה. משתמשים באפליקציות שהותקנו דרך הערוצים האלה לא יראו את היתרונות עד שתתבצע פעולת dexopt ברקע – סביר להניח שהיא תתבצע במהלך הלילה.

  • שיתוף פנימי של אפליקציות בחנות Play לא תומך בפרופילים בסיסיים, אבל מסלול הבדיקה הפנימית כן תומך בהם.

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

מקורות מידע נוספים