סביבת זמן ריצה ל-Android ו-Dalvik

Android runtime‏ (ART) הוא סביבת זמן ריצה מנוהלת שמשמשת אפליקציות וחלק משירותי המערכת ב-Android. ART והקודם שלו, Dalvik, נוצרו במקור במיוחד לפרויקט Android. ART כזמן ריצה שמריץ את הפורמט של קובץ ההפעלה של Dalvik‏ (DEX) ואת מפרט הבייטקוד של DEX.

ART ו-Dalvik הן סביבות זמן ריצה תואמות שמריצות בייטקוד של DEX, כך שאפליקציות שפותחו עבור Dalvik אמורות לפעול כשהן מופעלות ב-ART. עם זאת, יש שיטות שפועלות ב-Dalvik ולא פועלות ב-ART. למידע על הבעיות החשובות ביותר, ראו אימות התנהגות האפליקציה בסביבת זמן הריצה של Android‏ (ART).

תכונות של ART

ריכזנו כאן כמה מהתכונות העיקריות ש-ART מטמיע.

הידור מראש (AOT)

ב-ART יש תמיכה בתכנות מראש (AOT), שיכולה לשפר את ביצועי האפליקציות. ב-ART יש גם אימות הדוק יותר בזמן ההתקנה בהשוואה ל-Dalvik.

בזמן ההתקנה, ART מקמפל אפליקציות באמצעות הכלי dex2oat במכשיר. הכלי הזה מקבל קובצי DEX כקלט ויוצר קובץ הפעלה של אפליקציה שעבר הידור למכשיר היעד. הכלי אמור להיות מסוגל לקבץ את כל קובצי ה-DEX התקינים ללא קושי. עם זאת, חלק מכלי העיבוד לאחר העיבוד יוצרים קבצים לא חוקיים שמערכת Dalvik עשויה לסבול מהם, אבל מערכת ART לא יכולה לקמפל אותם. מידע נוסף זמין במאמר פתרון בעיות של איסוף אשפה.

איסוף אשפה משופר

איסוף אשפה (GC) צורך הרבה משאבים, ויכול לפגוע בביצועים של האפליקציה, וכתוצאה מכך להוביל לתצוגה לא חלקה, לתגובה איטית של ממשק המשתמש ולבעיות אחרות. ‏ART משפר את איסוף האשפה בכמה דרכים:

  • עיצוב בעיקר בו-זמני עם השהיה אחת של GC
  • העתקה בו-זמנית כדי לצמצם את השימוש בזיכרון הרקע ואת הפיצול
  • משך ההשהיה של GC לא תלוי בגודל האשפה
  • אגרגטור עם זמן GC כולל קצר יותר למקרה המיוחד של ניקוי אובייקטים לטווח קצר שהוקצו לאחרונה
  • שיפור הארגונומיה של איסוף האשפה, שמאפשרת לבצע איסוף אשפה בו-זמנית בזמן המתאים, וכתוצאה מכך אירועי GC_FOR_ALLOC נדירים מאוד בתרחישי שימוש רגילים

שיפורים בפיתוח ובניפוי באגים

ל-ART יש כמה תכונות שמשפרות את פיתוח האפליקציות ואת ניפוי הבאגים.

תמיכה ב-sampling profiler

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

ב-ART נוספת תמיכה בפרופילר דגימה ייעודי שאין בו את המגבלות האלה. כך אפשר לקבל תמונה מדויקת יותר של הביצועים של האפליקציה בלי האטה משמעותית. תמיכה במדגם נוספה ל-Traceview עבור Dalvik במהדורת KitKat.

תמיכה בתכונות נוספות לניפוי באגים

ב-ART יש תמיכה במספר אפשרויות חדשות לניפוי באגים, במיוחד בפונקציות שקשורות למעקב ולאיסוף אשפה. לדוגמה, אתם יכולים:

  • הצגת המנעולים שנשמרים בנתוני מעקב ה-stack, ואז מעבר לשרשור שמחזיק את המנעול.
  • אפשר לשאול כמה יש מכונות פעילות של סוג נתון, לבקש לראות את המכונות ולבדוק אילו הפניות שומרות על אובייקט פעיל.
  • סינון אירועים (כמו נקודת עצירה) למכונה ספציפית.
  • הצגת הערך שהשיטה מחזירה כשהיא יוצאת (באמצעות אירועי method-exit).
  • הגדרת נקודת מעקב בשדה כדי להשעות את ביצוע התוכנית כשמתבצעת גישה לשדה ספציפי ו/או שינוי בו.

פרטי אבחון משופרים בחריגות ובדוחות קריסה

כשמתרחשות חריגות בסביבת זמן הריצה, ART מספק כמה שיותר הקשר ופרטי מידע. שעון ארגנטינה (ART) מספק פרטים מורחבים על החרגות עבור java.lang.ClassCastException,‏java.lang.ClassNotFoundException ו-java.lang.NullPointerException. (בגרסאות מאוחרות יותר של Dalvik נוספו פרטים מורחבים של חריגות ל-java.lang.ArrayIndexOutOfBoundsException ול-java.lang.ArrayStoreException, שכוללים עכשיו את גודל המערך ואת ההיסט מחוץ לטווח, וגם ב-ART יש את הפרטים האלה).

לדוגמה, עכשיו ב-java.lang.NullPointerException מוצג מידע על מה שהאפליקציה ניסתה לעשות עם מצביע null, כמו השדה שאליו האפליקציה ניסתה לכתוב או השיטה שהיא ניסתה להפעיל. כמה דוגמאות טיפוסיות:

java.lang.NullPointerException: Attempt to write to field 'int
android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object
reference
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object reference

בנוסף, ART מספק מידע משופר על ההקשר בדוחות קריסה נייטיב של אפליקציות, על ידי הכללת מידע על סטאק ביצוע של Java וגם על סטאק ביצוע נייטיב.

דיווח על בעיות

אם נתקלת בבעיות שלא נובעות מבעיות JNI באפליקציה, עליך לדווח עליהן דרך Android Open Source Project Issue Tracker. מוסיפים adb bugreport וקישור לאפליקציה בחנות Google Play, אם היא זמינה. אחרת, אם אפשר, אפשר לצרף קובץ APK שבו הבעיה מתרחשת.