זמן ריצה של אנדרואיד (ART) כולל מהדר Just-in-Time (JIT) עם פרופיל קוד שמשפר ללא הרף את הביצועים של יישומי אנדרואיד בזמן שהם פועלים. המהדר JIT משלים את מהדר ה-ahead-of-time (AOT) הנוכחי של ART ומשפר את ביצועי זמן הריצה, חוסך בשטח אחסון ומאיץ עדכוני יישומים ומערכת. זה גם משפר את מהדר AOT על ידי הימנעות מהאטת מערכת במהלך עדכוני יישומים אוטומטיים או הידור מחדש של יישומים במהלך עדכונים דרך האוויר (OTA).
למרות ש-JIT ו-AOT משתמשים באותו מהדר עם קבוצה דומה של אופטימיזציות, ייתכן שהקוד שנוצר לא יהיה זהה. JIT עושה שימוש במידע מסוג זמן ריצה, יכול לבצע שילוב טוב יותר, ומאפשר קומפילציה על מחסנית (OSR), אשר כל אלה מייצרים קוד שונה במקצת.
ארכיטקטורת JIT
קומפילציה של JIT
אוסף JIT כולל את הפעילויות הבאות:
- המשתמש מריץ את האפליקציה, אשר לאחר מכן מפעילה את ART לטעון את קובץ
.dex
.- אם קובץ ה-
.oat
(הבינארי AOT עבור קובץ.dex
) זמין, ART משתמש בו ישירות. למרות שקובצי.oat
נוצרים באופן קבוע, הם לא תמיד מכילים קוד קומפילד (AOT binary). - אם קובץ ה-
.oat
אינו מכיל קוד מהידור, ART רץ דרך JIT והמתורגמן כדי להפעיל את קובץ ה-.dex
.
- אם קובץ ה-
- JIT מופעל עבור כל אפליקציה שאינה מורכבת לפי מסנן הידור
speed
(שאומר "הידור כמה שיותר מהאפליקציה"). - נתוני פרופיל JIT נזרקים לקובץ בספריית מערכת שרק האפליקציה יכולה לגשת אליה.
- הדמון של קומפילציה AOT (
dex2oat
) מנתח את הקובץ הזה כדי להניע את ההידור שלו.איור 3. פעילויות דמון JIT.
שירות Google Play הוא דוגמה המשמשת יישומים אחרים שמתנהגים בדומה לספריות משותפות.
זרימת עבודה של JIT
- מידע פרופיל מאוחסן במטמון הקוד ונתון לאיסוף אשפה בלחץ זיכרון.
- אין ערובה שתמונת מצב שצולמה כשהאפליקציה הייתה ברקע תכיל נתונים מלאים (כלומר, כל מה שהיה JITed).
- אין ניסיון להבטיח שהכל מתועד (כיוון שזה יכול להשפיע על ביצועי זמן הריצה).
- השיטות יכולות להיות בשלושה מצבים שונים:
- פרש (קוד דקס)
- JIT הידור
- AOT הידור
- דרישת הזיכרון להפעלת JIT מבלי להשפיע על ביצועי האפליקציה בחזית תלויה באפליקציה המדוברת. אפליקציות גדולות דורשות יותר זיכרון מאפליקציות קטנות. באופן כללי, אפליקציות גדולות מתייצבות סביב 4 MB.
הפעל את רישום 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
נקה את נתוני הפרופיל
באנדרואיד 13 ומעלה
כדי לנקות נתוני פרופיל מקומי ולהסיר קוד הידור, הפעל את הפעולות הבאות:
adb shell pm compile --reset
באנדרואיד 14 ואילך
כדי לנקות נתוני פרופיל מקומי בלבד:
adb shell pm art clear-app-profiles
הערה: בניגוד לפקודה עבור אנדרואיד 13 ומעלה, פקודה זו אינה מנקה נתוני פרופיל חיצוניים (`.dm`) המותקנים עם האפליקציה.
כדי לנקות נתוני פרופיל מקומי ולהסיר קוד קומפילציה שנוצר מנתוני פרופיל מקומי (כלומר, כדי לאפס למצב ההתקנה), הפעל את הפעולות הבאות:
adb shell pm compile --reset
הערה: פקודה זו אינה מסירה קוד קומפילציה שנוצר מנתוני פרופיל חיצוניים (`.dm`) המותקן עם האפליקציה.
כדי לנקות את כל הקוד המהודר, הפעל את הפקודה הזו:
adb shell cmd package compile -m verify -f
הערה: פקודה זו שומרת על נתוני פרופיל מקומיים.