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

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

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

ארכיטקטורת JIT

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

אוסף JIT

הידור של JIT כולל את הפעילויות הבאות:

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

    דימון (daemon) של JIT
    איור 3. מפעילויות דימון (daemon) של JIT.

שירות Google Play הוא דוגמה לשימוש באפליקציות אחרות שפועלות בדומה לספריות משותפות.

תהליך עבודה של JIT

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

הערה: הפקודה הזו שומרת את נתוני הפרופיל המקומיים.