הגדרת ART

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

עיין ב- ART וב-Dalvik , בפורמט Dalvik Executable , ובשאר הדפים ב-source.android.com כדי לעבוד עם ART. ראה אימות התנהגות אפליקציה ב-Android Runtime (ART) כדי להבטיח שהאפליקציות שלך פועלות כהלכה.

איך ART עובד

ART משתמש בהידור מראש (AOT), והחל מ-Android 7.0 (Nougat או N), הוא משתמש בשילוב היברידי של AOT, קומפילציה בדיוק בזמן (JIT) וקומפילציה מונחה פרופיל. השילוב של כל מצבי ההידור הללו ניתן להגדרה ויידונו בסעיף זה. כדוגמה, מכשירי Pixel מוגדרים עם זרימת ההידור הבאה:

  1. יישום מותקן בתחילה ללא כל קומפילציה של AOT. בפעמים הראשונות שהאפליקציה פועלת, היא תתפרש, ושיטות שיבוצעו לעתים קרובות יעברו קומפילציה של JIT.
  2. כאשר המכשיר לא פעיל ונטען, דמון הידור פועל לקוד AOT-קומפילציה בשימוש תכוף על סמך פרופיל שנוצר במהלך הריצות הראשונות.
  3. ההפעלה מחדש הבאה של אפליקציה תשתמש בקוד מונחה הפרופיל ותימנע מביצוע קומפילציה של JIT בזמן ריצה עבור שיטות שכבר הידור. שיטות שמקבלות הידור של JIT במהלך הריצות החדשות יתווספו לפרופיל, שלאחר מכן ייקלט על ידי דמון הקומפילציה.

ART מורכב מהדר (כלי dex2oat ) וזמן ריצה ( libart.so ) שנטען להפעלת ה-Zygote. הכלי dex2oat לוקח קובץ APK ומייצר קובץ חפץ קומפילציה אחד או יותר שזמן הריצה טוען. מספר הקבצים, ההרחבות והשמות שלהם כפופים לשינוי בין מהדורות, אך נכון לגרסה של Android O, הקבצים שנוצרים הם:

  • .vdex : מכיל את קוד ה-DEX הלא דחוס של ה-APK, עם כמה מטא נתונים נוספים כדי להאיץ את האימות.
  • .odex : מכיל קוד הידור AOT עבור שיטות ב-APK.
  • .art (optional) : מכיל ייצוגים פנימיים של ART של כמה מחרוזות ומחלקות המפורטות ב-APK, המשמשים להאצת הפעלת האפליקציה.

אפשרויות קומפילציה

אפשרויות הידור עבור ART הן משתי קטגוריות:

  1. תצורת מערכת ROM: איזה קוד מקבל AOT-קומפילציה בעת בניית תמונת מערכת.
  2. תצורת זמן ריצה: כיצד ART מרכיב ומריץ יישומים במכשיר.

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

  • אימות : הפעל רק אימות קוד DEX.
  • הרץ : הפעל אימות קוד DEX ובצע אופטימיזציה של כמה הוראות DEX כדי לקבל ביצועי מתורגמן טובים יותר.
  • מהירות : הפעל אימות קוד DEX ו-AOT-קומפילציה של כל השיטות.
  • speed-profile : הפעל אימות קוד DEX ושיטות קומפילציה של AOT המפורטות בקובץ פרופיל.

תצורת מערכת ROM

ישנן מספר אפשרויות בנייה זמינות להגדרת ROM של מערכת. אופן התצורה של אפשרויות אלה תלוי בשטח האחסון הזמין עבור /system ובמספר היישומים המותקנים מראש. ניתן לחלק את ה-JARs/APKs המורכבים לתוך ROM מערכת לארבע קטגוריות:

  • קוד אתחול classpath: הידור עם מסנן מהדר המהירות כברירת מחדל.
  • קוד שרת מערכת: הידור עם מסנן מהדר המהירות כברירת מחדל.
  • יישומי ליבה ספציפיים למוצר: הידור עם מסנן מהדר המהירות כברירת מחדל.
  • כל שאר היישומים: הידור עם מסנן המהדר מהיר כברירת מחדל.

אפשרויות Makefile

  • WITH_DEXPREOPT
  • האם dex2oat מופעל על קוד DEX המותקן על תמונת המערכת. מופעל כברירת מחדל.

  • DONT_DEXPREOPT_PREBUILTS (מאז Android L)
  • הפעלת DONT_DEXPREOPT_PREBUILTS מונעת אופטימיזציה מראש של המבנים המוקדמים. אלו הן אפליקציות include $(BUILD_PREBUILT) שצוינו ב- Android.mk שלהם, כגון Gmail. דילוג על אופטימיזציה מוקדמת של אפליקציות מובנות מראש שסביר להניח שיתעדכנו דרך Google Play חוסך /system שטח אך מוסיף לזמן האתחול הראשון.

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (מאז Android 9)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER מציין את מסנן המהדר המוגדר כברירת מחדל עבור יישומים שעברו אופטימיזציה מראש. אלו הן אפליקציות include $(BUILD_PREBUILT) שצוינו ב- Android.mk שלהם, כגון Gmail. אם לא צוין, ערך ברירת המחדל הוא מהיר.

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (חדש באנדרואיד O MR1)
  • הפעלת WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY אופטימיזציה מראש רק למסלול האתחול וצנצנות שרת המערכת.

  • LOCAL_DEX_PREOPT
  • ניתן להפעיל או להשבית אופטימיזציה מראש על בסיס אפליקציה בודדת על ידי ציון האפשרות LOCAL_DEX_PREOPT בהגדרת המודול. זה יכול להיות שימושי להשבית אופטימיזציה מוקדמת של אפליקציות שעשויות לקבל מיד עדכוני Google Play מכיוון שהעדכונים יגרמו לקוד שעבר אופטימיזציה מראש בתמונת המערכת למיושנת. זה שימושי גם כדי לחסוך מקום ב-OTAs שדרוג גרסאות גדולות, מכיוון שלמשתמשים יש כבר גרסאות חדשות יותר של אפליקציות במחיצת הנתונים.

    LOCAL_DEX_PREOPT תומך בערכים 'true' או 'false' כדי להפעיל או להשבית אופטימיזציה מוקדמת, בהתאמה. בנוסף, ניתן לציין 'nostripping' אם אופטימיזציה מוקדמת לא צריכה להסיר את קובץ classes.dex מקובץ ה-APK או JAR. בדרך כלל הקובץ הזה מופשט מכיוון שהוא כבר לא נחוץ לאחר אופטימיזציה מוקדמת, אבל האפשרות האחרונה הזו נחוצה כדי לאפשר לחתימות APK של צד שלישי להישאר תקפות.

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • מעביר אפשרויות ל- dex2oat כדי לשלוט על אופן הידור של תמונת האתחול. ניתן להשתמש בו כדי לציין רשימות מחלקות תמונה מותאמות אישית, רשימות מחלקות הידור ומסנני מהדר.

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • מעביר אפשרויות ל- dex2oat כדי לשלוט על אופן הידור של כל דבר מלבד תמונת האתחול.

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • מספק את היכולת להעביר אפשרויות dex2oat עבור מודול ותצורת מוצר מסוימים. הוא מוגדר בקובץ device.mk של מוצר על ידי $(call add-product-dex-preopt-module-config,<modules>,<option>) כאשר <modules> הוא רשימה של שמות LOCAL_MODULE ו-LOCAL_PACKAGE עבור JAR ו-APK קבצים, בהתאמה.

  • PRODUCT_DEXPREOPT_SPEED_APPS (New in Android O)
  • רשימת יישומים שזוהו כליבה למוצרים ורצוי להידור עם מסנן מהדר המהירות . לדוגמה, יישומים מתמשכים כגון SystemUI מקבלים הזדמנות להשתמש בהידור מונחה פרופיל רק באתחול הבא, כך שייתכן שעדיף שהאפליקציות האלה יהיו תמיד מהידור של AOT.

  • PRODUCT_SYSTEM_SERVER_APPS (New in Android O)
  • רשימת יישומים שנטענים על ידי שרת המערכת. יישומים אלו יקומפלו כברירת מחדל עם מסנן מהדר המהירות .

  • PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD(Post Android O)
  • האם לכלול גרסת ניפוי באגים של ART במכשיר. כברירת מחדל, זה מופעל עבור userdebug ו-eng builds. ניתן לעקוף את ההתנהגות על ידי הגדרה מפורשת של האפשרות ל- true או false .

    כברירת מחדל, המכשיר ישתמש בגרסה ללא ניפוי באגים ( libart.so ). כדי לעבור, הגדר את מאפיין המערכת persist.sys.dalvik.vm.lib.2 ל- libartd.so .

  • WITH_DEXPREOPT_PIC (Removed in Android O)
  • באנדרואיד 5.1.0 עד אנדרואיד 6.0.1, ניתן לציין WITH_DEXPREOPT_PIC כדי לאפשר קוד בלתי תלוי במיקום (PIC). עם זה, אין צורך להעביר קוד הידור מהתמונה מ-/system אל /data/dalvik-cache, מה שחוסך מקום במחיצת הנתונים. עם זאת, יש השפעה קלה על זמן הריצה מכיוון שהיא משביתה אופטימיזציה שמנצלת את הקוד תלוי המיקום. בדרך כלל, מכשירים שרוצים לחסוך מקום ב-/data צריכים לאפשר הידור PIC.

    באנדרואיד 7.0, הידור PIC הופעל כברירת מחדל.

  • WITH_DEXPREOPT_BOOT_IMG_ONLY (הוסר ב-Android O MR1)
  • אפשרות זו הוחלפה ב-WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY שגם בוחר מראש את צנצנות שרת המערכת.

תצורת נתיב אתחול

  • רשימת שיעורים טעונים מראש
  • רשימת המחלקות הטעונות מראש היא רשימה של מחלקות שהזיגוטה מאתחל בעת ההפעלה. זה חוסך מכל אפליקציה את הצורך להפעיל את מאתחול המחלקות הללו בנפרד, מה שמאפשר להם להפעיל מהר יותר ולשתף דפים בזיכרון. קובץ רשימת המחלקות הטעונות מראש נמצא ב- frameworks/base/config/preloaded-classes כברירת מחדל, והוא מכיל רשימה שמכווננת לשימוש רגיל בטלפון. זה עשוי להיות שונה עבור מכשירים אחרים כגון ציוד לביש, ויש לכוון אותו בהתאם. היזהר בעת כוונון זה; הוספת יותר מדי מחלקות מבזבזת זיכרון כאשר מחלקות שאינן בשימוש נטענות. הוספת מעט מדי מחלקות מאלצת כל אפליקציה להיות בעלת עותק משלה, מה ששוב מבזבז זיכרון.

    שימוש לדוגמה (במכשיר.mk של המוצר):

    PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
    

    הערה: יש למקם שורה זו לפני בירושה של קבצי makefile של תצורת מוצר המקבלים את ברירת המחדל מ: build/target/product/base.mk

  • רשימת כיתות תמונה
  • רשימת מחלקות התמונות היא רשימה של מחלקות ש-dex2oat מאתחל מבעוד מועד ומאחסנת בקובץ boot.art. זה מאפשר לזיגוטה לטעון את התוצאות הללו מתוך קובץ boot.art בעת ההפעלה במקום להפעיל את המאתחלים עבור המחלקות הללו בעצמה במהלך טעינה מוקדמת. תכונה מרכזית של זה היא שהדפים שנטענו מהתמונה ומשותפים בין תהליכים יכולים להיות נקיים, מה שמאפשר להחליף אותם בקלות במצבים עם זיכרון נמוך. ב-L, כברירת מחדל, רשימת מחלקות התמונות משתמשת באותה רשימה כמו רשימת המחלקות הטעונות מראש. החל מפוסט-L ב-AOSP, ניתן לציין רשימת מחלקות תמונה מותאמת אישית באמצעות:

    PRODUCT_DEX_PREOPT_BOOT_FLAGS
    

    שימוש לדוגמה (במכשיר. device.mk של המוצר):

    PRODUCT_DEX_PREOPT_BOOT_FLAGS += --image-classes=<filename>
    
  • רשימת כיתות מורכבת
  • ב-post-L AOSP, ניתן לציין תת-קבוצה של מחלקות ממסלול המחלקה האתחול לקומפילציה במהלך האופטימיזציה המוקדמת באמצעות רשימת המחלקות הקומפיליות. זו יכולה להיות אופציה שימושית למכשירים מצומצמים מאוד בשטח ואינם יכולים להתאים לכל תמונת האתחול המותאמת מראש. עם זאת, מחלקות הערה שאינן מצויינות ברשימה זו לא יקומפלו - אפילו לא במכשיר - ויש לפרש אותן, מה שעלול להשפיע על ביצועי זמן הריצה. כברירת מחדל, dex2oat יחפש רשימת מחלקות הידור ב-$OUT/system/etc/compiled-classes, כך שניתן להעתיק מותאמת אישית למיקום זה על ידי ה-device.mk. ניתן לציין מיקום קובץ מסוים גם באמצעות:

    PRODUCT_DEX_PREOPT_BOOT_FLAGS
    

    שימוש לדוגמה (במכשיר. device.mk של המוצר):

    PRODUCT_COPY_FILES += <filename>:system/etc/compiled-classes
    

    הערה: יש למקם שורה זו לפני בירושה של קבצי makefile של תצורת מוצר המקבלים את ברירת המחדל מ: build/target/product/base.mk

תצורת זמן ריצה

אפשרויות ג'יט

האפשרויות הבאות משפיעות על מהדורות אנדרואיד רק כאשר מהדר ART JIT זמין.

  • dalvik.vm.usejit: האם ה-JIT מופעל או לא.
  • dalvik.vm.jitinitialsize (ברירת מחדל 64K): הקיבולת הראשונית של מטמון הקוד. מטמון הקוד יעבור באופן קבוע ויגדל במידת הצורך.
  • dalvik.vm.jitmaxsize (ברירת מחדל 64M): הקיבולת המרבית של מטמון הקוד.
  • dalvik.vm.jitthreshold: (ברירת מחדל 10000) - זהו הסף שמונה ה"חמות" של שיטה צריך לעבור על מנת שהמתודה תהיה הידור JIT. מונה ה"חמות" הוא מדד פנימי לזמן הריצה. זה כולל את מספר השיחות, סניפים לאחור וגורמים אחרים.
  • dalvik.vm.usejitprofiles: האם פרופילי JIT מופעלים או לא; זה עשוי לשמש גם אם dalvik.vm.usejit הוא false. שים לב שאם זה שקרי, פרופיל המהירות של מסנן המהדר אינו מקים AOT שום שיטה והוא שווה ערך ל- quin .
  • dalvik.vm.jitprithreadweight (ברירת המחדל ל-dalvik.vm.jitthreshold / 20) - המשקל של ה"דגימות" של JIT (ראה jitthreshold) עבור שרשור ממשק המשתמש של האפליקציה. השתמש כדי להאיץ את הקומפילציה של שיטות המשפיעות ישירות על חווית המשתמש בעת אינטראקציה עם האפליקציה.
  • dalvik.vm.jittransitionweight: (ברירת המחדל ל-dalvik.vm.jitthreshold / 10) המשקל של הפעלת השיטה שעוברת בין קוד קומפילציה למתורגמן. זה עוזר לוודא שהשיטות המעורבות מורכבות כדי למזער מעברים (שהם יקרים).

אפשרויות מנהל חבילות

מאז אנדרואיד 7.0, יש דרך גנרית לציין את רמת הקומפילציה/אימות שקרה בשלבים שונים. ניתן להגדיר את רמות ההידור באמצעות מאפייני מערכת כאשר ברירת המחדל היא:

  • pm.dexopt.install=speed-profile
  • זהו מסנן הקומפילציה המשמש בעת התקנת אפליקציות דרך Google Play. אנו ממליצים להגדיר את מסנן ההתקנה ל-speed-profile על מנת לאפשר שימוש בפרופילים מקובצי המטא נתונים של dex. שים לב שאם לא מסופק פרופיל או אם הוא ריק, פרופיל המהירות שווה ערך להאצה.

  • pm.dexopt.bg-dexopt=speed-profile
  • זהו מסנן הקומפילציה המשמש כאשר המכשיר אינו פעיל, נטען ונטען במלואו. נסה את מסנן המהדר של פרופיל מהירות כדי לנצל את היתרון של קומפילציה מונחה פרופיל ולחסוך באחסון.

  • pm.dexopt.boot=verify
  • מסנן הקומפילציה בשימוש לאחר עדכון באוויר. אנו ממליצים בחום על מסנן המהדר לאמת אפשרות זו כדי למנוע זמני אתחול ארוכים מאוד.

  • pm.dexopt.first-boot=quicken
  • מסנן ההידור בפעם הראשונה שהמכשיר מאתחל. המסנן המשמש כאן ישפיע רק על זמן האתחול לאחר היצרן. אנו ממליצים להאיץ את המסנן כדי להימנע מפעמים ארוכים לפני שמשתמש ישתמש בטלפון בפעם הראשונה. שים לב שאם כל היישומים ב- /system כבר הידור עם מסנן המהדר מהיר או הידור עם מסנן המהדר של מהירות או פרופיל מהירות , ל- pm.dexopt.first pm.dexopt.first-boot אין השפעה.

אפשרויות Dex2oat

שים לב שאפשרויות אלו משפיעות על dex2oat במהלך הידור במכשיר וכן במהלך אופטימיזציה מוקדמת, בעוד שרוב האפשרויות שנדונו לעיל משפיעות רק על אופטימיזציה מוקדמת.

כדי לשלוט dex2oat בזמן שהוא מרכיב את תמונת האתחול:

  • dalvik.vm.image-dex2oat-Xms: גודל ערימה ראשונית
  • dalvik.vm.image-dex2oat-Xmx: גודל ערימה מקסימלי
  • dalvik.vm.image-dex2oat-filter: אפשרות מסנן מהדר
  • dalvik.vm.image-dex2oat-threads: מספר השרשורים לשימוש

כדי לשלוט dex2oat בזמן שהוא קומפילציה של הכל מלבד תמונת האתחול:

  • dalvik.vm.dex2oat-Xms: גודל ערימה ראשונית
  • dalvik.vm.dex2oat-Xmx: גודל ערימה מקסימלי
  • dalvik.vm.dex2oat-filter: אפשרות מסנן מהדר

במהדורות דרך אנדרואיד 6.0, ניתנת אפשרות אחת נוספת להידור של כל דבר מלבד תמונת האתחול:

  • dalvik.vm.dex2oat-threads: מספר השרשורים לשימוש

החל מאנדרואיד 6.1, זה הופך לשתי אפשרויות נוספות להידור של הכל מלבד תמונת האתחול:

  • dalvik.vm.boot-dex2oat-threads: מספר השרשורים לשימוש בזמן האתחול
  • dalvik.vm.dex2oat-threads: מספר השרשורים לשימוש לאחר זמן האתחול

החל מאנדרואיד 7.1, שתי אפשרויות מסופקות לשליטה על אופן השימוש בזיכרון בעת ​​הידור של כל דבר מלבד תמונת האתחול:

  • dalvik.vm.dex2oat-very-large: מינימום גודל קובץ dex הכולל בבתים כדי להשבית את הידור AOT
  • dalvik.vm.dex2oat-swap: השתמש בקובץ ההחלפה dex2oat (עבור מכשירים עם זיכרון נמוך)

אין לצמצם את האפשרויות השולטות בגודל הערימה הראשוני והמקסימלי עבור dex2oat מכיוון שהן יכולות להגביל את היישומים שניתן להדר.

החל מאנדרואיד 11, שלוש אפשרויות זיקה למעבד מסופקות כדי לאפשר להגביל שרשורי מהדר לקבוצה מסוימת של מעבדים:

  • dalvik.vm.boot-dex2oat-cpu-set: מעבדים המריצים שרשורי dex2oat במהלך זמן האתחול
  • dalvik.vm.image-dex2oat-cpu-set: מעבדים המריצים את dex2oat תוך כדי קומפילציה של תמונת האתחול
  • dalvik.vm.dex2oat-cpu-set: מעבדים מריצים שרשורי dex2oat לאחר זמן האתחול

יש לציין את המעבדים כרשימה מופרדת בפסיקים של מזהי CPU. לדוגמה כדי להפעיל על dex2oat על המעבדים 0-3, הגדר:

dalvik.vm.dex2oat-cpu-set=0,1,2,3

בעת הגדרת מאפייני זיקת ה-CPU, אנו ממליצים להתאים את המאפיין המתאים למספר השרשורים של dex2oat כדי להתאים למספר ה-CPUs שנבחרו כדי למנוע מחלוקת מיותרת על זיכרון ו-I/O:

dalvik.vm.dex2oat-cpu-set=0,1,2,3
dalvik.vm.dex2oat-threads=4

החל מאנדרואיד 12, נוספו האפשרויות הבאות:

  • dalvik.vm.ps-min-first-save-ms: הזמן להמתין לזמן הריצה ליצירת פרופיל של האפליקציה, בפעם הראשונה שהאפליקציה מופעלת
  • dalvik.vm.ps-min-save-period-ms: הזמן המינימלי להמתנה לפני עדכון הפרופיל של אפליקציה
  • dalvik.vm.systemservercompilerfilter: מסנן המהדר שהמכשיר ישתמש בו בעת הידור מחדש של שרת המערכת

תצורה ספציפית ל-A/B

תצורת ROM

החל מ-Android 7.0, מכשירים עשויים להשתמש בשתי מחיצות מערכת כדי לאפשר עדכוני מערכת A/B . כדי לחסוך בגודל מחיצת המערכת, ניתן להתקין את הקבצים שנקבעו מראש במחיצת המערכת השנייה שאינה בשימוש. לאחר מכן הם מועתקים למחיצת הנתונים באתחול הראשון.

שימוש לדוגמה (ב- device-common.mk ):

PRODUCT_PACKAGES += \
     cppreopts.sh
PRODUCT_PROPERTY_OVERRIDES += \
     ro.cp_system_other_odex=1

וב- BoardConfig.mk של המכשיר:

BOARD_USES_SYSTEM_OTHER_ODEX := true

שים לב שקוד אתחול classpath, קוד שרת מערכת ויישומי ליבה ספציפיים למוצר תמיד קומפלים למחיצת המערכת. כברירת מחדל, כל שאר היישומים עוברים קומפילציה למחיצת המערכת השנייה שאינה בשימוש. ניתן לשלוט בכך באמצעות ה- SYSTEM_OTHER_ODEX_FILTER , בעל ערך כברירת מחדל של:

SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%

רקע dexopt OTA

עם התקנים תומכי A/B, ניתן להרכיב יישומים ברקע לעדכון לתמונת המערכת החדשה. ראה הידור אפליקציה ברקע כדי לכלול באופן אופציונלי את סקריפט ההידור והקבצים הבינאריים בתמונת המערכת. מסנן ההידור המשמש להידור זה נשלט באמצעות:

pm.dexopt.ab-ota=speed-profile

אנו ממליצים להשתמש ב- speed-profile כדי לנצל את היתרון של הידור מודרך פרופיל ולחסוך באחסון.