הגדר את ART

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

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

איך ART עובד

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

  1. אפליקציה מותקנת בתחילה עם קובץ dex metadata ( .dm ) המופץ על ידי Play Store, המכיל פרופיל ענן. ART AOT-מרכיב את השיטות המפורטות בפרופיל הענן. לחלופין, אם היישום מותקן ללא קובץ מטא נתונים של dex, לא מבוצע הידור AOT.
  2. בפעמים הראשונות שהאפליקציה פועלת, מתפרשות שיטות שאינן הידור AOT. בין השיטות המתפרשות, אלה שמבוצעות לעתים קרובות מבוצעות לאחר מכן הידור של JIT. ART מייצר פרופיל מקומי על סמך הביצוע ומשלב אותו עם פרופיל הענן (אם קיים).
  3. כאשר המכשיר לא פעיל ונטען, דמון הידור פועל להידור מחדש של האפליקציה בהתבסס על הפרופיל המשולב שנוצר במהלך הריצות הראשונות.
  4. בריצות הבאות של היישום, ART משתמש בחפצים שנוצרו על ידי דמון ההידור, המכילים יותר קוד מהידור AOT, בהשוואה לאלו שנוצרו במהלך שיטות שאינן הידור של AOT עדיין מתפרשות או הידור של JIT. ART מעדכנת את התקנת הפרופיל, בהתבסס על הביצוע, ולאחר מכן הפרופיל ייקלט על ידי ריצות עוקבות של דמון ההידור.

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

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

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

ישנן שתי קטגוריות של אפשרויות אוסף עבור ART:

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

מסנני קומפיילר

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

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

תצורת מערכת ROM

ספריות ואפליקציות מותקנות מראש עוברות קומפילציה של AOT כאשר נבנית תמונת מערכת. תהליך זה נקרא dexpreopt . קבצי קומפילציה כאלה ניתנים לשימוש כל עוד כל התלות נשארות ללא שינוי, במיוחד מסלול ה-boot class.

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

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

  • קוד אתחול classpath: הידור עם מסנן המהדר speed-profile כברירת מחדל.
  • קוד שרת המערכת (ראה PRODUCT_SYSTEM_SERVER_JARS , PRODUCT_APEX_SYSTEM_SERVER_JARS , PRODUCT_STANDALONE_SYSTEM_SERVER_JARS , PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS בהמשך מסמך זה):
    • (אנדרואיד 14 ומעלה) מורכב עם מסנן מהדר פרופיל speed-profile כברירת מחדל, או הידור עם מסנן מהדר speed אם לא מסופק פרופיל.
    • (אנדרואיד 13 ומטה) מורכב עם מסנן מהדר speed כברירת מחדל.
    ניתן להגדרה באמצעות PRODUCT_SYSTEM_SERVER_COMPILER_FILTER (ראה בהמשך מסמך זה).
  • אפליקציות ליבה ספציפיות למוצר (ראה PRODUCT_DEXPREOPT_SPEED_APPS בהמשך מסמך זה): הידור עם מסנן המהדר speed כברירת מחדל.
  • כל שאר האפליקציות: הידור עם מסנן המהדר של speed-profile כברירת מחדל, או הידור עם מסנן המהדר verify אם לא מסופק פרופיל.

    ניתן להגדרה באמצעות PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (ראה בהמשך מסמך זה).

אפשרויות Makefile

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

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

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

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (מאז Android 8 MR1)
  • הפעלת WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY מבצעת dexpreopt רק של מסלול האתחול וצנצנות שרת המערכת.

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

    LOCAL_DEX_PREOPT תומך בערכים true או false כדי להפעיל או להשבית dexpreopt, בהתאמה. בנוסף, ניתן לציין nostripping אם dexpreopt לא אמור להסיר את קובץ classes.dex מקובץ ה-APK או JAR. בדרך כלל הקובץ הזה מופשט מכיוון שהוא כבר לא נחוץ לאחר dexpreopt, אבל האפשרות האחרונה הזו נחוצה כדי לאפשר לחתימות 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 (מאז Android 8)
  • רשימת אפליקציות שזוהו כליבה למוצרים ורצוי להידור עם מסנן מהדר speed . לדוגמה, יישומים מתמשכים כגון SystemUI מקבלים הזדמנות להשתמש בהידור מונחה פרופיל רק באתחול הבא, אז אולי עדיף שהאפליקציות האלה יהיו תמיד מהידור של AOT.

  • PRODUCT_SYSTEM_SERVER_APPS (מאז Android 8)
  • רשימת אפליקציות שנטענות על ידי שרת המערכת. אפליקציות אלה מורכבות כברירת מחדל עם מסנן מהדר speed .

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

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

  • WITH_DEXPREOPT_PIC (עד אנדרואיד 7)
  • באנדרואיד 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 7 MR1)
  • אפשרות זו הוחלפה ב- WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY שגם בוחר מראש את ה-JARs של שרת המערכת.

  • PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
  • אפשרות זו מציינת את מסנן המהדר עבור שרת המערכת.

    • (אנדרואיד 14 ומעלה) אם לא צוין, נעשה שימוש במסנן המהדר speed-profile , או במסנן המהדר speed אם לא מסופק פרופיל.
    • (אנדרואיד 13 ומטה) אם לא צוין, נעשה שימוש במסנן מהדר speed .
    • אם מוגדר speed , נעשה שימוש במסנן מהדר speed .
    • אם מוגדר ל- speed-profile , נעשה שימוש במסנן המהדר של speed-profile , או בשימוש במסנן verify של המהדר אם לא מסופק פרופיל.
    • אם מוגדר verify , נעשה שימוש במסנן המהדר verify .

  • PRODUCT_SYSTEM_SERVER_JARS , PRODUCT_APEX_SYSTEM_SERVER_JARS , PRODUCT_STANDALONE_SYSTEM_SERVER_JARS , PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS
  • להלן רשימות של JARs הנטענים על ידי שרת המערכת. ה-JARs מורכבים עם מסנן המהדר שצוין על ידי PRODUCT_SYSTEM_SERVER_COMPILER_FILTER

    • (נדרש) PRODUCT_SYSTEM_SERVER_JARS : רשימה של JARs classpath של שרת המערכת בפלטפורמה (כלומר, כחלק מ- SYSTEMSERVERCLASSPATH ). נדרשת הוספת JARs classpath של שרת המערכת לרשימה זו. כשלון בהוספת JARs classpath של שרת המערכת לרשימה מביא לכך ש-JARs אלה לא נטענים.
    • (נדרש) PRODUCT_APEX_SYSTEM_SERVER_JARS : רשימה של JARs classpath של שרת המערכת שנמסרו עם APEX (כלומר, כחלק מ- SYSTEMSERVERCLASSPATH ). הפורמט הוא <apex name>:<jar name> . נדרשת הוספת JARs classpath של שרת APEX לרשימה זו. כישלון בהוספת JARs classpath של שרת APEX לרשימה זו גורמת לכך שה-JAR לא נטענים.
    • (אופציונלי, אנדרואיד 13 ומטה) PRODUCT_STANDALONE_SYSTEM_SERVER_JARS : רשימת JARs ששרת המערכת נטען באופן דינמי באמצעות מעמיסי כיתות נפרדים (דרך SystemServiceManager.startServiceFromJar ). הוספת JAR של שרת מערכת עצמאית לרשימה זו אינה נדרשת אך מומלצת בחום מכיוון שהיא הופכת את ה-JAR לקומפילציה ולכן יש להם ביצועי זמן ריצה טובים.
    • (נדרש, מאז Android 13) PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS : רשימת JARs המסופקים עם APEX ששרת המערכת נטען באופן דינמי באמצעות מעמיסים נפרדים (כלומר, דרך SystemServiceManager.startServiceFromJar או מוכרזים כ <apex-system-service> -service> ). הפורמט הוא <apex name>:<jar name> . נדרשת הוספת JAR של שרתי מערכת APEX עצמאיים לרשימה זו. אי הוספת JARs של שרת APEX עצמאיים לרשימה זו גורמת לכישלון אתחול.

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

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

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

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

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

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

    אפשרויות JIT

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

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

    אפשרויות Dex2oat

    אפשרויות אלה משפיעות על הידור במכשיר (aka, dexopt ), וכמה מהן משפיעות גם על dexpreopt, בעוד שהאפשרויות שנידונו בסעיף תצורת מערכת ROM לעיל משפיעות רק על dexpreopt.

    אפשרויות לשלוט בשימוש במשאבים:

    • dalvik.vm.image-dex2oat-threads / dalvik.vm.image-dex2oat-cpu-set (עד אנדרואיד 11): מספר השרשורים וקבוצת ליבות המעבד (ראה להלן) לשימוש עבור תמונות אתחול.
    • dalvik.vm.boot-dex2oat-threads / dalvik.vm.boot-dex2oat-cpu-set :
      • (עד אנדרואיד 11) מספר השרשורים וקבוצת ליבות המעבד (ראה להלן) לשימוש במהלך זמן האתחול עבור כל דבר מלבד תמונות אתחול.
      • (מאז אנדרואיד 12) מספר השרשורים וקבוצת ליבות המעבד (ראה להלן) לשימוש במהלך זמן האתחול לכל דבר, כולל תמונות אתחול.
        • באופן ספציפי, מאז Android 14, זה מתאים למחלקת העדיפות PRIORITY_BOOT ב-ART Service.
    • dalvik.vm.restore-dex2oat-threads / dalvik.vm.restore-dex2oat-cpu-set :
      • (מאז אנדרואיד 11, עד אנדרואיד 13) מספר השרשורים וקבוצת ליבות המעבד (ראה להלן) לשימוש לשחזור מגיבוי ענן.
      • (מאז אנדרואיד 14) מספר השרשורים וקבוצת ליבות ה-CPU (ראה להלן) לשימוש עבור כל מה שרגיש יותר לאחביון מהרגיל, כולל שחזור מגיבוי בענן.
        • באופן ספציפי, זה מתאים למחלקת העדיפות PRIORITY_INTERACTIVE_FAST בשירות ART.
    • dalvik.vm.background-dex2oat-threads / dalvik.vm.background-dex2oat-cpu-set (מאז אנדרואיד 14): מספר השרשורים וקבוצת ליבות המעבד (ראה להלן) לשימוש ברקע.
      • באופן ספציפי, זה מתאים למחלקת העדיפות PRIORITY_BACKGROUND ב-ART Service.
    • dalvik.vm.dex2oat-threads / dalvik.vm.dex2oat-cpu-set : מספר השרשורים וקבוצת ליבות המעבד לשימוש עבור כל השאר.

    יש לציין קבוצה של ליבות CPU כרשימה מופרדת בפסיקים של מזהי CPU. לדוגמה כדי להפעיל על dex2oat על ליבות CPU 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
    

    בנוסף למאפייני המערכת שלמעלה, אתה יכול גם להשתמש בפרופילי משימות כדי לשלוט בשימוש במשאבים של dex2oat (ראה שכבת Cgroup Abstraction Layer ).

    פרופילי משימות נתמכים הם:

    • Dex2OatBackground (מאז Android 14) (כברירת מחדל יורש את Dex2OatBootComplete ): שולט במשאבים לשימוש ברקע.
      • באופן ספציפי, זה מתאים למחלקת העדיפות PRIORITY_BACKGROUND ב-ART Service.
    • Dex2OatBootComplete :
      • (עד אנדרואיד 13) שולט במשאב לשימוש לכל דבר לאחר האתחול.
      • (מאז אנדרואיד 14) שולט במשאב לשימוש לכל דבר לאחר האתחול ולא ברקע.
        • באופן ספציפי, זה מתאים למחלקות העדיפות PRIORITY_INTERACTIVE_FAST ו- PRIORITY_INTERACTIVE ב-ART Service.

    כאשר מצוינים גם מאפייני מערכת וגם פרופילי משימות, שניהם נכנסים לתוקף.

    אפשרויות לשליטה בגודל הערימה:

    • dalvik.vm.image-dex2oat-Xms : גודל ערימה ראשונית עבור תמונות אתחול.
    • dalvik.vm.image-dex2oat-Xmx : גודל ערימה מקסימלי עבור תמונות אתחול.
    • dalvik.vm.dex2oat-Xms : גודל ערימה ראשוני עבור כל השאר.
    • dalvik.vm.dex2oat-Xmx : גודל ערימה מקסימלי עבור כל השאר.

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

    אפשרויות לשלוט במסנן המהדר:

    • dalvik.vm.image-dex2oat-filter (עד אנדרואיד 11): מסנן המהדר לתמונות אתחול. מאז אנדרואיד 12, מסנן המהדר לתמונות האתחול הוא תמיד speed-profile ולא ניתן לשנותו.
    • dalvik.vm.systemservercompilerfilter (מאז Android 13): מסנן המהדר לשרת המערכת. ראה PRODUCT_SYSTEM_SERVER_COMPILER_FILTER .
    • dalvik.vm.systemuicompilerfilter (מאז Android 13): מסנן המהדר לחבילת ממשק המשתמש של המערכת.
    • dalvik.vm.dex2oat-filter (עד אנדרואיד 6): מסנן המהדר לכל השאר.
    • pm.dexopt.<reason> (מאז Android 7): מסנן המהדר לכל השאר. ראה תצורת שירות ART עבור Android 14 ומעלה, או תצורת מנהל החבילות עבור Android 13 ומטה.

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

    • dalvik.vm.dex2oat-very-large (מאז אנדרואיד 7.1): גודל קובץ dex מינימלי בבתים כדי להשבית את הידור AOT.
    • dalvik.vm.dex2oat-swap (מאז Android 7.1) (ברירת מחדל: true): מאפשר שימוש בקובץ swap עבור dex2oat. זה יכול לעזור למנוע קריסות מחוץ לזיכרון. שימו לב שגם אם אפשרות זו מופעלת, dex2oat ישתמש בקובץ swap רק בתנאים מסוימים, כגון כאשר מספר קבצי ה-dex גדול, והתנאים עשויים להשתנות.
    • dalvik.vm.ps-min-first-save-ms (מאז Android 12): הזמן המינימלי להמתנה לפני שזמן הריצה יוצר פרופיל של האפליקציה, בפעם הראשונה שהאפליקציה מופעלת.
    • dalvik.vm.ps-min-save-period-ms (מאז Android 12): הזמן המינימלי להמתנה לפני עדכון פרופיל האפליקציה.
    • dalvik.vm.dex2oat64.enabled (מאז Android 11) (ברירת מחדל: false): האם להשתמש בגרסת 64 סיביות של dex2oat.
    • dalvik.vm.bgdexopt.new-classes-percent (מאז Android 12) (ברירת מחדל: 20): האחוז המינימלי, בין 0 ל-100, של מחלקות חדשות בפרופיל כדי להפעיל הידור מחדש. חל רק על קומפילציה מונחית פרופיל ( speed-profile ), בדרך כלל במהלך ניקוי רקע. שימו לב שיש גם סף של לפחות 50 מחלקות חדשות בנוסף לסף האחוז, וזה לא ניתן להגדרה.
    • dalvik.vm.bgdexopt.new-methods-percent (מאז Android 12) (ברירת מחדל: 20): האחוז המינימלי, בין 0 ל-100, של שיטות חדשות בפרופיל להפעלת הידור מחדש. חל רק על קומפילציה מונחית פרופיל ( speed-profile ), בדרך כלל במהלך ניקוי רקע. שימו לב שיש גם סף של לפחות 100 שיטות חדשות בנוסף לסף האחוז, וזה לא ניתן להגדרה.
    • dalvik.vm.dex2oat-max-image-block-size (מאז Android 10) (ברירת מחדל: 524288) גודל בלוק מוצק מקסימלי עבור תמונות דחוסות. תמונה גדולה מפוצלת לקבוצה של בלוקים מוצקים כך שאף בלוק לא גדול מהגודל המרבי.
    • dalvik.vm.dex2oat-resolve-startup-strings (מאז אנדרואיד 10) (ברירת מחדל: true) אם true, גורם ל-dex2oat לפתור את כל המחרוזות של const שאליהם מתייחסים משיטות המסומנות כ"אתחול" בפרופיל.
    • debug.generate-debug-info (ברירת מחדל: false) האם ליצור או לא מידע על ניפוי באגים עבור ניפוי שגיאות מקורי, כגון מידע על פירוק מחסנית, סמלי ELF וקטעי גמד.
    • dalvik.vm.dex2oat-minidebuginfo (מאז אנדרואיד 9) (ברירת מחדל: true) האם ליצור כמות מינימלית של מידע ניפוי באגים דחוס LZMA הדרוש להדפסת עקבות לאחור.

    אפשרויות שירות ART

    מאז אנדרואיד 14, אוסף AOT במכשיר עבור אפליקציות (המכונה dexopt) מטופל על ידי ART Service. למידע על הגדרת שירות ART, ראה תצורת שירות ART .

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

    לפני אנדרואיד 14, הידור AOT במכשיר עבור אפליקציות (המכונה dexopt) מטופל על ידי מנהל החבילות. למידע על הגדרת מנהל החבילות עבור dexopt, ראה תצורת מנהל החבילות .

    תצורה ספציפית ל-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/%
    

    רקע OTA dexopt

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

    pm.dexopt.ab-ota=speed-profile
    

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

    אפשרויות JDWP

    יצירת שרשור של Java Debug Wire Protocol (JDWP) ב-userdebug builds נשלטת באמצעות מאפיין המערכת persist.debug.dalvik.vm.jdwp.enabled . כברירת מחדל, מאפיין זה אינו מוגדר ושרשורי JDWP נוצרים רק עבור אפליקציות שניתנות לניפוי באגים. כדי להפעיל שרשורי JDWP עבור אפליקציות שניתנות לאיפוי ואפליקציות שאינן ניתנות לתיקון באגים, הגדר את persist.debug.dalvik.vm.jdwp.enabled ל 1 . יש לאתחל את המכשיר כדי שהשינויים בנכס ייכנסו לתוקף.

    כדי לנפות באגים באפליקציה שאינה ניתנת לתיקון באגים ב-userdebug build, הפעל את JDWP על ידי הפעלת הפקודה הבאה:

      adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
      adb reboot
      
    עבור מכשירים עם אנדרואיד 13 ומטה, זמן הריצה יוצר שרשורי JDWP עבור יישומים ניתנים לאיפוי ולא ניתנים לתיקון באגים ב-Userdebug builds. המשמעות היא שאפשר לצרף מאפר באגים או פרופיל כל אפליקציה ב-userdebug builds.