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

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

אחזור פרטי פרופיל האתחול

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

בודקים את פרופילי האפליקציות שתועדו במהלך ה-CUJ כדי לקבוע איזה חלק מנתיב הטעינה (boot classpath) הכי נפוץ ואיזה חלק הכי חשוב לבצע בו אופטימיזציה (לדוגמה, ראו פורמט של פרופיל 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). קובע אילו שיטות משרת המערכת יעברו אופטימיזציה או הידור, איזו כיתה תכלול את קובץ האימג' .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) או לשיטות שעשויות להיות פחות נפוצות אבל עדיין חשובות (לדוגמה, שיטות שבהן משתמשת אפליקציית המצלמה).

בפורמט הפרופיל מתווספות הערות פנימיות לכל שיטה עם כמה דגלים (startup, ‏ post-startup, ‏ hotness, ‏ abi), יותר ממה שמוצג בפורמט של dump בלבד. כדי להשתמש בכל האותות, צריך לשנות את הסקריפטים הזמינים.

המלצות

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

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

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

  • צורת הנתונים מרצת של מכשיר יחיד נראית שונה מאוד בהשוואה למכשירי בדיקה שמריצים אירועי 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 או בקוד המקור.