این صفحه درباره نحوه پیکربندی زمان اجرای Android (ART) و گزینههای گردآوری آن بحث میکند. موضوعاتی که در اینجا به آنها پرداخته میشود شامل پیکربندی پیشگردآوری تصویر سیستم، dex2oat
گزینههای گردآوری، و نحوه ایجاد توازن بین فضای پارتیشن سیستم، فضای پارتیشن داده، و
عملکرد است.
برای کار با ART، ART و Dalvik و قالب اجرایی Dalvik را ببینید. برای اطمینان از اینکه برنامههایتان بهدرستی کار میکنند، درستیسنجی عملکرد برنامه در زمان اجرای Android (ART) را ببینید.
نحوه عملکرد ART
ART از گردآوری پیشاززمان (AOT) استفاده میکند و از Android 7، از ترکیب هیبریدی گردآوری پیشاززمان، گردآوری همزمان (JIT)، و تفسیر استفاده میکند، و گردآوری پیشاززمان میتواند نمایه-هدایتشده باشد. ترکیب همه این حالتهای اجرا قابلپیکربندی است و در این بخش مورد بحث قرار خواهد گرفت. بهعنوان مثال، دستگاههای Pixel برای کار در جریان زیر پیکربندی شدهاند:
- برنامه در ابتدا با فایل فراداده dex (
.dm) که توسط «فروشگاه Play» توزیع شده است نصب میشود و حاوی نمایه ابری است. ART روشهای فهرستشده در نمایه ابری را بهصورت پیشاز موعد کامپایل میکند. یا اگر برنامه بدون فایل فراداده dex نصب شود، هیچ ترجمه AOT انجام نمیشود. - چند بار اول که برنامه اجرا میشود، روشهایی که با AOT کامپایل نشدهاند تفسیر میشوند. از میان روشهای تفسیرشده، روشهایی که مکرراً اجرا میشوند سپس بااستفاده از JIT کامپایل میشوند. ART نمایه محلی را براساس اجرا تولید میکند و آن را با نمایه ابری (درصورت وجود) ترکیب میکند.
- وقتی دستگاه در حالت آمادهبهکار است و شارژ میشود، یک دیو گردآوری اجرا میشود تا برنامه را براساس نمایه ترکیبی تولیدشده در چند اجرای اول دوباره گردآوری کند.
- در اجراهای بعدی برنامه، ART از آرتیفکتهای تولیدشده توسط خدمات پسزمینه گردآوری استفاده میکند که در مقایسه با آرتیفکتهای تولیدشده درطول اجرای اولیه، حاوی کد گردآوریشده AOT بیشتری است. روشهایی که AOT گردآوری نشدهاند همچنان تفسیر یا JIT گردآوری میشوند. ART نصب نمایه را براساس اجرا بهروز میکند و سپس نمایه توسط اجراهای بعدی شبح کامپایل برداشته میشود.
ART شامل یک کامپایلر (ابزار dex2oat) و یک زمان اجرا (libart.so) است که درطول راهاندازی بار میشود. ابزار
dex2oat فایل APK را میگیرد و یک یا چند
فایل مصنوع کامپایلشده تولید میکند که زمان اجرا بار میکند. تعداد فایلها، پسوندها، و نامهای آنها در نسخههای مختلف ممکن است تغییر کند، اما از زمان انتشار Android 8، این فایلها تولید میشوند:
.vdex: حاوی برخی فرادادههای اضافی برای تسریع درستیسنجی است، گاهیاوقات همراه با کد DEX غیرفشرده APK.-
.odex: حاوی کد کامپایلشده AOT برای روشهای موجود در APK است. .art (optional)حاوی نمایشهای داخلی ART از برخی رشتهها و کلاسهای فهرستشده در APK است که برای سرعت بخشیدن به راهاندازی برنامه استفاده میشود.
گزینههای گردآوری
دو دسته گزینه گردآوری برای ART وجود دارد:
- پیکربندی ROM سیستم: هنگام ساختن تصویر سیستم، کدام کد با AOT کامپایل میشود.
- پیکربندی زمان اجرا: نحوه کامپایل و اجرای برنامهها در دستگاه توسط ART.
فیلترهای گردآورنده
یکی از گزینههای اصلی ART برای پیکربندی این دو دسته، فیلترهای
کامپایلر است. فیلترهای گردآورنده نحوه گردآوری کد DEX توسط ART را هدایت میکنند و گزینهای است که به ابزار dex2oat منتقل میشود. از Android 8 به بعد،
چهار فیلتر پشتیبانیشده رسمی وجود دارد:
verify: فقط درستیسنجی کد DEX را اجرا میکند (بدون گردآوری AOT).quicken: (Android 11 یا پایینتر) درستیسنجی کد DEX را اجرا میکند و برخیاز دستورالعملهای DEX را بهینهسازی میکند تا عملکرد مفسر بهبود یابد.-
speed: درستیسنجی کد DEX را اجرا میکند و همه روشها را با AOT کامپایل میکند. بار کردن کلاس را برای هیچ کلاسی بهینهسازی نمیکند. speed-profile: درستیسنجی کد DEX را اجرا میکند، روشهای فهرستشده در نمایه را بهصورت AOT کامپایل میکند، و بارگذاری کلاس را برای کلاسهای موجود در نمایه بهینهسازی میکند.
پیکربندی ROM سیستم
کتابخانهها و برنامههای ازپیش نصبشده هنگام ساخت تصویر سیستم بااستفاده از AOT کامپایل میشوند. این فرایند dexpreopt نامیده میشود. این فایلهای کامپایلشده تا زمانی که همه وابستگیها تغییر نکرده باشند، بهویژه مسیر کلاس بوت، قابلاستفاده هستند.
توجه: اگر دستگاه بهروزرسانیهای ماژول سیستم را دریافت کند، احتمالاً مسیر کلاس راهاندازی در بهروزرسانی بعدی تغییر خواهد کرد، که باعث میشود همه فایلهای dexpreopt قدیمی و غیرقابلاستفاده شوند.
تعدادی گزینه ساخت ART برای پیکربندی dexpreopt دردسترس است. نحوه پیکربندی این گزینهها به فضای ذخیرهسازی دردسترس برای تصویر سیستم و تعداد برنامههای پیشنصبشده بستگی دارد. فایلهای JAR/APK که در رام سیستم کامپایل میشوند را میتوان به چهار دسته تقسیم کرد:
- کد مسیر کلاس راهاندازی: بهطور پیشفرض با فیلتر کامپایلر
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(از Android 8 MR1)LOCAL_DEX_PREOPTPRODUCT_DEX_PREOPT_BOOT_FLAGSPRODUCT_DEX_PREOPT_DEFAULT_FLAGSPRODUCT_DEX_PREOPT_MODULE_CONFIGSPRODUCT_DEXPREOPT_SPEED_APPS(از Android 8)PRODUCT_SYSTEM_SERVER_APPS(از Android 8)PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD(از Android ۸)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 مسیر کلاس سرور سیستم در پلاتفرم (یعنی بهعنوان بخشی ازSYSTEMSERVERCLASSPATH). افزودن فایلهای JAR مسیر کلاس سرور سیستم به این فهرست الزامی است. عدم افزودن 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 مستقل به این فهرست منجر به خرابی راهاندازی میشود. -
dalvik.vm.usejit: فعال یا غیرفعال بودن JIT. -
dalvik.vm.jitinitialsize(پیشفرض ۶۴ کیلوبایت): ظرفیت اولیه حافظه نهان کد. حافظه نهان کد بهطور منظم GC میشود و درصورت نیاز افزایش مییابد. dalvik.vm.jitmaxsize(پیشفرض ۶۴ مگابایت): حداکثر ظرفیت حافظه نهان کد.dalvik.vm.jitthreshold(پیشفرض ۱۰۰۰۰): آستانهای که شمارنده «hotness» یک روش باید از آن عبور کند تا روش JIT-compiled شود. شمارنده «داغی» یک سنجه داخلی برای زمان اجرا است. این شامل تعداد تماسها، شاخههای برگشتی، و عوامل دیگر میشود.dalvik.vm.usejitprofiles(تا Android 13): اینکه نمایههای JIT فعال هستند یا نه؛ حتی اگرdalvik.vm.usejitنادرست باشد، ممکن است از این استفاده شود. توجه داشته باشید که اگر این مورد نادرست باشد، فیلتر کامپایلرspeed-profileهیچ روشی را با AOT کامپایل نمیکند و معادلverifyاست. از Android 14، نمایههای JIT همیشه فعال هستند و نمیتوانند خاموش شوند.dalvik.vm.jitprithreadweight(پیشفرض رویdalvik.vm.jitthreshold/ ۲۰): وزن «نمونههای» JIT (به jitthreshold مراجعه کنید) برای رشته واسط کاربری برنامه. برای تسریع در ترجمه روشهایی که مستقیماً بر تجربه کاربران هنگام تعامل با برنامه تأثیر میگذارند استفاده کنید.dalvik.vm.jittransitionweight(پیشفرضdalvik.vm.jitthreshold/ ۱۰): وزن فراخوانی روش که بین کد کامپایل و مفسر انتقال مییابد. این کار کمک میکند مطمئن شوید روشهای مربوطه برای بهحداقل رساندن انتقالها (که پرهزینه هستند) کامپایل شدهاند.dalvik.vm.image-dex2oat-threads/dalvik.vm.image-dex2oat-cpu-set(تا Android 11): تعداد رشتهها و مجموعه هستههای CPU (در زیر ببینید) برای استفاده در تصاویر راهاندازی.-
dalvik.vm.boot-dex2oat-threads/dalvik.vm.boot-dex2oat-cpu-set:- (تا Android 11) تعداد رشتهها و مجموعه هستههای CPU (به زیر مراجعه کنید) برای استفاده درطول زمان راهاندازی برای همه چیز بهجز تصاویر راهاندازی.
- (از Android 12) تعداد رشتهها و مجموعه هستههای CPU
(در زیر ببینید) که در زمان راهاندازی برای همه چیز، ازجمله تصاویر راهاندازی، استفاده میشود.
- بهطور مشخص، از Android 14، این مورد با
کلاس اولویت
PRIORITY_BOOTدر «سرویس ART» مطابقت دارد.
- بهطور مشخص، از Android 14، این مورد با
کلاس اولویت
dalvik.vm.restore-dex2oat-threads/dalvik.vm.restore-dex2oat-cpu-set:- (از Android 11 تا Android 13) تعداد رشتهها و مجموعه هستههای CPU (به زیر مراجعه کنید) که برای بازیابی از پشتیبانگیری ابری استفاده میشود.
- (از Android 14) تعداد رشتهها و مجموعه هستههای CPU
(در زیر ببینید) برای استفاده در هر چیزی که نسبتبه تأخیر حساستر از حد معمول است، ازجمله
بازیابی از نسخه پشتیبان ابری.
- بهطور دقیق، این با کلاس اولویت
PRIORITY_INTERACTIVE_FASTدر «خدمات ART» مطابقت دارد.
- بهطور دقیق، این با کلاس اولویت
dalvik.vm.background-dex2oat-threads/dalvik.vm.background-dex2oat-cpu-set(از Android 14): تعداد رشتهها و مجموعه هستههای CPU (به زیر مراجعه کنید) که در پسزمینه استفاده میشود.- بهطور دقیق، این با کلاس اولویت
PRIORITY_BACKGROUNDدر «خدمات ART» مطابقت دارد.
- بهطور دقیق، این با کلاس اولویت
-
dalvik.vm.dex2oat-threads/dalvik.vm.dex2oat-cpu-set: تعداد رشتهها و مجموعه هستههای CPU برای استفاده در همه موارد دیگر. Dex2OatBackground(از Android 14) (بهطور پیشفرضDex2OatBootCompleteرا بهارث میبرد): منابعی را که در پسزمینه استفاده میشود کنترل میکند.- بهطور دقیق، این با کلاس اولویت
PRIORITY_BACKGROUNDدر «خدمات ART» مطابقت دارد.
- بهطور دقیق، این با کلاس اولویت
-
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: حداکثر اندازه پشته برای همه موارد دیگر. dalvik.vm.image-dex2oat-filter(تا Android 11): فیلتر کامپایلر برای تصاویر راهاندازی. از Android 12، فیلتر کامپایلر برای تصاویر راهاندازی همیشهspeed-profileاست و نمیتوان آن را تغییر داد.dalvik.vm.systemservercompilerfilter(از Android 13): فیلتر کامپایلر برای سرور سیستم.PRODUCT_SYSTEM_SERVER_COMPILER_FILTERرا ببینید.-
dalvik.vm.systemuicompilerfilter(از Android 13): فیلتر کامپایلر برای بسته «میانای کاربری سیستم». dalvik.vm.dex2oat-filter(تا Android 6): فیلتر کامپایلر برای هر چیز دیگری.pm.dexopt.<reason>(از Android 7): فیلتر کامپایلر برای هر چیز دیگری. برای Android نسخه ۱۴ و بالاتر، پیکربندی سرویس ART، و برای Android نسخه ۱۳ و پایینتر، پیکربندی مدیر بسته را ببینید.-
dalvik.vm.dex2oat-very-large(از Android 7.1): حداقل اندازه کل فایل dex در بایت برای غیرفعال کردن ترجمه AOT. dalvik.vm.dex2oat-swap(از Android 7.1) (پیشفرض: درست): اجازه میدهد از فایل جایگزین برای dex2oat استفاده شود. این کار میتواند به جلوگیری از خرابیهای ناشی از کمبود حافظه کمک کند. توجه داشته باشید که حتی اگر این گزینه روشن باشد، dex2oat فقط در شرایط خاصی از فایل مبادله استفاده میکند، مثلاً زمانی که تعداد فایلهای 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): آیا از نسخه ۶۴ بیتی dex2oat استفاده شود یا نه.dalvik.vm.bgdexopt.new-classes-percent(از Android 12) (پیشفرض: ۲۰): حداقل درصد، بین ۰ تا ۱۰۰، از کلاسهای جدید در نمایه برای راهاندازی بازکامپایل. فقط برای گردآوری هدایتشده با نمایه (speed-profile) قابلاعمال است، معمولاً درطول dexopt پسزمینه. توجه داشته باشید که علاوهبر آستانه درصد، آستانه حداقل ۵۰ کلاس جدید نیز وجود دارد و قابل پیکربندی نیست.dalvik.vm.bgdexopt.new-methods-percent(از Android 12) (پیشفرض: ۲۰): حداقل درصد، بین ۰ و ۱۰۰، از روشهای جدید در نمایه برای راهاندازی بازکامپایل. فقط برای کامپایل هدایتشده با نمایه (speed-profile) قابلاجرا است، معمولاً درطول dexopt پسزمینه. توجه داشته باشید که علاوهبر آستانه درصدی، آستانه حداقل ۱۰۰ روش جدید نیز وجود دارد و قابلپیکربندی نیست.dalvik.vm.dex2oat-max-image-block-size(از Android 10) (پیشفرض: ۵۲۴۲۸۸) حداکثر اندازه بلوک یکپارچه برای تصاویر فشرده. تصویر بزرگ به مجموعهای از بلوکهای توپر تقسیم میشود، بهطوریکه هیچ بلوکی بزرگتر از حداکثر اندازه نباشد.dalvik.vm.dex2oat-resolve-startup-strings(از Android 10) (پیشفرض: درست) اگر درست باشد، باعث میشود dex2oat همه رشتههای ثابت را که از روشهای علامتگذاریشده بهعنوان «راهاندازی» در نمایه ارجاع داده شدهاند حل کند.debug.generate-debug-info(پیشفرض: false) اینکه آیا اطلاعات اشکالزدایی برای اشکالزدایی محلی، مانند اطلاعات واپیچیدن پشته، نمادهای ELF، و بخشهای کوتوله تولید شود یا نه.dalvik.vm.dex2oat-minidebuginfo(از Android 9) (پیشفرض: درست) آیا حداقل مقدار اطلاعات اشکالزدایی فشردهشده با LZMA لازم برای چاپ کردن ردیابی پشته تولید شود یا نه.
آیا dex2oat در کد DEX نصبشده در تصویر سیستم فراخوانده میشود. بهطور پیشفرض فعال است.
فعال کردن DONT_DEXPREOPT_PREBUILTS باعث میشود پیشساختهها
dexpreopted نشوند. اینها برنامههایی هستند که 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 dexpreopts فقط
مسیر کلاس راهاندازی و جار سرور سیستم.
با مشخص کردن گزینه LOCAL_DEX_PREOPT در تعریف واحد، میتوان Dexpreopt را برای هر برنامه بهصورت جداگانه فعال یا غیرفعال کرد.
این کار میتواند برای غیرفعال کردن 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 در دستگاه اضافه شود یا نه. بهطور پیشفرض، این ویژگی برای ساختهای eng و userdebug فعال است. این رفتار را میتوان با تنظیم صریح گزینه روی 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 را فعال کنند.
در Android 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 قرار دارد
و حاوی فهرستی است که برای استفاده معمول از تلفن بهینهسازی شده است. این ممکن است
برای دستگاههای دیگر مانند پوشیدنیها متفاوت باشد و باید براساس آن
تنظیم شود. هنگام تنظیم این مورد دقت کنید؛ افزودن کلاسهای زیاد باعث هدر رفتن حافظه میشود
وقتی کلاسهای استفادهنشده بارگیری میشوند. افزودن تعداد بسیار کم کلاسها باعث میشود هر برنامه مجبور شود نسخه خودش را داشته باشد که این کار دوباره باعث هدر رفتن حافظه میشود.
نمونه استفاده (به device.mk محصول):
PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
توجه: باید این خط را قبلاز
بهارث بردن هرگونه فایل ساخت پیکربندی محصول که فایل پیشفرض را از
build/target/product/base.mk دریافت میکند قرار دهید.
پیکربندی زمان اجرا
گزینههای JIT
گزینههای زیر فقط بر نسخههای Android که کامپایلر ART JIT در آنها دردسترس است تأثیر میگذارد.
گزینههای Dex2oat
این گزینهها بر ترجمه دروندستگاهی (یا همان dexopt) تأثیر میگذارند و چند مورد از آنها نیز بر dexpreopt تأثیر میگذارند، درحالیکه گزینههایی که در بخش پیکربندی ROM سیستم در بالا بحث شد فقط بر dexpreopt تأثیر میگذارند.
گزینههای کنترل مصرف منابع:
مجموعهای از هستههای CPU باید بهعنوان فهرستی از شناسههای CPU که با کاما از هم جدا شدهاند مشخص شود. برای مثال، برای اجرای روی dex2oat در هستههای CPU 0-3، تنظیم کنید:
dalvik.vm.dex2oat-cpu-set=0,1,2,3
هنگام تنظیم ویژگیهای وابستگی CPU، توصیه میکنیم ویژگی مربوطه را برای تعداد رشتههای dex2oat با تعداد CPUهای انتخابشده مطابقت دهید تا از رقابت غیرضروری حافظه و I/O جلوگیری شود:
dalvik.vm.dex2oat-cpu-set=0,1,2,3 dalvik.vm.dex2oat-threads=4
علاوهبر داراییهای سیستم در بالا، میتوانید از نمایههای تکلیف برای کنترل استفاده از منابع dex2oat نیز استفاده کنید (لایه انتزاعی Cgroup را ببینید).
نمایههای وظیفه پشتیبانیشده عبارتاند از:
وقتی هم ویژگیهای سیستم و هم نمایههای تکلیف مشخص شده باشند، هر دو اعمال میشوند.
گزینههای کنترل اندازه پشته:
گزینههایی که اندازه پشته اولیه و حداکثر را برای
dex2oat کنترل میکنند نباید کاهش یابند زیرا میتوانند آنچه را که
برنامهها میتوانند کامپایل کنند محدود کنند.
گزینههای کنترل فیلتر کامپایلر:
گزینههای دیگر برای کنترل کردن گردآوری همه چیز بهجز تصاویر راهاندازی:
گزینههای خدمات ART
از Android 14 به بعد، ترجمه AOT دروندستگاهی برای برنامهها (معروف به dexopt) توسط «سرویس ART» مدیریت میشود. برای کسب اطلاعات درباره پیکربندی «سرویس ART»، به پیکربندی سرویس ART مراجعه کنید.گزینههای مدیر بسته
قبلاز Android 14، ترجمه AOT دروندستگاهی برای برنامهها (یا همان dexopt) توسط مدیر بسته انجام میشود. برای کسب اطلاعات درباره پیکربندی مدیر بسته برای dexopt، به پیکربندی مدیر بسته مراجعه کنید.پیکربندی ویژه آزمایش آ/ب
پیکربندی 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
توجه داشته باشید که کد مسیر کلاس راهاندازی، کد سرور سیستم، و برنامههای اصلی مختص محصول
همیشه در پارتیشن سیستم کامپایل میشوند. بهطور پیشفرض، همه برنامههای دیگر در پارتیشن دوم سیستم که استفاده نمیشود
کامپایل میشوند. این امر را میتوان با SYSTEM_OTHER_ODEX_FILTER کنترل کرد که بهطور پیشفرض مقدار زیر را دارد:
SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
بهینهسازی dex پساز بهروزرسانی ازطریق OTA
در دستگاههای دارای 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 را فعال کنید:
adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1adb reboot