פרופילים של קובצי אימג' לאתחול

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

קבלת מידע על פרופיל ההפעלה

פרופילים של תמונות אתחול נגזרים מהפרופילים של אפליקציות שמופעלות במהלך תהליכים קריטיים שעוברים משתמשים (CUJ). בהגדרת מכשיר ספציפית, ‏ ART מתעד (כחלק מפרופילי ה-JIT) את השיטות והמחלקות של נתיב המחלקות של אתחול שמשמשות אפליקציות, ואז מתעד את המידע הזה בפרופיל האפליקציה (לדוגמה, /data/misc/profiles/cur/0/com.android.chrome/primary.prof), שבו הוא עובר אינדוקס על ידי קובץ ה-Dalvik EXecutable ‏ (DEX) של נתיב המחלקות של אתחול (ראו פורמט פרופיל ART).

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

כדי לצבור מידע על נתיב המחלקה של אתחול מכל פרופילי האפליקציות האישיים במכשיר, מריצים את הפקודה adb shell cmd package snapshot-profile android. אתם יכולים להשתמש במידע המצטבר כבסיס לעיבוד ולבחירת שיטה או סיווג, בלי לצבור באופן ידני פרופילים אישיים (אבל אתם יכולים לעשות את זה אם תרצו).

פרופיל של קובץ אימג' לאתחול

איור 1. תהליך לקבלת פרופילים של תמונות אתחול

נתוני פרופיל של קובץ אימג' לאתחול

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

  • פרופיל עבור נתיב המחלקה של ההפעלה (frameworks/base/config/boot-image-profile.txt. קובע אילו שיטות מנתיב המחלקה של ההפעלה עוברות אופטימיזציה ואילו מחלקות נכללות בתמונת ההפעלה .art.

  • רשימה של כיתות שנטענו מראש. קובע אילו מחלקות נטענות מראש ב-Zygote.

  • פרופיל לרכיבי השרת של המערכת (frameworks/base/services/art-profile). הפרופיל קובע אילו שיטות משרת המערכת עוברות אופטימיזציה או קומפילציה, איזו מחלקה נכללת בתמונת האתחול .art ואיך קובצי ה-DEX המתאימים מסודרים.

פורמט הפרופיל של ART

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

לדוגמה, כדי להוציא את הפרופיל של תמונת האתחול הגולמית, מריצים את הפקודה הבאה:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

הפלט שמתקבל דומה לזה:

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

בדוגמה שלמעלה:

  • השיטה core-oj.jar מוגדרת בקמפיין com.google.android.ext.services ובקמפיין com.android.systemui. כל רשומה מפרטת את שני החבילות שנעשה בהן שימוש מ-core-oj.jar.

  • בשני התהליכים נעשה שימוש בשיטה עם אינדקס DEX‏ 520, אבל רק בתהליך systemui נעשה שימוש בשיטה עם אינדקס DEX‏ 521. אותו היגיון חל על שאר חלקי הפרופיל (לדוגמה, שיעורי הסטארט-אפ).

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

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

המלצות

כדי לקבל את התוצאות הטובות ביותר, כדאי לפעול לפי ההנחיות הבאות.

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

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

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

הגדרת מכשירים

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

  • אפשרות 1: הגדרה ידנית של מאפיינים (פועלת עד להפעלה מחדש):

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
  • אפשרות 2: שימוש ב-local.prop (ההשפעה היא קבועה עד למחיקת הקובץ). לשם כך:

    1. יוצרים קובץ local.prop עם התוכן:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. מריצים את הפקודות הבאות:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
  • אפשרות 3: משתמשים בהגדרות המכשיר כדי להגדיר את המאפיינים הבאים בצד השרת:

    adb shell device_config put runtime_native_boot profilebootclasspath true
    adb shell device_config put runtime_native_boot profilesystemserver true
    

יצירת פרופילים של תמונות אתחול

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

  1. מגדירים את המכשיר.

    1. מגדירים את המכשיר כמו שמתואר במאמר הגדרת מכשירים.

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

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
    3. מריצים את תרחישי השימוש במכשיר.

  2. מריצים את הפקודה הבאה כדי ללכוד את הפרופיל:

    adb shell cmd package snapshot-profile android
  3. מחזירים את הפרופיל באמצעות הפקודה הבאה:

    adb pull /data/misc/profman/android.prof
  4. כדי לנווט לקובצי ה-JAR של נתיב המחלקה של האתחול, משתמשים בפקודות הבאות:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. מריצים את הפקודה profman הבאה כדי ליצור את פרופיל תמונת האתחול.

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
  6. בעזרת נתונים, משנים את הפקודה profman באמצעות דגלי הסף הזמינים לבחירה.

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    הרשימה המלאה זמינה profmanבדף העזרה או בקוד המקור.