בדף הזה נסביר איך להגדיר את סביבת זמן הריצה של Android (ART) ואת אפשרויות הידור שלה. הנושאים שבהם נעסוק כאן כוללים הגדרה של הידור מראש של קובץ האימג' של המערכת, אפשרויות הידור של dex2oat
ואיך למצוא את האיזון בין נפח המחיצה של המערכת, נפח המחיצה של הנתונים והביצועים.
כדי לעבוד עם ART, אפשר לעיין במאמרים ART ו-Dalvik ופורמט קובץ ההפעלה של Dalvik. במאמר אימות התנהגות האפליקציה בסביבת זמן הריצה של Android (ART) מוסבר איך לוודא שהאפליקציות פועלות כמו שצריך.
איך פועל ART
ART משתמש בהידור מראש (AOT), ומתחיל מ-Android 7, הוא משתמש בשילוב היברידי של הידור AOT, הידור בזמן אמת (JIT) ופירוש, וההידור של AOT יכול להיות מונחה-פרופיל. אפשר לשנות את השילוב של כל מצבי הביצוע האלה, ונעסוק בכך בקטע הזה. לדוגמה, מכשירי Pixel מוגדרים לפעול בתהליך הבא:
- האפליקציה מותקנת בהתחלה עם קובץ מטא-נתונים של dex (
.dm
) שמופץ על ידי חנות Play, ומכיל פרופיל בענן. ART AOT-compiles את השיטות שמפורטות בפרופיל בענן. לחלופין, אם האפליקציה מותקנת בלי קובץ מטא-נתונים של dex, לא מתבצעת הידור AOT. - בפעם הראשונה או השנייה שהאפליקציה פועלת, שיטות שלא עברו הידור AOT מתורגמות. מבין השיטות המתורגמות, אלה שמבוצעות בתדירות גבוהה עוברות הידור בזמן ריצה (JIT). ART יוצר פרופיל מקומי על סמך הביצועים ומשלב אותו עם פרופיל הענן (אם יש כזה).
- כשהמכשיר לא פעיל ומחובר לטעינה, דימון הידור פועל כדי לבצע הידור מחדש של האפליקציה על סמך הפרופיל המשולב שנוצר במהלך ההפעלות הראשונות.
- בהפעלות הבאות של האפליקציה, ART משתמש בפריטים שנוצרו על ידי הדימון של הידור, שמכילים יותר קוד שעבר הידור AOT בהשוואה לפריטים שנוצרו במהלך ההפעלה. שיטות שלא עברו הידור AOT עדיין מתורגמות או עוברות הידור JIT. ART מעדכן את התקנת הפרופיל על סמך הביצוע, ולאחר מכן הפרופיל יילקח על ידי הפעלות הבאות של הדימון של הידור.
ART מורכב ממהדר (הכלי dex2oat
) ומסביבת זמן ריצה (libart.so
) שנטענת במהלך האתחול. הכלי dex2oat
מקבל קובץ APK ויוצר קובץ אחד או יותר של פריט מידע שנוצר בתהליך פיתוח (artifact) של הידור, שנטען בסביבת זמן הריצה. מספר הקבצים, הסיומות והשמות שלהם עשויים להשתנות במהלך הגרסאות, אבל החל מגרסה 8 של Android, המערכת יוצרת את הקבצים הבאים:
.vdex
: מכיל מטא-נתונים נוספים כדי לזרז את האימות, לפעמים יחד עם קוד ה-DEX הלא דחוס של ה-APK..odex
: מכיל קוד שעבר הידור AOT לשיטות ב-APK..art (optional)
מכיל ייצוגים פנימיים של ART של מחרוזות וכיתות מסוימות שמפורטות ב-APK, שמשמשים לקיצור זמן ההפעלה של האפליקציה.
אפשרויות הידור
יש שתי קטגוריות של אפשרויות הידור ל-ART:
- הגדרת ROM למערכת: איזה קוד מקובץ על ידי AOT כשמפתחים קובץ אימג' של מערכת.
- הגדרות בסביבת זמן ריצה: האופן שבו ART יוצר ומריץ אפליקציות במכשיר.
מסנני Compiler
אחת מהאפשרויות המרכזיות של ART להגדרת שתי הקטגוריות האלה היא מסנני מהדר. מסנני המהדר קובעים את האופן שבו ART יוצרת קודי DEX, והם אפשרות שמועברת לכלי dex2oat
. החל מגרסה 8 של Android, יש ארבעה מסננים נתמכים באופן רשמי:
verify
: הפעלה של אימות קוד DEX בלבד (ללא הידור AOT).quicken
: (Android 11 ואילך) מפעילה אימות של קוד DEX ומבצעת אופטימיזציה של חלק מההוראות DEX כדי לשפר את הביצועים של המתורגמן.speed
: הפעלת אימות קוד DEX והדרה של כל השיטות באמצעות AOT. לא מתבצעת אופטימיזציה של טעינת הכיתות באף כיתה.speed-profile
: הפעלת אימות של קוד DEX, הידור שיטות שמפורטות בפרופיל באמצעות AOT ואופטימיזציה של טעינת הכיתות של הכיתות בפרופיל.
הגדרת ROM במערכת
ספריות ואפליקציות שהותקנו מראש עוברות הידור AOT במהלך ה-build של קובץ האימג' של המערכת. התהליך הזה נקרא dexpreopt. אפשר להשתמש בקבצים כאלה כל עוד כל יחסי התלות לא משתנים, במיוחד נתיב ה-Classpath של האתחול.
הערה: אם המכשיר מקבל עדכונים של מודול מערכת, סביר מאוד שנתיב ה-classpath של האתחול ישתנה בעדכון הבא, וכתוצאה מכך כל קובצי dexpreopt יהיו לא רלוונטיים ולא ניתנים לשימוש.
יש מספר אפשרויות build של ART שזמינות להגדרת dexpreopt. אופן ההגדרה של האפשרויות האלה תלוי בנפח האחסון הפנוי לתמונת המערכת ובמספר האפליקציות המותקנות מראש. קובצי ה-JAR או ה-APK שמתורגמים ל-ROM של המערכת מתחלקים לארבע קטגוריות:
- קוד של classpath של אתחול: עבר הידור באמצעות מסנן המהדר
speed-profile
כברירת מחדל. - קוד שרת המערכת (ראו
PRODUCT_SYSTEM_SERVER_JARS
,PRODUCT_APEX_SYSTEM_SERVER_JARS
, PRODUCT_STANDALONE_SYSTEM_SERVER_JARS
,PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS
בהמשך המסמך):- (Android 14 ואילך) הידור באמצעות מסנן המהדר
speed-profile
כברירת מחדל, או הידור באמצעות מסנן המהדרspeed
אם לא צוין פרופיל. - (Android מגרסה 13 ומטה) הידור עם מסנן המהדר
speed
כברירת מחדל.
PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
(מפורט בהמשך המסמך). - (Android 14 ואילך) הידור באמצעות מסנן המהדר
- אפליקציות ליבה ספציפיות למוצר (ראו
PRODUCT_DEXPREOPT_SPEED_APPS
בהמשך המסמך): כברירת מחדל, המערכת מקמפלת אותן באמצעות מסנן המהדרspeed
. - כל האפליקציות האחרות: הידור באמצעות מסנן המהדר
speed-profile
כברירת מחדל, או הידור באמצעות מסנן המהדרverify
אם לא צוין פרופיל.אפשר להגדיר אותו באמצעות
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
(מידע נוסף מופיע בהמשך המסמך).
אפשרויות של Makefile
WITH_DEXPREOPT
DONT_DEXPREOPT_PREBUILTS
(Android מגרסה 5 ואילך)PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
(Android מגרסה 9 ואילך)WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
(החל מגרסה MR1 של Android 8)LOCAL_DEX_PREOPT
PRODUCT_DEX_PREOPT_BOOT_FLAGS
PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
PRODUCT_DEX_PREOPT_MODULE_CONFIGS
PRODUCT_DEXPREOPT_SPEED_APPS
(מ-Android 8 ואילך)PRODUCT_SYSTEM_SERVER_APPS
(מ-Android 8 ואילך)PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD
(מ-Android 8 ואילך)WITH_DEXPREOPT_PIC
(עד Android 7)WITH_DEXPREOPT_BOOT_IMG_ONLY
(עד Android 7 MR1)PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
- (Android 14 ואילך) אם לא צוין, ייעשה שימוש במסנן המהדר
speed-profile
, או במסנן המהדרspeed
אם לא צוין פרופיל. - (Android 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
- (חובה)
PRODUCT_SYSTEM_SERVER_JARS
: רשימה של קובצי JAR ב-classpath של שרת המערכת בפלטפורמה (כלומר, כחלק מ-SYSTEMSERVERCLASSPATH
). חובה להוסיף קובצי JAR ב-classpath של שרת המערכת לרשימה הזו. אם לא תוסיפו לרשימה קובצי JAR של נתיב ה-class של שרת המערכת, קובצי ה-JAR האלה לא ייטענו. - (חובה)
PRODUCT_APEX_SYSTEM_SERVER_JARS
: רשימת קובצי JAR של נתיב ה-class של שרת המערכת שסופקו עם APEX (כלומר, כחלק מ-SYSTEMSERVERCLASSPATH
). הפורמט הוא<apex name>:<jar name>
. צריך להוסיף לרשימה הזו קובצי JAR של classpath של שרת המערכת של APEX. אם לא תוסיפו לרשימה הזו קובצי JAR של נתיב ה-class של שרת המערכת של APEX, קובצי ה-JAR האלה לא ייטענו. - (אופציונלי, Android 13 ומטה)
PRODUCT_STANDALONE_SYSTEM_SERVER_JARS
: רשימת קובצי JAR ששרת המערכת טוען באופן דינמי באמצעות מערכי טעינה נפרדים של כיתות (דרךSystemServiceManager.startServiceFromJar
). לא חובה להוסיף לרשימת קובצי ה-JAR של שרת המערכת העצמאיים, אבל מומלץ מאוד לעשות זאת כי כך קובצי ה-JAR יקובצו, וכתוצאה מכך הביצועים שלהם יהיו טובים בסביבת זמן הריצה. - (חובה, החל מ-Android 13)
PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS
: רשימה של קובצי JAR שנשלחים עם APEX ושרת המערכת טוען באופן דינמי באמצעות מערכי טעינה נפרדים של כיתות (כלומר, דרךSystemServiceManager.startServiceFromJar
או שהוגדרו כ-<apex-system-service>
). הפורמט הוא<apex name>:<jar name>
. צריך להוסיף לרשימה הזו קובצי JAR של שרת מערכת APEX עצמאי. אם לא תוסיפו לרשימה הזו קובצי JAR של שרת מערכת APEX עצמאיים, תגרמו לכשל אתחול.
האם dex2oat
מופעל בקוד DEX שמותקן בתמונת המערכת. מופעלת כברירת מחדל.
הפעלת DONT_DEXPREOPT_PREBUILTS
מונעת את ה-dexpreopt של ה-prebuilts. אלה אפליקציות שצוין להן include $(BUILD_PREBUILT)
ב-Android.mk
. דילוג על ה-dexpreopt של אפליקציות מוכנות מראש שסביר להניח יתעדכנו דרך Google Play חוסך מקום בתמונת המערכת, אבל מאריך את זמן האתחול הראשון. חשוב לזכור שהאפשרות הזו לא משפיעה על אפליקציות מוכנות מראש שמוגדרות ב-Android.bp
.
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
מציין את מסנן ברירת המחדל של המהדר לאפליקציות שעברו אופטימיזציה מראש. האפליקציות האלה מוגדרות ב-Android.bp
או שצוין להן include $(BUILD_PREBUILT)
ב-Android.mk
. אם לא מציינים ערך, ערך ברירת המחדל הוא speed-profile
. אם לא מציינים ערך ולא מציינים פרופיל, ערך ברירת המחדל הוא verify
.
הפעלת WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
dexpreopts רק את classpath של האתחול ואת קובצי ה-jar של שרת המערכת.
אפשר גם להפעיל או להשבית את Dexpreopt לכל אפליקציה בנפרד, על ידי ציון האפשרות LOCAL_DEX_PREOPT
בהגדרת המודול.
אפשר להשתמש באפשרות הזו כדי להשבית את dexpreopt של אפליקציות שעשויות לקבל עדכונים מ-Google Play באופן מיידי, כי העדכונים יגרמו לקוד dexpreopt בתמונת המערכת להיות לא רלוונטי. האפשרות הזו שימושית גם כדי לחסוך מקום בשדרוגים OTA של גרסאות גדולות, כי יכול להיות שכבר יש למשתמשים גרסאות חדשות יותר של אפליקציות במחיצה של הנתונים.
LOCAL_DEX_PREOPT
תומך בערכים true
או false
כדי להפעיל או להשבית את dexpreopt, בהתאמה. בנוסף, אפשר לציין את הערך nostripping
אם לא רוצים שהפקודה dexpreopt תסיר את הקובץ classes.dex
מקובץ ה-APK או ה-JAR. בדרך כלל הקובץ הזה מבוטל כי הוא כבר לא נדרש אחרי dexpreopt, אבל האפשרות האחרונה הזו נחוצה כדי לאפשר לחתימות APK של צד שלישי להישאר תקינות.
מעביר אפשרויות אל dex2oat
כדי לקבוע את האופן שבו קובץ האימג' של האתחול יעבור הידור. אפשר להשתמש בה כדי לציין רשימות מותאמות אישית של סיווגים של תמונות, רשימות של סיווגים של כיתות שעבר תהליך הידור ומסננים של מהדרים.
העברת אפשרויות אל dex2oat
כדי לקבוע איך יתבצע הידור של כל מה שאינו קובץ האתחול.
מאפשרת להעביר אפשרויות dex2oat
להגדרה ספציפית של מודול ומוצר. הוא מוגדר בקובץ device.mk
של המוצר על ידי $(call add-product-dex-preopt-module-config,<modules>,<option>)
, כאשר <modules>
היא רשימה של שמות LOCAL_MODULE
ו-LOCAL_PACKAGE
לקובצי JAR ו-APK, בהתאמה.
רשימת האפליקציות שזוהו כמרכזיות למוצרים, ורצוי לבצע להן הידור באמצעות מסנן המהדר speed
. לדוגמה, אפליקציות קבועות כמו SystemUI מקבלות הזדמנות להשתמש בתכנות מבוססת-פרופיל רק בהפעלה מחדש הבאה, לכן יכול להיות שתמיד עדיף לכתוב את האפליקציות האלה בתכנות AOT.
רשימת האפליקציות שנטענות על ידי שרת המערכת. האפליקציות האלה מתורגמות כברירת מחדל באמצעות מסנן המהדר speed
.
האם לכלול במכשיר גרסה של ART לניפוי באגים. כברירת מחדל, ההגדרה הזו מופעלת בגרסאות build של userdebug ו-eng. אפשר לשנות את ההתנהגות על ידי הגדרה מפורשת של האפשרות ל-true
או ל-false
.
כברירת מחדל, המכשיר משתמש בגרסה ללא ניפוי באגים (libart.so
). כדי לעבור, מגדירים את מאפיין המערכת persist.sys.dalvik.vm.lib.2
לערך libartd.so
.
ב-Android מגרסה 5.1.0 ועד 6.0.1, אפשר לציין את WITH_DEXPREOPT_PIC
כדי להפעיל קוד שאינו תלוי מיקום (PIC). כך לא צריך להעביר קוד מהקובץ המאוחזר מ-/system
אל /data/dalvik-cache
, וכך חוסכים מקום במחיצה של הנתונים.
עם זאת, יש השפעה קלה על זמן הריצה כי הפעולה הזו משביתה אופטימיזציה שמנצלת קוד שמבוסס על מיקום. בדרך כלל, במכשירים שרוצים לחסוך מקום ב-/data
צריך להפעיל את הידור ה-PIC.
ב-Android 7.0, הידור PIC הופעל כברירת מחדל.
האפשרות הזו הוחלפה ב-WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
, שמאפשרת גם לבחור מראש את קובצי ה-JAR של שרת המערכת.
האפשרות הזו מציינת את מסנן המהדר בשרת המערכת.
אלה רשימות של קובצי JAR שנטענים על ידי שרת המערכת. קובצי ה-JAR מקובצים באמצעות מסנן המהדר שצוין ב-PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
הגדרת classpath של האתחול
רשימת הכיתות שהועמסו מראש היא רשימה של כיתות ש-Zygote מאתחלת בזמן ההפעלה. כך כל אפליקציה לא צריכה להריץ את מפעילי הכיתות האלה בנפרד, וכך האפליקציות יכולות להתחיל לפעול מהר יותר ולשתף דפים בזיכרון. קובץ רשימת הכיתות שהוטען מראש נמצא ב-frameworks/base/config/preloaded-classes
כברירת מחדל, והוא מכיל רשימה שמותאמת לשימוש טיפוסי בטלפון. יכול להיות שההגדרה הזו תהיה שונה במכשירים אחרים, כמו תכשיטים לבישים, וצריך לשנות אותה בהתאם. חשוב להיזהר כשמשנים את ההגדרה הזו. הוספת יותר מדי כיתות גורמת לבזבוז זיכרון כשכיתות שלא בשימוש נטענות. הוספה של מעט מדי כיתות מחייבת כל אפליקציה לכלול עותק משלה, וכך שוב נוצר בזבוז זיכרון.
דוגמה לשימוש (ב-device.mk
של המוצר):
PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
הערה: צריך להציב את השורה הזו לפני שעוברים בירושה על קובצי make של הגדרות המוצר שמקבלים את קובץ ברירת המחדל מ-build/target/product/base.mk
.
הגדרות זמן ריצה
אפשרויות JIT
האפשרויות הבאות משפיעות על גרסאות Android רק במקומות שבהם מהדר ה-JIT של ART זמין.
dalvik.vm.usejit
: האם ה-JIT מופעל או לא.dalvik.vm.jitinitialsize
(ברירת המחדל היא 64K): הקיבולת הראשונית של מטמון הקוד. מאגר הקוד יבצע פינוי אשפה (GC) באופן קבוע ויגדיל את נפחו לפי הצורך.dalvik.vm.jitmaxsize
(ברירת המחדל היא 64MB): הקיבולת המקסימלית של מטמון הקוד.dalvik.vm.jitthreshold
(ברירת המחדל היא 10000): הסף שספירת ה'פופולריות' של method צריכה לעבור כדי ש-method יתבצע הידור בזמן ריצה (JIT). המונה 'hotness' הוא מדד פנימי בסביבת זמן הריצה. הוא כולל את מספר הקריאות, ההסתעפויות לאחור וגורמים אחרים.dalvik.vm.usejitprofiles
(עד Android 13): האם פרופילי JIT מופעלים. אפשר להשתמש באפשרות הזו גם אם הערך שלdalvik.vm.usejit
הוא false. שימו לב שאם הערך הוא 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
האפשרויות האלה משפיעות על הידור במכשיר (שנקרא גם dexopt), וחלק מהן משפיעות גם על dexpreopt. לעומת זאת, האפשרויות שצוינו בקטע הגדרת ROM המערכת שלמעלה משפיעות רק על dexpreopt.
אפשרויות לשלוט בשימוש במשאבים:
dalvik.vm.image-dex2oat-threads
/dalvik.vm.image-dex2oat-cpu-set
(עד Android 11): מספר השרשור וקבוצת ליבות המעבד (ראו בהמשך) שישמשו בתמונות האתחול.dalvik.vm.boot-dex2oat-threads
/dalvik.vm.boot-dex2oat-cpu-set
:- (עד Android 11) מספר השרשור והקבוצה של ליבות המעבד (ראו בהמשך) שבהם יש להשתמש במהלך האתחול לכל דבר מלבד קובצי אימג' להפעלה.
- (החל מ-Android 12) מספר השרשורות וקבוצת ליבות המעבד (ראו בהמשך) שבהם יש להשתמש במהלך האתחול לכל דבר, כולל קובצי אימג' לאתחול.
- באופן ספציפי, החל מ-Android 14, הערך הזה תואם לעדיפות
PRIORITY_BOOT
ב-ART Service.
- באופן ספציפי, החל מ-Android 14, הערך הזה תואם לעדיפות
dalvik.vm.restore-dex2oat-threads
/dalvik.vm.restore-dex2oat-cpu-set
:- (החל מגרסה 11 של Android ועד לגרסה 13) מספר השרשור והקבוצה של ליבות המעבד (ראו בהמשך) שישמשו לשחזור מהגיבוי בענן.
- (החל מ-Android 14) מספר השרשור והקבוצה של ליבות המעבד (ראו בהמשך) שישמשו לכל מה שמושפע יותר מהרגישות לזמן אחזור מהרגיל, כולל שחזור מגיבוי בענן.
- באופן ספציפי, זה תואם לעדיפות
PRIORITY_INTERACTIVE_FAST
ב-ART Service.
- באופן ספציפי, זה תואם לעדיפות
dalvik.vm.background-dex2oat-threads
/dalvik.vm.background-dex2oat-cpu-set
(החל מגרסה 14 של Android): מספר השרשור והקבוצה של ליבות המעבד (ראו בהמשך) שבהם נעשה שימוש ברקע.- באופן ספציפי, זה תואם לעדיפות
PRIORITY_BACKGROUND
ב-ART Service.
- באופן ספציפי, זה תואם לעדיפות
dalvik.vm.dex2oat-threads
/dalvik.vm.dex2oat-cpu-set
: מספר השרשור וקבוצת ליבות המעבד שישמשו לכל שאר הדברים.
יש לציין קבוצה של ליבות מעבד כרשימה של מזהי מעבדים שמופרדים בפסיקים. לדוגמה, כדי להריץ את dex2oat בליבות המעבד 0 עד 3, מגדירים:
dalvik.vm.dex2oat-cpu-set=0,1,2,3
כשמגדירים את מאפייני הקשר ל-CPU, מומלץ להתאים את המאפיין התואם למספר השרשראות של dex2oat למספר המעבדים שנבחרו, כדי למנוע תחרות מיותרת על זיכרון ועל קלט/פלט:
dalvik.vm.dex2oat-cpu-set=0,1,2,3 dalvik.vm.dex2oat-threads=4
בנוסף למאפייני המערכת שלמעלה, אפשר גם להשתמש בפרופילים של משימות כדי לשלוט בשימוש במשאבים של dex2oat (ראו שכבת האבסטרקציה של Cgroup).
פרופילי המשימות הנתמכים הם:
Dex2OatBackground
(החל מגרסה 14 של Android) (אופן ברירת המחדל הוא בירושה מ-Dex2OatBootComplete
): האפשרות הזו קובעת את המשאבים שבהם המערכת תשתמש ברקע.- באופן ספציפי, זה תואם לעדיפות
PRIORITY_BACKGROUND
ב-ART Service.
- באופן ספציפי, זה תואם לעדיפות
Dex2OatBootComplete
:- (עד Android 13) קובע את המשאב שבו נעשה שימוש בכל מה שקורה אחרי האתחול.
- (החל מ-Android 14) קובע את המשאב שבו ישתמשו בכל מה שקורה אחרי האתחול ולא ברקע.
- באופן ספציפי, זה תואם לעדיפות
PRIORITY_INTERACTIVE_FAST
ו-PRIORITY_INTERACTIVE
בשירות ART.
- באופן ספציפי, זה תואם לעדיפות
כשמציינים גם מאפייני מערכת וגם פרופילים של משימות, שניהם נכנסים לתוקף.
אפשרויות לשלוט בגודל האוסף:
dalvik.vm.image-dex2oat-Xms
: גודל האשפה הראשוני בקובצי אימג' לאתחול.dalvik.vm.image-dex2oat-Xmx
: גודל האשפה המקסימלי לקובצי אימג' לאתחול.dalvik.vm.dex2oat-Xms
: גודל האשפה הראשוני לכל שאר הפריטים.dalvik.vm.dex2oat-Xmx
: גודל האוסף המקסימלי לכל שאר הפריטים.
אסור לצמצם את האפשרויות ששולטות בגודל האשכול הראשוני והמקסימלי של dex2oat
, כי הן עלולות להגביל את האפליקציות שאפשר לקמפל.
אפשרויות לשלוט במסנן של המהדר:
dalvik.vm.image-dex2oat-filter
(עד Android 11): מסנן המהדר עבור קובצי אימג' להפעלה. החל מגרסה 12 של Android, המסנן של המהדר לתמונות אתחול הוא תמידspeed-profile
ואי אפשר לשנות אותו.dalvik.vm.systemservercompilerfilter
(החל מ-Android 13): מסנן המהדר לשרת המערכת.PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
dalvik.vm.systemuicompilerfilter
(החל מ-Android 13): מסנן המהדר למארז System UI.dalvik.vm.dex2oat-filter
(עד Android 6): מסנן המהדר עבור כל שאר הדברים.pm.dexopt.<reason>
(החל מגרסה 7 של Android): מסנן המהדר לכל שאר הדברים. למידע נוסף, ראו הגדרת שירות ART לגרסאות Android 14 ואילך, או הגדרת מנהל החבילות לגרסאות Android 13 ומטה.
אפשרויות אחרות לשלוט בתהליך ה-compilation של כל מה שאינו קובצי אימג' להפעלה:
dalvik.vm.dex2oat-very-large
(החל מ-Android 7.1): הגודל הכולל המינימלי של קובץ dex בבייטים כדי להשבית את הידור AOT.dalvik.vm.dex2oat-swap
(החל מ-Android 7.1) (ברירת המחדל: true): מאפשר להשתמש בקובץ החלפה ל-dex2oat. כך אפשר למנוע קריסות שנובעות מיציאה מחוץ למכסת הזיכרון. חשוב לזכור שגם אם האפשרות הזו מופעלת, הכלי dex2oat ישתמש בקובץ החלפה רק בתנאים מסוימים, למשל כשמספר קובצי ה-dex גדול, והתנאים עשויים להשתנות.dalvik.vm.ps-min-first-save-ms
(החל מגרסה 12 של Android): משך ההמתנה המינימלי לפני שסביבת זמן הריצה יוצרת פרופיל של האפליקציה בפעם הראשונה שהיא מופעלת.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, של כיתות חדשות בפרופיל כדי להפעיל הידור מחדש. רלוונטי רק ל-profile-guided compilation (speed-profile
), בדרך כלל במהלך dexopt ברקע. חשוב לזכור שיש גם סף של 50 כיתות חדשות לפחות, בנוסף לסף האחוזים, ואי אפשר לשנות אותו.dalvik.vm.bgdexopt.new-methods-percent
(החל מגרסה 12 של Android) (ברירת המחדל: 20): האחוז המינימלי, בין 0 ל-100, של שיטות חדשות בפרופיל כדי להפעיל הידור מחדש. רלוונטי רק ל-profile-guided compilation (speed-profile
), בדרך כלל במהלך dexopt ברקע. חשוב לזכור שיש גם סף של לפחות 100 שיטות חדשות בנוסף לסף האחוזים, ואי אפשר לשנות אותו.dalvik.vm.dex2oat-max-image-block-size
(החל מ-Android 10) (ברירת המחדל: 524288) גודל מקסימלי של בלוק מוצק לתמונות דחוסות. תמונה גדולה מחולקת לקבוצה של בלוקים מוצקים, כך שאף בלוק לא גדול מהגודל המקסימלי.dalvik.vm.dex2oat-resolve-startup-strings
(החל מ-Android 10) (ברירת המחדל: true) אם הערך הוא true, המערכת תגרום ל-dex2oat לפתור את כל מחרוזות הקבועים שמפנים לשיטות שמסומנות בתור 'הפעלה' בפרופיל.debug.generate-debug-info
(ברירת המחדל: false) האפשרות ליצור מידע לניפוי באגים לצורך ניפוי באגים מקומי, כמו מידע על ביטול הקיפול של הערימה, סמלי ELF וקטעי dwarf.dalvik.vm.dex2oat-minidebuginfo
(החל מ-Android 9) (ברירת המחדל: true) האפשרות ליצור כמות מינימלית של פרטי ניפוי באגים דחוסים ב-LZMA הנדרשים להדפסת מעקב נתיב חזרה.
אפשרויות השירות של ART
החל מ-Android 14, שירות ART מטפל בתהליך הידור AOT לאפליקציות במכשיר (שנקרא גם dexopt). מידע נוסף על הגדרת ART Service זמין במאמר הגדרת ART Service.אפשרויות של מנהל החבילות
לפני Android 14, ניהול החבילות מטפל בהידור AOT של אפליקציות במכשיר (שנקרא גם dexopt). מידע נוסף על הגדרת מנהל החבילות ל-dexopt זמין במאמר הגדרת מנהל החבילות.הגדרה ספציפית לניסוי A/B
הגדרת ROM
החל מגרסה 7.0 של Android, יכול להיות שמכשירים ישתמשו בשני מחיצות מערכת כדי לאפשר עדכוני מערכת מסוג 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, אפשר לקמפל אפליקציות ברקע לפני ההפעלה מחדש עם קובץ האימג' החדש של המערכת. במאמר הדרכה ליצירת קובצי אימג' של מערכת עם אפליקציות מוסבר איך אפשר לכלול את סקריפט הידור הקוד ואת קובצי ה-binaries בקובץ האימג' של המערכת. אפשר לשלוט במסנן ה-compilation שמשמש ל-compilation הזה באמצעות:
pm.dexopt.ab-ota=speed-profile
מומלץ להשתמש ב-speed-profile
כדי ליהנות מהיתרונות של הידור מונחה-פרופיל ולחסוך באחסון.
אפשרויות JDWP
יצירת השרשור של Java Debug Wire Protocol (JDWP) ב-builds של userdebug נשלטת באמצעות מאפיין המערכת persist.debug.dalvik.vm.jdwp.enabled
. כברירת מחדל, המאפיין הזה לא מוגדר ושרשראות JDWP נוצרות רק לאפליקציות שניתנות לניפוי באגים. כדי להפעיל את השרשור של JDWP גם לאפליקציות שניתן לנפות בהן באגים וגם לאפליקציות שלא ניתן לנפות בהן באגים, מגדירים את persist.debug.dalvik.vm.jdwp.enabled
לערך 1
. כדי שהשינויים בנכס ייכנסו לתוקף, צריך להפעיל מחדש את המכשיר.
כדי לנפות באגים באפליקציה שלא ניתן לנפות בה באגים ב-build של userdebug, מפעילים את JDWP באמצעות הפקודה הבאה:
במכשירים עם Android מגרסה 13 ומטה, סביבת זמן הריצה יוצרת שרשראות JDWP לאפליקציות שניתן לנפות באגים בהן ולאפליקציות שלא ניתן לנפות באגים בהן בגרסאות build של userdebug. המשמעות היא שאפשר לצרף כלי לניפוי באגים או ליצור פרופיל של כל אפליקציה בגרסאות build של userdebug.adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
adb reboot