إعداد ART

تتناول هذه الصفحة كيفية ضبط "مُشغِّل Android" (ART) وخيارات الترجمة. تشمل المواضيع التي يتم تناولها هنا إعداد عملية الترجمة المسبقة لصورة النظام، وdex2oat خيارات الترجمة، وكيفية موازنة مساحة قسم النظام ومساحة قسم البيانات و الأداء.

اطّلِع على ART وDalvik وتنسيق Dalvik القابل للتنفيذ للعمل مع ART. اطّلِع على التحقّق من سلوك التطبيقات على "مُشغِّل Android للوقت الفعلي" (ART) للتأكّد من عمل تطبيقاتك بشكلٍ سليم.

آلية عمل ميزة "التصنيف حسب الفئة العمرية"

يستخدم ART ميزة التجميع مسبقًا (AOT)، وبدءًا من Android 7، يستخدم ميزة مختلطة من التجميع مسبقًا والتجميع أثناء التنفيذ (JIT) والتفسير، ويمكن أن يكون التجميع مسبقًا موجهًا حسب الملف الشخصي. يمكن تعديل كل أوضاع التنفيذ هذه، وسيتمّ مناقشتها في هذا القسم. على سبيل المثال، يتم ضبط أجهزة Pixel للعمل بالطريقة التالية:

  1. يتم تثبيت التطبيق في البداية باستخدام ملف بيانات وصفية dex (.dm) موزَّع من قِبل "متجر Play"، والذي يحتوي على ملف تعريف السحابة الإلكترونية. يُنشئ ART AOT الطرق المدرَجة في ملف ‎"سحابة الإلكترونية". أو إذا تم تثبيت التطبيق بدون ملف بيانات وصفية dex، لن يتم تنفيذ عملية تجميع AOT.
  2. في المرات القليلة الأولى التي يتم فيها تشغيل التطبيق، يتم تفسير الطرق التي لم يتم تجميعها باستخدام AOT. من بين الطرق التي يتم تفسيرها، يتم تجميع تلك التي يتم تنفيذها بشكل متكرر باستخدام تقنية JIT. ينشئ ART ملفًا شخصيًا على الجهاز استنادًا إلى التنفيذ ويدمجه مع الملف الشخصي على السحابة الإلكترونية (إذا كان هناكملف ).
  3. عندما يكون الجهاز في وضع السكون ويتم شحنه، يتم تشغيل برنامج تابع لنظام التشغيل لإعادة تجميع التطبيق استنادًا إلى الملف الشخصي المجمّع الذي تم إنشاؤه خلال عمليات التشغيل القليلة الأولى.
  4. في عمليات التشغيل اللاحقة للتطبيق، يستخدم ART العناصر التي تم إنشاؤها من خلال عملية التجميع الخفيّة، والتي تحتوي على المزيد من الرموز البرمجية المجمّعة باستخدام تقنية AOT مقارنةً بالعناصر التي تم إنشاؤها أثناء عملية التجميع. لا تزال الأساليب التي لم يتم تجميعها باستخدام تقنية AOT تُفسر أو تُجمَّع باستخدام تقنية التجميع أثناء التنفيذ. يعدّل ART عملية تثبيت الملف الشخصي استنادًا إلى التنفيذ، وسيتم بعد ذلك اختيار الملف الشخصي من خلال عمليات التشغيل اللاحقة لبرنامج التشغيل الخفي للترجمة.

يتألف ART من مترجم (أداة dex2oat) ووقت تشغيل (libart.so) يتم تحميله أثناء بدء التشغيل. تأخذ أداة dex2oat ملف APK وتُنشئ ملفًا واحدًا أو أكثر منملفّات عناصر الترجمة والربط التي يحمّلها وقت التشغيل. يختلف عدد الملفات وملفاتها الإضافية وأسماءها من إصدار إلى آخر، ولكن اعتبارًا من إصدار Android 8، يتم إنشاء هذه الملفات:

  • .vdex: يحتوي على بعض البيانات الوصفية الإضافية لتسريع عملية التحقّق، وأحيانًا مع رمز DEX غير المضغوط لملف APK.
  • .odex: يحتوي على رمز تم تجميعه باستخدام تقنية AOT للأساليب في ملف APK.
  • يحتوي .art (optional) على تمثيلات داخلية لاتّقان ART لبعض السلاسل والفئات المدرَجة في حزمة APK، والتي تُستخدَم لتسريع بدء تشغيل التطبيق.

خيارات التحويل البرمجي

هناك فئتان لخيارات الترجمة لـ ART:

  1. إعدادات ذاكرة ROM للنظام: الرمز الذي يتم تجميعه باستخدام ميزة AOT عند إنشاء صورة نظام
  2. إعدادات وقت التشغيل: طريقة تجميع ART للتطبيقات وتشغيلها على جهاز

فلاتر المُجمِّع

من خيارات ART الأساسية لضبط هاتين الفئتَين المُجمِّع الفلاتر. تحدد فلاتر المُجمِّع كيفية تجميع ART لرمز DEX، وهي أحد options التي يتم تمريرها إلى أداة dex2oat. بدءًا من الإصدار 8 من Android، تتوفّر أربعة فلاتر متوافقة رسميًا:

  • verify: لا يتم تشغيل سوى عملية التحقّق من رمز DEX (بدون تجميع AOT).
  • quicken: (إصدار Android 11 أو إصدار أقدم) يُجري هذا الخيار عملية التحقّق من رمز DEX ويُحسِّن بعض تعليمات DEX للحصول على أداء أفضل للمترجم.
  • speed: تُجري عملية التحقّق من رمز DEX وتُجمِّع جميع الطرق باستخدام ميزة AOT. لا يؤدي إلى تحسين تحميل الصفوف لأي صفوف.
  • speed-profile: يُجري هذا الخيار عملية التحقّق من رمز DEX، ويُجمِّع الطرق المُدرَجة في ملف التنقّل المُتقدّم (AOT) فيملف التنقّل المُتقدّم (AOT)، ويُحسِّن عمليات تحميل الفئات للفئات المُدرَجة في الملف.

إعدادات ذاكرة الوصول العشوائي (ROM) للنظام

يتم تجميع المكتبات والتطبيقات المثبَّتة مسبقًا باستخدام ميزة AOT عند إنشاء صورة نظام. تُعرف هذه العملية باسم dexpreopt. يمكن استخدام هذه الملفات المجمّعة ما دامت جميع التبعيات لم تتغيّر، ولا سيما مسار تجميع boot.

ملاحظة: إذا كان الجهاز يتلقّى تحديثات وحدة النظام، من المرجّح جدًا أن يتغيّر مسار تجميع boot classpath في التحديث التالي، ما يجعل جميع ملفات 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 من نظام التشغيل Android والإصدارات الأحدث) تم تجميعه باستخدام فلتر المُجمِّع speed-profile تلقائيًا، أو تم تجميعه باستخدام فلتر المُجمِّع speed في حال عدم توفُّر ملف شخصي.
    • (الإصدار 13 من Android والإصدارات الأقدم) تم تجميعه باستخدام فلتر المُجمِّع speed تلقائيًا.
    يمكن ضبطها من خلال PRODUCT_SYSTEM_SERVER_COMPILER_FILTER (راجِع القسم التالي في هذا المستند).
  • التطبيقات الأساسية الخاصة بالمنتج (راجِع PRODUCT_DEXPREOPT_SPEED_APPS لاحقًا في هذا المستند): يتم تجميعها باستخدام فلتر المُجمِّع speed تلقائيًا.
  • جميع التطبيقات الأخرى: يتم تجميعها باستخدام فلتر المُجمِّع speed-profile تلقائيًا، أو يتم تجميعها باستخدام فلتر المُجمِّع verify في حال عدم توفير ملف تعريف.

    يمكن ضبطها من خلال PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (يُرجى الاطّلاع على القسم التالي في هذا المستند).

خيارات ملف الإنشاء

  • WITH_DEXPREOPT
  • ما إذا كان يتمّ استدعاء dex2oat على رمز DEX المثبّت على صورة النظام مفعَّل تلقائيًا

  • DONT_DEXPREOPT_PREBUILTS (Android 5 والإصدارات الأحدث)
  • يؤدي تفعيل DONT_DEXPREOPT_PREBUILTS إلى منع استخدام ميزة "التثبيت بدون إنترنت" في التطبيقات المُنشأة مسبقًا. هذه هي التطبيقات التي تم تحديد include $(BUILD_PREBUILT) في Android.mk. يؤدي تخطّي dexpreopt للتطبيقات المُنشأة مسبقًا التي يُرجّح تحديثها من خلال Google Play إلى توفير مساحة في صورة النظام، ولكنه يزيد من وقت التشغيل الأول. يُرجى العِلم أنّ هذا الخيار ليس له أي تأثير في التطبيقات المُنشأة مسبقًا والمُحدَّدة في Android.bp.

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (إصدار Android 9 والإصدارات الأحدث)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER تحدد فلتر المُجمِّع التلقائي للتطبيقات التي تم تحسينها باستخدام أداة dexpreopt. يتم تحديد هذه التطبيقات في Android.bp أو تم تحديد include $(BUILD_PREBUILT) في Android.mk. إذا لم يتم تحديد قيمة، تكون القيمة التلقائية هي speed-profile، أو verify إذا لم يتم تحديد قيمة ولم يتم تقديم ملف تجاري.

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (بدءًا من الإصدار 1 من الإصدار المرجعي لنظام التشغيل Android 8)
  • يؤدي تفعيل WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY dexpreopts إلى معالجة classpath لنظام التشغيل وملفّات jar لخادم النظام فقط.

  • LOCAL_DEX_PREOPT
  • يمكن أيضًا تفعيل Dexpreopt أو إيقافه على أساس تطبيق فردي من خلال تحديد الخيار LOCAL_DEX_PREOPT في تعريف الوحدة. يمكن أن يكون هذا مفيدًا لإيقاف ميزة dexpreopt للتطبيقات التي قد تتلقّى فورًا تحديثات من Google Play، لأنّ التحديثات ستجعل الرمز البرمجي الذي تم تحسينه باستخدام dexpreopt في صورة النظام قديمًا. ويُعدّ ذلك مفيدًا أيضًا لتوفير مساحة في عمليات الترقية عبر الهواء لإصدارات مهمة، لأنّه قد يكون لدى المستخدمين إصدارات أحدث من التطبيقات في قسم البيانات.

    يقبل المتغيّر LOCAL_DEX_PREOPT القيمتَين true أو false لمحاولة تفعيل ميزة dexpreopt أو إيقافها، على التوالي. بالإضافة إلى ذلك، يمكن تحديد nostripping إذا كان يجب ألا تزيل أداة dexpreopt ملف classes.dex من ملف APK أو JAR. يتم عادةً إزالة هذا الملف لأنّه لم يعد مطلوبًا بعد dexpreopt، ولكن هذا الخيار الأخير ضروري للسماح باستمرار صلاحية توقيعات حِزم APK التابعة لجهات خارجية.

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • تمرير الخيارات إلى dex2oat للتحكّم في كيفية compiling ملف التمهيد ويمكن استخدامه لتحديد قوائم فئات الصور المخصّصة وقوائم الفئات المُجمَّعة وفلاتر المُجمِّع.

  • 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 (بدءًا من الإصدار 8 من Android)
  • ما إذا كان سيتم تضمين إصدار ART لتصحيح الأخطاء على الجهاز. يتم تفعيل هذه الميزة تلقائيًا لإصدارَي userdebug وeng. يمكن إلغاء هذا السلوك من خلال تحديد الخيار صراحةً على true أو false.

    يستخدم الجهاز تلقائيًا الإصدار غير المخصّص لتصحيح الأخطاء (libart.so). للتبديل، اضبط سمة النظام persist.sys.dalvik.vm.lib.2 على libartd.so.

  • WITH_DEXPREOPT_PIC (حتى Android 7)
  • في الإصدارات من Android 5.1.0 إلى Android 6.0.1، يمكن تحديد WITH_DEXPREOPT_PIC لتفعيل الرمز المستقل عن الموضع (PIC). وبفضل ذلك، لا يلزم إعادة تحديد موقع الرمز المُجمَّع من الصورة من /system إلى /data/dalvik-cache، ما يوفر مساحة في قسم البيانات. ومع ذلك، هناك تأثير بسيط في وقت التشغيل لأنّه يوقف ميزة تحسين تستفيد من الرمز المستند إلى الموضع. عادةً، يجب تفعيل ميزة تجميع PIC على الأجهزة التي تريد توفير مساحة في /data.

    في الإصدار 7.0 من Android، كان يتم تفعيل ميزة تجميع PIC تلقائيًا.

  • WITH_DEXPREOPT_BOOT_IMG_ONLY (حتى Android 7 MR1)
  • تم استبدال هذا الخيار بخيار WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY الذي يحدّد أيضًا ملفات JAR الخاصة بخادم النظام مسبقًا.

  • PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
  • يحدِّد هذا الخيار فلتر المُجمِّع لخادم النظام.

    • (Android 14 والإصدارات الأحدث) في حال عدم تحديده، يتم استخدام فلتر المُجمِّع speed-profile أو فلتر المُجمِّع speed في حال عدم تقديم ملف تعريف.
    • (الإصدار 13 من Android والإصدارات الأقدم) في حال عدم تحديده، يتم استخدام فلتر speed compiler.
    • في حال ضبط القيمة على 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
  • في ما يلي قوائم ملفات JAR التي يحمّلها خادم النظام. يتم تجميع ملفات JAR باستخدام فلتر المُجمِّع المحدَّد بواسطة PRODUCT_SYSTEM_SERVER_COMPILER_FILTER.

    • (مطلوبة) 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 System Server إلى هذه القائمة إلى عدم تحميل تلك الملفات.
    • (اختياري، 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 المستقلة إلى هذه القائمة إلى منجرٍ إلى تعذُّر التمهيد.

    إعداد مسار تحميل الحِزم

    قائمة الفئات المحمَّلة مسبقًا هي قائمة بالفئات التي يبدأها Zygote عند التشغيل. ويؤدي ذلك إلى تجنُّب كل تطبيق تشغيل مثبّتي الفصول بشكل منفصل، ما يتيح له بدء التشغيل بشكل أسرع ومشاركة الصفحات في الذاكرة. يتوفّر ملف قائمة الفئات المحمَّلة مسبقًا في frameworks/base/config/preloaded-classes تلقائيًا، ويحتوي على قائمة تم ضبطها للاستخدام العادي للهاتف. قد يختلف ذلك للأجهزة الأخرى، مثل الأجهزة القابلة للارتداء، ويجب ضبطه وفقًا لذلك. يجب توخّي الحذر عند ضبط هذه القيمة، لأنّ إضافة عدد كبير جدًا من الفئات يؤدي إلى هدر الذاكرة عند تحميل الفئات غير المستخدَمة. تؤدي إضافة عدد قليل جدًا من الفئات إلى اضطرار كل تطبيق إلى امتلاك نسخته الخاصة، ما يؤدي مرة أخرى إلى إهدار الذاكرة.

    مثال على الاستخدام (في device.mk المنتج):

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

    ملاحظة: يجب وضع هذا السطر قبل اكتساب أي ملفات make الخاصة بإعدادات المنتج التي تحصل على الملف التلقائي من build/target/product/base.mk.

    إعدادات وقت التشغيل

    خيارات JIT

    لا تؤثر الخيارات التالية في إصدارات Android إلا في حال توفّر "مجمّع ART أثناء التشغيل".

    • dalvik.vm.usejit: ما إذا كان JIT مفعّلاً أم لا
    • dalvik.vm.jitinitialsize (القيمة التلقائية 64 كيلوبايت): السعة الأولية لذاكرة التخزين المؤقت للرمز. سيتمّت إزالة ذاكرة التخزين المؤقت للرمز البرمجي بانتظام وزيادة حجمها إذا لزم الأمر.
    • dalvik.vm.jitmaxsize (القيمة التلقائية 64 ميغابايت): الحد الأقصى لسعة ذاكرة التخزين المؤقت للرمز.
    • dalvik.vm.jitthreshold (القيمة التلقائية 10000): الحدّ الأدنى الذي يجب أن يجتازه مقياس "الطلبات المرتفعة" لإحدى الطرق من أجل أن تتم تجميع الطريقة باستخدام الترجمة الفورية. مقياس "المحتوى الرائج" هو مقياس داخلي في وقت التشغيل. ويشمل ذلك عدد المكالمات والفروع الخلفية وغيرها من عوامل أخرى.
    • dalvik.vm.usejitprofiles (حتى Android 13): ما إذا كانت ملفّات JIT مفعَّلة أم لا، ويمكن استخدام هذا الإعداد حتى إذا كان dalvik.vm.usejit خطأ. يُرجى العلم أنّه إذا كانت هذه القيمة غير صحيحة، لن يُنشئ فلاتر المُجمِّع speed-profile أي طريقة باستخدام ميزة AOT، وسيكون مكافئًا verify. منذ الإصدار 14 من Android، يتم تفعيل ملفات JIT دائمًا ولا يمكن إيقافها.
    • dalvik.vm.jitprithreadweight (القيمة التلقائية هي dalvik.vm.jitthreshold / 20): وزن "عيّنات" JIT (راجِع jitthreshold) لسلسلة محادثات واجهة مستخدم التطبيق. استخدِم هذه الطريقة لتسريع عملية تجميع methods التي تؤثر بشكل مباشر في تجربة المستخدمين عند تفاعلهم مع التطبيق.
    • 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.
    • dalvik.vm.restore-dex2oat-threads/dalvik.vm.restore-dex2oat-cpu-set:
      • (بدءًا من Android 11 وحتى Android 13) عدد سلاسل المهام ومجموعة نوى وحدة المعالجة المركزية (راجِع المعلومات أدناه) المطلوب استخدامها لاستعادة النسخ الاحتياطية من السحابة الإلكترونية
      • (بدءًا من Android 14) عدد سلاسل المهام ومجموعة نوى وحدة المعالجة المركزية (راجِع المعلومات أدناه) لاستخدامها في كل ما يتطلّب سرعة استجابة أعلى من المعتاد، بما في ذلك الاستعادة من الخدمة الاحتياطية في السحابة الإلكترونية
        • ويتوافق ذلك تحديدًا مع فئة الأولوية 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) المطلوب استخدامها لكل ما عدا ذلك

    يجب تحديد مجموعة من نوى وحدة المعالجة المركزية كقائمة مفصولة بفواصل تتضمّن معرّفات وحدة المعالجة المركزية. على سبيل المثال، لتشغيل on dex2oat على نوى وحدة المعالجة المركزية من 0 إلى 3، اضبط:

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

    عند ضبط خصائص الارتباط بوحدة المعالجة المركزية، ننصحك بمطابقة السمة المقابلة ل عدد سلاسل مهام dex2oat لمطابقة عدد وحدات المعالجة المركزية المحدّدة لتجنّب التنافس غير الضروري على الذاكرة وعمليات 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.
    • 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 (حتى الإصدار 11 من نظام التشغيل Android): فلتر المُجمِّع لصور التمهيد في الإصدار 12 من نظام التشغيل Android، يكون دائمًا فلتر التجميع في صور التشغيل هو speed-profile ولا يمكن تغييره.
    • dalvik.vm.systemservercompilerfilter (بدءًا من Android 13): فلتر المُجمِّع لخادم النظام يُرجى الاطّلاع على PRODUCT_SYSTEM_SERVER_COMPILER_FILTER.
    • dalvik.vm.systemuicompilerfilter (بدءًا من الإصدار 13 من نظام التشغيل Android): فلتر المُجمِّع لحِزمة واجهة المستخدم للنظام
    • dalvik.vm.dex2oat-filter (حتى Android 6): يُستخدم المُجمِّع لفلترة كل العناصر الأخرى.
    • pm.dexopt.<reason> (بدءًا من Android 7): يُستخدم المُجمِّع لفلترة كل العناصر الأخرى. راجِع إعدادات خدمة ART لنظام التشغيل Android 14 والإصدارات الأحدث، أو إعدادات "مدير الحِزم" لنظام التشغيل Android 13 والإصدارات الأقدم.

    خيارات أخرى للتحكّم في تجميع كل شيء بخلاف صور التمهيد:

    • dalvik.vm.dex2oat-very-large (بدءًا من Android 7.1): الحد الأدنى للحجم الإجمالي لملف dex بالبايت لإيقاف عملية التجميع المُسبق للوقت
    • 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) (القيمة التلقائية: خطأ): ما إذا كان سيتم استخدام الإصدار 64 بت من dex2oat.
    • dalvik.vm.bgdexopt.new-classes-percent (بدءًا من Android 12) (القيمة التلقائية: 20): الحد الأدنى للنسبة المئوية، بين 0 و100، للفئات الجديدة في الملف الشخصي لبدء عملية إعادة الترجمة. لا ينطبق ذلك إلا على عملية الترجمة والربط المستندة إلى الملف الشخصي (speed-profile)، وعادةً ما يكون ذلك أثناء عملية dexopt في الخلفية. يُرجى العلم أنّ هناك أيضًا حدًا أدنى يبلغ 50 فئة جديدة بالإضافة إلى الحدّ الأدنى للنسبة المئوية، ولا يمكن ضبطه.
    • dalvik.vm.bgdexopt.new-methods-percent (بدءًا من Android 12) (القيمة التلقائية: 20): الحد الأدنى للنسبة المئوية، بين 0 و100، للأساليب الجديدة في الملف الشخصي لبدء عملية إعادة الترجمة. لا ينطبق ذلك إلا على عملية الترجمة والربط المستندة إلى الملف الشخصي (speed-profile)، وعادةً ما يكون ذلك أثناء عملية تحسين dex في الخلفية. يُرجى العلم أنّ هناك أيضًا حدًا أدنى يبلغ 100 طريقة جديدة بالإضافة إلى الحدّ الأدنى للنسبة المئوية، ولا يمكن ضبطه.
    • dalvik.vm.dex2oat-max-image-block-size (بدءًا من Android 10) (القيمة التلقائية: 524288) الحد الأقصى لحجم الكتلة الثابتة للصور المضغوطة يتم تقسيم الصورة الكبيرة إلى مجموعة من الوحدات الصلبة بحيث لا تكون أي وحدة أكبر من الحد الأقصى للحجم.
    • dalvik.vm.dex2oat-resolve-startup-strings (بدءًا من Android 10) (القيمة التلقائية: true) إذا كانت القيمة true، يؤدي ذلك إلى أن يحلّ dex2oat جميع سلاسل الثابتة التي تتم الإشارة إليها من الطرق التي تم وضع علامة عليها على أنّها "startup" في الملف الشخصي.
    • debug.generate-debug-info (القيمة التلقائية: خطأ) ما إذا كان سيتم إنشاء معلومات تصحيح الأخطاء لتصحيح الأخطاء الأصلية أم لا، مثل معلومات إزالة التفاف الحزمة والرموز ELF والأقسام المصغّرة.
    • dalvik.vm.dex2oat-minidebuginfo (منذ Android 9) (القيمة التلقائية: صحيح) ما إذا كان سيتم إنشاء الحد الأدنى من معلومات تصحيح الأخطاء المضغوطة بتنسيق LZMA اللازمة ل طباعة عمليات تتبُّع الأخطاء.

    خيارات خدمة ART

    منذ الإصدار Android 14، أصبحت خدمة ART تُجري عملية تجميع AOT للتطبيقات على الجهاز (المعروفة أيضًا باسم dexopt). للحصول على معلومات عن ضبط "خدمة ART"، يُرجى الاطّلاع على ضبط "خدمة ART".

    خيارات أداة إدارة الحِزم

    قبل الإصدار 14 من Android، كان مدير الحِزم يعالج عملية تجميع التطبيقات على الجهاز باستخدام تقنية 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/%
    

    تحسين dexopt في وضع عدم الاتّصال بالإنترنت

    على الأجهزة التي تم تفعيل ميزة A/B عليها، يمكن تجميع التطبيقات في الخلفية قبل إعادة التشغيل باستخدام نسخة النظام الجديدة. اطّلِع على تجميع التطبيق في الخلفية لتضمين نص التجميع والبرامج الثنائية اختياريًا في صورة النظام. يتم التحكّم في فلتر التجميع المستخدَم في هذا التجميع باستخدام:

    pm.dexopt.ab-ota=speed-profile
    

    ننصحك باستخدام speed-profile للاستفادة من ميزة compilation (التجميع) الاستنادية إلى الملف الشخصي وتوفير مساحة تخزين.

    خيارات JDWP

    يتم التحكّم في إنشاء سلسلة محادثات Java Debug Wire Protocol (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 1
      adb reboot
      
    بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 13 والإصدارات الأقدم، ينشئ وقت التشغيل سلاسل محادثات JDWP للتطبيقات التي يمكن تصحيح أخطاءها وغير القابلة لتصحيح الأخطاء في إصدارات userdebug. وهذا يعني أنّه من الممكن إرفاق برنامج تصحيح أخطاء أو إنشاء ملف شخصي لأي تطبيق على إصدارات userdebug.