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

‫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 כולל בפרופיל גם את classpath של האתחול ואת קובצי ה-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בדף העזרה או בקוד המקור.