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

זמן ריצה של אנדרואיד (ART) כולל מהדר Just-in-Time (JIT) עם פרופיל קוד שמשפר ללא הרף את הביצועים של יישומי אנדרואיד בזמן שהם פועלים. המהדר JIT משלים את מהדר ה-ahead-of-time (AOT) הנוכחי של ART ומשפר את ביצועי זמן הריצה, חוסך בשטח אחסון ומאיץ עדכוני יישומים ומערכת. זה גם משפר את מהדר AOT על ידי הימנעות מהאטת מערכת במהלך עדכוני יישומים אוטומטיים או הידור מחדש של יישומים במהלך עדכונים דרך האוויר (OTA).

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

ארכיטקטורת JIT

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

קומפילציה של JIT

אוסף JIT כולל את הפעילויות הבאות:

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

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

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

זרימת עבודה של JIT

ארכיטקטורת JIT
איור 4. זרימת נתונים JIT.
  • מידע פרופיל מאוחסן במטמון הקוד ונתון לאיסוף אשפה בלחץ זיכרון.
    • אין ערובה שתמונת מצב שצולמה כשהאפליקציה הייתה ברקע תכיל נתונים מלאים (כלומר, כל מה שהיה JITed).
    • אין ניסיון להבטיח שהכל מתועד (כיוון שזה יכול להשפיע על ביצועי זמן הריצה).
  • השיטות יכולות להיות בשלושה מצבים שונים:
    • פרש (קוד דקס)
    • JIT הידור
    • AOT הידור
    אם קיים גם קוד JIT וגם קוד AOT (למשל עקב ביטול אופטימיזציות חוזרות ונשנות), הקוד JITed עדיף.
  • דרישת הזיכרון להפעלת 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