Android runtime (ART) כולל קומפילטור בזמן אמת (JIT) עם פרופיל קוד, שמאפשר לשפר באופן שוטף את הביצועים של אפליקציות Android בזמן הריצה שלהן. מרכז ההידור של JIT משלים את מרכז ההידור הנוכחי של ART (AOT), ומשפר את הביצועים בסביבת זמן הריצה, חוסך מקום באחסון ומאיץ את עדכוני האפליקציות והמערכת. הוא גם משפר את המהדר של AOT על ידי הימנעות מהאטה של המערכת במהלך עדכונים אוטומטיים של אפליקציות או מהדרה מחדש של אפליקציות במהלך עדכונים אוויריים (OTA).
למרות שב-JIT וב-AOT נעשה שימוש באותו מהדר עם קבוצה דומה של אופטימיזציות, יכול להיות שהקוד שנוצר לא יהיה זהה. ב-JIT נעשה שימוש במידע על סוגים בסביבת זמן הריצה, אפשר לבצע הטמעה בקוד טובה יותר ואפשר לבצע הידור בזמן ריצה (OSR), והכל יוצר קוד שונה במקצת.
ארכיטקטורת JIT
הידור JIT
הידור JIT כולל את הפעילויות הבאות:
- המשתמש מפעיל את האפליקציה, וכתוצאה מכך ART מפעיל את טעינת הקובץ
.dex
.- אם קובץ
.oat
(קובץ הבינארי של AOT לקובץ.dex
) זמין, ART משתמש בו ישירות. קובצי.oat
נוצרים באופן קבוע, אבל לא תמיד הם מכילים קוד שעבר הידור (בינארי ב-AOT). - אם הקובץ
.oat
לא מכיל קוד שעבר הידור, ART יריץ את הפקודה JIT ואת רכיב התרגום כדי להריץ את הקובץ.dex
.
- אם קובץ
- הידור JIT מופעל בכל אפליקציה שלא עוברת הידור בהתאם למסנן ההידור
speed
(שמשמעותו 'לעבד כמה שיותר מהאפליקציה'). - נתוני פרופיל ה-JIT מושלכים לקובץ בספריית מערכת שרק לאפליקציה יש גישה אליה.
- הדימון של הידור ה-AOT (
dex2oat
) מנתח את הקובץ הזה כדי להפעיל את הידור ה-AOT.
איור 3. פעילויות של דימון JIT.
שירות Google Play הוא דוגמה לשימוש באפליקציות אחרות שמתנהגות באופן דומה לספריות משותפות.
תהליך עבודה של JIT
- פרטי הפרופיל מאוחסנים במטמון הקוד, ועוברים איסוף גרוטאות אם יש לחץ על הזיכרון.
- אין ערובה שצילום המסך שצולם כשהאפליקציה הייתה ברקע יכיל נתונים מלאים (כלומר, כל מה שעבר עיבוד בזמן אמת).
- אין ניסיון לוודא שכל מה שקורה מתועד (כי זה עלול להשפיע על הביצועים בזמן הריצה).
- שיטות יכולות להיות בשלוש סטטוסים שונים:
- מפורש (קוד DEX)
- בוצע הידור של JIT
- הידור AOT
- דרישת הזיכרון להפעלת JIT בלי להשפיע על ביצועי האפליקציה שבחזית תלויה באפליקציה הרלוונטית. אפליקציות גדולות דורשות יותר זיכרון מאפליקציות קטנות. באופן כללי, אפליקציות גדולות מתאזנות סביב 4MB.
הפעלת רישום ביומן של 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
הערה: הפקודה הזו שומרת את נתוני הפרופיל המקומיים.