זמן ריצה של אנדרואיד (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
נקה את נתוני הפרופיל
כדי לנקות נתוני פרופיל ולהסיר קוד הידור, הפעל את הפעולות הבאות:
- לחבילה אחת:
adb shell cmd package compile --reset my-package
- לכל החבילות:
adb shell cmd package compile --reset -a