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