הפעלת פרופילים של תמונות

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

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

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

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

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

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

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

הפעלת נתוני הפרופיל של תמונת הפרופיל

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

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

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

  • פרופיל לרכיבי שרת המערכת (frameworks/base/services/art-profile). ההגדרה קובעת אילו methods משרת המערכת יעברו אופטימיזציה או יעברו הידור (compile), איזו מחלקה נכללת בתמונת האתחול .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 בלבד. כדי להשתמש בכל האותות, צריך לשנות את הסקריפטים הזמינים.

המלצות

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

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

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

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

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

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

  • אפשרות 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: משתמשים בהגדרות המכשיר כדי להגדיר את המאפיינים הבאים בצד השרת:

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

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

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

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

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

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

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

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

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

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

    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 או בקוד המקור.