הטמעת מהדר של ART בדיוק בזמן

‫Android runtime‏ (ART) כולל מהדר just-in-time‏ (JIT) עם פרופיל קוד, שמשפר באופן מתמשך את הביצועים של אפליקציות ל-Android בזמן שהן פועלות. מהדר ה-JIT משלים את מהדר ה-AOT (Ahead-of-Time) הנוכחי של ART, ומשפר את ביצועי זמן הריצה, חוסך מקום באחסון ומזרז את העדכונים של האפליקציות והמערכת. הוא גם משפר את מהדר ה-AOT בכך שהוא מונע האטה של המערכת במהלך עדכונים אוטומטיים של אפליקציות או קומפילציה מחדש של אפליקציות במהלך עדכונים דרך האוויר (OTA).

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

ארכיטקטורת JIT

ארכיטקטורת JIT
איור 1. ארכיטקטורת JIT.

הידור JIT

הידור JIT כולל את הפעילויות הבאות:

השוואה מונחית על ידי פרופיל
איור 2. הידור מונחה פרופיל.
  1. המשתמש מפעיל את האפליקציה, ואז ART מפעיל את טעינת הקובץ .dex.
    • אם קובץ .oat (הקובץ הבינארי של AOT עבור קובץ .dex ) זמין, ART משתמש בו ישירות. למרות שקובצי .oat נוצרים באופן קבוע, הם לא תמיד מכילים קוד שעבר קומפילציה (קובץ בינארי AOT).
    • אם הקובץ .oat לא מכיל קוד שעבר קומפילציה, מערכת ART מריצה את הקובץ .dex באמצעות JIT והמפרש.
  2. הידור JIT מופעל לכל אפליקציה שלא עברה הידור בהתאם למסנן ההידור speed (שמציין "הידור של כמה שיותר מהאפליקציה").
  3. נתוני הפרופיל של JIT נשמרים בקובץ בספריית מערכת שרק האפליקציה יכולה לגשת אליה.
  4. הדמון של קומפילציית AOT‏ (dex2oat) מנתח את הקובץ הזה כדי להפעיל את הקומפילציה.

    דימון JIT
    איור 3. פעילויות של שד JIT.

שירות Google Play הוא דוגמה לשירות שמשמש אפליקציות אחרות שמתנהגות באופן דומה לספריות משותפות.

תהליך עבודה של JIT

ארכיטקטורת JIT
איור 4. זרימת נתונים JIT.
  • מידע על פרופילים מאוחסן במטמון הקוד ועובר איסוף אשפה כשיש עומס על הזיכרון.
    • אין ערובה לכך שתמונת מצב שצולמה כשהאפליקציה הייתה ברקע תכיל נתונים מלאים (כלומר, כל מה שעבר קומפילציה מסוג JIT).
    • אין ניסיון לוודא שהכול מוקלט (כי זה עלול להשפיע על הביצועים בזמן הריצה).
  • שיטות יכולות להיות בשלושה מצבים שונים:
    • מפורש (קוד dex)
    • הידור JIT
    • הידור AOT
    אם קיימים גם קוד JIT וגם קוד AOT (למשל, בגלל ביטול אופטימיזציה חוזר), קוד JIT מקבל עדיפות.
  • דרישת הזיכרון להפעלת JIT בלי להשפיע על הביצועים של אפליקציה שפועלת בחזית תלויה באפליקציה הרלוונטית. אפליקציות גדולות דורשות יותר זיכרון מאפליקציות קטנות. באופן כללי, אפליקציות גדולות מתייצבות סביב 4MB.

הפעלת רישום ביומן של JIT

כדי להפעיל את הרישום ביומן JIT, מריצים את הפקודות הבאות:

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

השבתת JIT

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

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start

אילוץ קומפילציה

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

adb shell cmd package compile

תרחישים נפוצים שבהם כדאי להשתמש באפשרות 'הידור בכפייה של חבילה ספציפית':

  • על בסיס פרופיל:
    adb shell cmd package compile -m speed-profile -f my-package
    
  • מלאה:
    adb shell cmd package compile -m speed -f my-package
    

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

  • על בסיס פרופיל:
    adb shell cmd package compile -m speed-profile -f -a
    
  • מלאה:
    adb shell cmd package compile -m speed -f -a
    

ניקוי נתוני הפרופיל

ב-Android מגרסה 13 ומטה

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

adb shell pm compile --reset 

ב-Android מגרסה 14 ואילך

כדי למחוק רק את נתוני הפרופיל המקומיים:

adb shell pm art clear-app-profiles 

הערה: בניגוד לפקודה ל-Android 13 או לגרסאות קודמות, הפקודה הזו לא מוחקת נתונים של פרופילים חיצוניים (‎.dm) שמותקנים עם האפליקציה.

כדי לנקות את נתוני הפרופיל המקומיים ולהסיר קוד מהודר שנוצר מנתוני פרופיל מקומיים (כלומר, כדי לאפס למצב ההתקנה), מריצים את הפקודה הבאה:

adb shell pm compile --reset 

הערה: הפקודה הזו לא מסירה קוד שעבר קומפילציה ונוצר מנתוני פרופיל חיצוניים (‎.dm) שמותקנים עם האפליקציה.

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

adb shell cmd package compile -m verify -f 

הערה: הפקודה הזו שומרת את נתוני הפרופיל המקומיים.