در این صفحه نحوه پیکربندی زمان اجرا اندروید (ART) و گزینه های کامپایل آن بحث می شود. موضوعاتی که در اینجا به آنها پرداخته می شود شامل پیکربندی پیش کامپایل تصویر سیستم، گزینه های کامپایل dex2oat
، و نحوه مبادله فضای پارتیشن سیستم، فضای پارتیشن داده و عملکرد است.
برای کار با ART به ART و Dalvik و فرمت اجرایی Dalvik مراجعه کنید. برای اطمینان از اینکه برنامههایتان به درستی کار میکنند ، به تأیید رفتار برنامه در زمان اجرای Android (ART) مراجعه کنید.
هنر چگونه کار می کند
ART از کامپایل پیش از زمان (AOT) استفاده می کند و با شروع در اندروید 7، از ترکیب ترکیبی کامپایل AOT، کامپایل به موقع (JIT) و تفسیر استفاده می کند و کامپایل AOT را می توان با نمایه هدایت کرد. ترکیب همه این حالت های اجرا قابل تنظیم است و در این قسمت مورد بحث قرار خواهد گرفت. به عنوان مثال، دستگاههای Pixel برای کار در جریان زیر پیکربندی شدهاند:
- یک برنامه در ابتدا با یک فایل فراداده dex (
.dm
) توزیع شده توسط Play Store نصب می شود که حاوی نمایه ابری است. ART AOT-روش های فهرست شده در نمایه ابری را کامپایل می کند. یا اگر برنامه بدون فایل فراداده dex نصب شده باشد، هیچ کامپایل AOT انجام نمی شود. - چند بار اول که برنامه اجرا می شود، روش هایی که AOT-کامپایل نشده اند تفسیر می شوند. در میان روشهای تفسیر شده، آنهایی که اغلب اجرا میشوند، سپس با JIT کامپایل میشوند. ART یک نمایه محلی را بر اساس اجرا ایجاد می کند و آن را با نمایه ابری (در صورت وجود) ترکیب می کند.
- هنگامی که دستگاه بیکار است و در حال شارژ است، یک شبح کامپایل برای کامپایل مجدد برنامه بر اساس نمایه ترکیبی تولید شده در چند اجرا اول اجرا می شود.
- در اجراهای بعدی برنامه، ART از مصنوعات تولید شده توسط دیمون کامپایل استفاده میکند که حاوی کدهای کامپایلشده AOT بیشتری است، در مقایسه با مواردی که در طول روشهایی که با AOT کامپایل نشدهاند، هنوز تفسیر یا کامپایل شدهاند. ART نصب نمایه را بر اساس اجرا به روز می کند و سپس نمایه توسط اجراهای بعدی دیمون کامپایل انتخاب می شود.
ART شامل یک کامپایلر (ابزار dex2oat
) و یک زمان اجرا ( libart.so
) است که در هنگام بوت بارگذاری می شود. ابزار dex2oat
یک فایل APK را می گیرد و یک یا چند فایل مصنوع کامپایل را تولید می کند که زمان اجرا بارگیری می شود. تعداد فایلها، پسوندها و نامهای آنها در نسخههای مختلف در معرض تغییر هستند، اما از زمان انتشار Android 8، این فایلها تولید میشوند:
-
.vdex
.: حاوی برخی فراداده اضافی برای سرعت بخشیدن به تأیید، گاهی اوقات همراه با کد DEX فشرده نشده APK است. -
.odex
: حاوی کدهای کامپایل شده توسط AOT برای متدها در APK است. -
.art (optional)
حاوی نمایش های داخلی ART از برخی رشته ها و کلاس های فهرست شده در APK است که برای سرعت بخشیدن به راه اندازی برنامه استفاده می شود.
گزینه های تالیف
دو دسته از گزینه های کامپایل برای ART وجود دارد:
- پیکربندی رام سیستم: در هنگام ساخت تصویر سیستم، AOT چه کدی کامپایل میشود.
- پیکربندی زمان اجرا: چگونه ART برنامه ها را روی یک دستگاه کامپایل و اجرا می کند.
فیلترهای کامپایلر
یکی از گزینه های اصلی ART برای پیکربندی این دو دسته، فیلترهای کامپایلر است. فیلترهای کامپایلر نحوه کامپایل کد DEX را هدایت می کنند و گزینه ای است که به ابزار dex2oat
منتقل می شود. با شروع اندروید 8، چهار فیلتر به طور رسمی پشتیبانی می شوند:
-
verify
: فقط تأیید کد DEX را اجرا کنید (بدون کامپایل AOT). -
quicken
: (تا اندروید 11) تأیید کد DEX را اجرا کنید و برخی دستورالعملهای DEX را بهینه کنید تا عملکرد مفسر بهتری داشته باشید. -
speed
: تأیید کد DEX را اجرا کنید و همه روش ها را AOT-کامپایل کنید. -
speed-profile
: تأیید کد DEX و روشهای کامپایل AOT را که در یک فایل نمایه فهرست شدهاند را اجرا کنید.
پیکربندی رام سیستم
کتابخانه ها و برنامه های از پیش نصب شده زمانی که یک تصویر سیستم ساخته می شود AOT-کامپایل می شوند. این فرآیند dexpreopt نامیده می شود. چنین فایل های کامپایل شده تا زمانی که همه وابستگی ها بدون تغییر باقی می مانند، قابل استفاده هستند، به ویژه مسیر کلاس بوت.
توجه: اگر دستگاه بهروزرسانیهای ماژول سیستم را دریافت کند، احتمالاً مسیر کلاس راهاندازی در بهروزرسانی بعدی تغییر میکند، که همه فایلهای dexpreopt را کهنه و غیرقابل استفاده میکند.
تعدادی گزینه ساخت ART برای پیکربندی dexpreopt موجود است. نحوه پیکربندی این گزینه ها به فضای ذخیره سازی موجود برای تصویر سیستم و تعداد برنامه های از پیش نصب شده بستگی دارد. JAR ها/APK هایی که در یک ROM سیستم کامپایل می شوند را می توان به چهار دسته تقسیم کرد:
- کد مسیر کلاس راهاندازی: بهطور پیشفرض با فیلتر کامپایلر
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
(در ادامه این سند ببینید). - (اندروید 14 و بالاتر) به طور پیشفرض با فیلتر کامپایلر
- برنامههای هسته ویژه محصول (به
PRODUCT_DEXPREOPT_SPEED_APPS
بعداً در این سند مراجعه کنید): به طور پیشفرض با فیلتر کامپایلرspeed
کامپایل شدهاند. - همه برنامههای دیگر: بهطور پیشفرض با فیلتر کامپایلر
speed-profile
کامپایل شدهاند، یا اگر نمایهای ارائه نشده باشد، با فیلتر کامپایلرverify
کامپایل شدهاند.قابل تنظیم از طریق
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
(در ادامه این سند ببینید).
گزینه های Makefile
-
WITH_DEXPREOPT
-
DONT_DEXPREOPT_PREBUILTS
(اندروید 5 و بالاتر) -
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
(اندروید 9 و بالاتر) -
WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
(از Android 8 MR1) -
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
- (اندروید 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
- (الزامی)
PRODUCT_SYSTEM_SERVER_JARS
: فهرستی از JARهای مسیر کلاس سرور سیستم در پلتفرم (یعنی به عنوان بخشی ازSYSTEMSERVERCLASSPATH
). افزودن کلاس مسیر سرور سیستم به این لیست الزامی است. عدم افزودن JARهای کلاس مسیر سرور سیستم به لیست منجر به بار نشدن آن JARها می شود. - (الزامی)
PRODUCT_APEX_SYSTEM_SERVER_JARS
: فهرستی از JARهای مسیر کلاس سرور سیستم که با APEX (یعنی به عنوان بخشی ازSYSTEMSERVERCLASSPATH
) تحویل داده شده است. قالب<apex name>:<jar name>
است. افزودن JARهای کلاس مسیر سرور سیستم APEX به این لیست الزامی است. عدم اضافه کردن JARهای کلاس مسیر سرور سیستم 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
از بازگشایی پیش ساخته ها جلوگیری می کند. اینها برنامه هایی هستند که include $(BUILD_PREBUILT)
در Android.mk
آنها مشخص شده است. پرش از dexpreopt از برنامههای از پیش ساختهشده که احتمالاً از طریق Google Play بهروزرسانی میشوند، باعث صرفهجویی در فضا در تصویر سیستم میشود اما به زمان اولین راهاندازی اضافه میکند. توجه داشته باشید که این گزینه روی برنامه های از پیش ساخته شده در Android.bp
تاثیری ندارد.
PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER
فیلتر کامپایلر پیش فرض را برای برنامه های کاربردی dexpreopted مشخص می کند. این برنامهها در Android.bp
تعریف شدهاند یا include $(BUILD_PREBUILT)
هستند که در Android.mk
آنها مشخص شده است. اگر مشخص نیست، مقدار پیشفرض speed-profile
است، یا verify
که آیا مقدار مشخص نشده است و نمایهای ارائه نشده است.
فعال کردن WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
فقط مسیر کلاس راهاندازی و شیشههای سرور سیستم را حذف میکند.
همچنین میتوان Dexpreopt را بر اساس برنامه جداگانه با تعیین گزینه LOCAL_DEX_PREOPT
در تعریف ماژول فعال یا غیرفعال کرد. این میتواند برای غیرفعال کردن dexpreopt برنامههایی که ممکن است فوراً بهروزرسانیهای Google Play را دریافت کنند مفید باشد، زیرا بهروزرسانیها باعث منسوخ شدن کد dexpreopt در تصویر سیستم میشوند. این همچنین برای صرفه جویی در فضا در OTA های ارتقاء نسخه اصلی مفید است زیرا ممکن است کاربران از قبل نسخه های جدیدتری از برنامه ها را در پارتیشن داده داشته باشند.
LOCAL_DEX_PREOPT
از مقادیر true
یا false
به ترتیب برای فعال یا غیرفعال کردن dexpreopt پشتیبانی می کند. علاوه بر این، در صورتی که dexpreopt نباید فایل classes.dex
را از فایل APK یا JAR حذف کند، میتوان nostripping
مشخص کرد. معمولاً این فایل حذف میشود زیرا دیگر پس از 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 در دستگاه اضافه شود. بهطور پیشفرض، این برای userdebug و ساختهای eng فعال است. این رفتار را می توان با تنظیم صریح گزینه روی true
یا false
لغو کرد.
به طور پیش فرض، دستگاه از نسخه بدون اشکال ( libart.so
) استفاده می کند. برای تغییر، ویژگی سیستم persist.sys.dalvik.vm.lib.2
را روی libartd.so
قرار دهید.
در Android 5.1.0 تا Android 6.0.1، WITH_DEXPREOPT_PIC
را می توان برای فعال کردن کد مستقل از موقعیت (PIC) مشخص کرد. با این کار، کد کامپایل شده از تصویر نیازی به جابجایی از /system
به /data/dalvik-cache
ندارد و باعث صرفه جویی در فضا در پارتیشن داده می شود. با این حال، تأثیر کمی در زمان اجرا وجود دارد زیرا بهینه سازی را غیرفعال می کند که از کد وابسته به موقعیت استفاده می کند. به طور معمول، دستگاههایی که میخواهند فضا را در /data
ذخیره کنند، باید کامپایل PIC را فعال کنند.
در اندروید 7.0، کامپایل PIC به طور پیش فرض فعال بود.
این گزینه با WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY
جایگزین شد که JAR های سرور سیستم را نیز از قبل انتخاب می کند.
این گزینه فیلتر کامپایلر را برای سرور سیستم مشخص می کند.
لیست زیر لیستی از JARهایی است که توسط سرور سیستم بارگیری می شوند. JAR ها با فیلتر کامپایلر مشخص شده توسط PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
کامپایل می شوند.
تنظیمات مسیر کلاس را بوت کنید
فهرست کلاسهای از پیش بارگذاری شده فهرستی از کلاسهایی است که Zygote هنگام راهاندازی مقداردهی اولیه میکند. این امر باعث می شود هر برنامه از اجرای جداگانه این اولیه سازهای کلاس نجات یابد و به آنها امکان می دهد سریعتر راه اندازی شوند و صفحات را در حافظه به اشتراک بگذارند. فایل فهرست کلاسهای از پیش بارگذاریشده بهطور پیشفرض در frameworks/base/config/preloaded-classes
قرار دارد و حاوی فهرستی است که برای استفاده معمولی از تلفن تنظیم شده است. این ممکن است برای دستگاه های دیگر مانند پوشیدنی ها متفاوت باشد و باید بر اساس آن تنظیم شود. هنگام تنظیم این مورد مراقب باشید؛ وقتی کلاس های استفاده نشده بارگذاری می شوند، اضافه کردن تعداد زیاد کلاس باعث هدر رفتن حافظه می شود. اضافه کردن کلاسهای بسیار کم، هر برنامه را مجبور میکند کپی مخصوص به خود را داشته باشد، که دوباره باعث هدر رفتن حافظه میشود.
مثال استفاده (در product's device.mk
):
PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
توجه: قبل از به ارث بردن هر گونه فایل پیکربندی محصول که فایل پیش فرض را از build/target/product/base.mk
دریافت می کند، باید این خط را قرار دهید.
پیکربندی زمان اجرا
گزینه های JIT
گزینههای زیر بر نسخههای Android فقط در جایی تأثیر میگذارند که کامپایلر ART JIT در دسترس است.
-
dalvik.vm.usejit
: فعال بودن یا نبودن JIT. -
dalvik.vm.jitinitialsize
(پیش فرض 64K): ظرفیت اولیه حافظه پنهان کد. حافظه پنهان کد به طور مرتب GC می شود و در صورت نیاز افزایش می یابد. -
dalvik.vm.jitmaxsize
(پیش فرض 64M): حداکثر ظرفیت حافظه پنهان کد. -
dalvik.vm.jitthreshold
(پیشفرض 10000): آستانهای که شمارنده «hotness» یک متد باید از آن عبور کند تا متد بهصورت JIT کامپایل شود. شمارنده "hotness" یک متریک داخلی برای زمان اجرا است. این شامل تعداد تماس ها، شاخه های عقب افتاده و سایر عوامل است. -
dalvik.vm.usejitprofiles
(تا اندروید 13): اینکه آیا پروفایل های JIT فعال هستند یا نه. این ممکن است استفاده شود حتی اگرdalvik.vm.usejit
نادرست باشد. توجه داشته باشید که اگر این نادرست باشد،speed-profile
فیلتر کامپایلر هیچ روشی را AOT-کامپایل نمیکند و معادلverify
است. از اندروید 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
(تا اندروید 11): تعداد رشته ها و مجموعه هسته های CPU (به زیر مراجعه کنید) که برای تصاویر بوت استفاده می شود. -
dalvik.vm.boot-dex2oat-threads
/dalvik.vm.boot-dex2oat-cpu-set
:- (تا اندروید 11) تعداد رشتهها و مجموعه هستههای CPU (به زیر مراجعه کنید) برای استفاده در طول زمان راهاندازی برای هر چیزی غیر از تصاویر بوت.
- (از اندروید 12) تعداد رشته ها و مجموعه هسته های CPU (به زیر مراجعه کنید) برای استفاده در طول زمان بوت برای همه چیز، از جمله تصاویر بوت.
- به طور خاص، از Android 14، این با کلاس اولویت
PRIORITY_BOOT
در سرویس ART مطابقت دارد.
- به طور خاص، از Android 14، این با کلاس اولویت
-
dalvik.vm.restore-dex2oat-threads
/dalvik.vm.restore-dex2oat-cpu-set
:- (از اندروید 11 تا اندروید 13) تعداد رشتهها و مجموعه هستههای CPU (به زیر مراجعه کنید) که برای بازیابی از پشتیبانگیری ابری استفاده میشود.
- (از اندروید 14) تعداد رشتهها و مجموعه هستههای CPU (به زیر مراجعه کنید) برای استفاده برای هر چیزی که نسبت به حالت عادی به تأخیر حساستر است، از جمله بازیابی از پشتیبانگیری ابری.
- به طور خاص، این مربوط به کلاس اولویت
PRIORITY_INTERACTIVE_FAST
در سرویس ART است.
- به طور خاص، این مربوط به کلاس اولویت
-
dalvik.vm.background-dex2oat-threads
/dalvik.vm.background-dex2oat-cpu-set
(از اندروید 14): تعداد رشته ها و مجموعه هسته های CPU (به زیر مراجعه کنید) برای استفاده در پس زمینه.- به طور خاص، این مربوط به کلاس اولویت
PRIORITY_BACKGROUND
در سرویس ART است.
- به طور خاص، این مربوط به کلاس اولویت
-
dalvik.vm.dex2oat-threads
/dalvik.vm.dex2oat-cpu-set
: تعداد رشتهها و مجموعه هستههای CPU برای استفاده برای هر چیز دیگری.
مجموعه ای از هسته های CPU باید به عنوان لیست شناسه های CPU جدا شده با کاما مشخص شوند. به عنوان مثال برای اجرا بر روی dex2oat در هسته های CPU 0-3، تنظیم کنید:
dalvik.vm.dex2oat-cpu-set=0,1,2,3
هنگام تنظیم ویژگی های CPU affinity، توصیه می کنیم ویژگی مربوطه را برای تعداد رشته های dex2oat مطابقت دهید تا با تعداد CPU های انتخاب شده مطابقت داشته باشد تا از اختلاف حافظه غیر ضروری و I/O جلوگیری شود:
dalvik.vm.dex2oat-cpu-set=0,1,2,3 dalvik.vm.dex2oat-threads=4
علاوه بر ویژگیهای سیستم بالا، میتوانید از پروفایلهای وظیفه نیز برای کنترل استفاده از منابع dex2oat استفاده کنید (به لایه Cgroup Abstraction مراجعه کنید).
پروفایل های وظیفه پشتیبانی شده عبارتند از:
-
Dex2OatBackground
(از اندروید 14) (به طور پیش فرضDex2OatBootComplete
را به ارث می برد): منابع را برای استفاده در پس زمینه کنترل می کند.- به طور خاص، این مربوط به کلاس اولویت
PRIORITY_BACKGROUND
در سرویس ART است.
- به طور خاص، این مربوط به کلاس اولویت
-
Dex2OatBootComplete
:- (تا اندروید 13) منبعی را برای استفاده برای همه چیز پس از بوت کردن کنترل می کند.
- (از اندروید 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
(تا اندروید 11): فیلتر کامپایلر برای تصاویر بوت. از اندروید 12، فیلتر کامپایلر برای تصاویر بوت همیشهspeed-profile
است و قابل تغییر نیست. -
dalvik.vm.systemservercompilerfilter
(از اندروید 13): فیلتر کامپایلر برای سرور سیستم.PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
را ببینید. -
dalvik.vm.systemuicompilerfilter
(از اندروید 13): فیلتر کامپایلر برای بسته System UI. -
dalvik.vm.dex2oat-filter
(تا اندروید 6): فیلتر کامپایلر برای هر چیز دیگری. -
pm.dexopt.<reason>
(از اندروید 7): فیلتر کامپایلر برای هر چیز دیگری. به پیکربندی سرویس ART برای Android نسخه 14 و بالاتر یا پیکربندی مدیریت بسته برای Android نسخه 13 و پایینتر مراجعه کنید.
گزینه های دیگر برای کنترل کامپایل کردن همه چیز به جز تصاویر بوت:
-
dalvik.vm.dex2oat-very-large
(از اندروید 7.1): حداقل حجم کل فایل dex به بایت برای غیرفعال کردن کامپایل AOT. -
dalvik.vm.dex2oat-swap
(از اندروید 7.1) (پیشفرض: true): امکان استفاده از فایل swap برای dex2oat. این می تواند به جلوگیری از خرابی های خارج از حافظه کمک کند. توجه داشته باشید که حتی در صورت فعال بودن این گزینه، dex2oat فقط تحت شرایط خاصی از فایل swap استفاده می کند، مثلاً زمانی که تعداد فایل های dex زیاد است و شرایط در حال تغییر است. -
dalvik.vm.ps-min-first-save-ms
(از اندروید 12): حداقل زمان انتظار قبل از تولید نمایه برنامه در زمان اجرا، اولین باری که برنامه راه اندازی می شود. -
dalvik.vm.ps-min-save-period-ms
(از اندروید 12): حداقل زمان انتظار قبل از بهروزرسانی نمایه برنامه. -
dalvik.vm.dex2oat64.enabled
(از اندروید 11) (پیشفرض: false): آیا از نسخه 64 بیتی dex2oat استفاده شود یا خیر. -
dalvik.vm.bgdexopt.new-classes-percent
(از Android 12) (پیشفرض: 20): حداقل درصد، بین 0 تا 100، از کلاسهای جدید در یک نمایه برای راهاندازی مجدد کامپایل. فقط برای کامپایل هدایتشده نمایه (speed-profile
)، معمولاً در هنگام دکسوپت پسزمینه قابل استفاده است. توجه داشته باشید که علاوه بر آستانه درصد، آستانه حداقل 50 کلاس جدید نیز وجود دارد و قابل تنظیم نیست. -
dalvik.vm.bgdexopt.new-methods-percent
(از اندروید 12) (پیشفرض: 20): حداقل درصد، بین 0 تا 100، از روشهای جدید در یک نمایه برای شروع کامپایل مجدد. فقط برای کامپایل هدایتشده نمایه (speed-profile
)، معمولاً در هنگام دکسوپت پسزمینه قابل استفاده است. توجه داشته باشید که علاوه بر آستانه درصد، آستانه حداقل 100 روش جدید نیز وجود دارد و قابل تنظیم نیست. -
dalvik.vm.dex2oat-max-image-block-size
(از اندروید 10) (پیشفرض: 524288) حداکثر اندازه بلوک جامد برای تصاویر فشرده. یک تصویر بزرگ به مجموعه ای از بلوک های جامد تقسیم می شود به طوری که هیچ بلوکی بزرگتر از حداکثر اندازه نیست. -
dalvik.vm.dex2oat-resolve-startup-strings
(از اندروید 10) (پیشفرض: درست) اگر درست باشد، باعث میشود که dex2oat تمام رشتههای const را که از روشهایی که در نمایه بهعنوان «راهاندازی» علامتگذاری شدهاند، ارجاع دهد، حل کند. -
debug.generate-debug-info
(پیشفرض: نادرست) اینکه آیا اطلاعات اشکالزدایی برای اشکالزدایی بومی تولید شود یا نه، مانند اطلاعات باز کردن پشته، نمادهای ELF و بخشهای کوتوله. -
dalvik.vm.dex2oat-minidebuginfo
(از Android 9) (پیشفرض: درست) اینکه آیا حداقل اطلاعات اشکالزدایی فشردهشده با LZMA برای چاپ پسترکها تولید شود یا نه.
گزینه های خدمات ART
از Android 14، کامپایل AOT روی دستگاه برای برنامهها (معروف به dexopt) توسط ART Service مدیریت میشود. برای اطلاعات در مورد پیکربندی سرویس ART، به پیکربندی سرویس ART مراجعه کنید.گزینه های مدیریت بسته
قبل از Android 14، کامپایل AOT روی دستگاه برای برنامه ها (معروف به dexopt) توسط مدیر بسته انجام می شود. برای اطلاعات در مورد پیکربندی مدیر بسته برای dexopt، به پیکربندی مدیر بسته مراجعه کنید.پیکربندی خاص A/B
پیکربندی رام
با شروع 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
توجه داشته باشید که کد کلاس مسیر راهاندازی، کد سرور سیستم و برنامههای هسته ویژه محصول همیشه در پارتیشن سیستم کامپایل میشوند. بهطور پیشفرض، همه برنامههای دیگر در پارتیشن سیستم دوم استفاده نشده کامپایل میشوند. این را می توان با SYSTEM_OTHER_ODEX_FILTER
کنترل کرد که به طور پیش فرض دارای مقدار زیر است:
SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
پس زمینه OTA dexopt
در دستگاههای دارای A/B، برنامهها را میتوان در پسزمینه قبل از راهاندازی مجدد با تصویر سیستم جدید کامپایل کرد. برای گنجاندن اختیاری اسکریپت کامپایل و فایل های باینری در تصویر سیستم ، کامپایل برنامه را در پس زمینه ببینید. فیلتر کامپایل مورد استفاده برای این کامپایل با موارد زیر کنترل می شود:
pm.dexopt.ab-ota=speed-profile
توصیه میکنیم از speed-profile
برای بهرهگیری از کامپایل هدایتشده پروفایل و صرفهجویی در ذخیرهسازی استفاده کنید.
گزینه های JDWP
ایجاد رشته پروتکل اشکال زدایی جاوا (JDWP) در ساخت های userdebug از طریق ویژگی سیستم persist.debug.dalvik.vm.jdwp.enabled
کنترل می شود. به طور پیشفرض، این ویژگی تنظیم نشده است و رشتههای JDWP فقط برای برنامههای قابل اشکالزدایی ایجاد میشوند. برای فعال کردن رشتههای JDWP برای برنامههای اشکالزدایی و غیراشکالزدایی، persist.debug.dalvik.vm.jdwp.enabled
را روی 1
تنظیم کنید. برای اعمال تغییرات در ویژگی، دستگاه باید راه اندازی مجدد شود.
برای اشکالزدایی یک برنامه غیراشکالزدایی در یک ساخت userdebug، JDWP را با اجرای دستور زیر فعال کنید:
برای دستگاههایی که اندروید 13 و پایینتر دارند، زمان اجرا رشتههای JDWP را برای برنامههای اشکالزدایی و غیراشکالزدایی در ساختهای کاربر اشکالزدایی ایجاد میکند. این به این معنی است که میتوان یک اشکالزدا یا نمایه هر برنامهای را در ساختهای userdebug پیوست کرد.adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
adb reboot