تكوين الفن

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

راجع ART وDalvik والتنسيق القابل للتنفيذ Dalvik للعمل مع ART. راجع التحقق من سلوك التطبيق في Android Runtime (ART) للتأكد من أن تطبيقاتك تعمل بشكل صحيح.

كيف يعمل الفن

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

  1. يتم تثبيت التطبيق في البداية باستخدام ملف بيانات التعريف dex ( .dm ) الذي يتم توزيعه بواسطة متجر Play، والذي يحتوي على ملف تعريف سحابي. يقوم ART AOT بتجميع الطرق المدرجة في ملف تعريف السحابة. أو، إذا تم تثبيت التطبيق بدون ملف بيانات تعريف dex، فلن يتم تنفيذ تجميع AOT.
  2. في المرات القليلة الأولى التي يتم فيها تشغيل التطبيق، يتم تفسير الأساليب التي لم يتم تجميعها بواسطة AOT. من بين الطرق المفسرة، تلك التي يتم تنفيذها بشكل متكرر يتم تجميعها بعد ذلك بواسطة JIT. يقوم ART بإنشاء ملف تعريف محلي بناءً على التنفيذ ودمجه مع ملف تعريف السحابة (إن وجد).
  3. عندما يكون الجهاز خاملاً ويتم شحنه، يتم تشغيل برنامج الترجمة لإعادة ترجمة التطبيق استنادًا إلى ملف التعريف المدمج الذي تم إنشاؤه أثناء عمليات التشغيل القليلة الأولى.
  4. في عمليات التشغيل اللاحقة للتطبيق، يستخدم ART القطع الأثرية التي تم إنشاؤها بواسطة البرنامج الخفي للتجميع، والتي تحتوي على المزيد من التعليمات البرمجية المترجمة بواسطة AOT، مقارنة بتلك التي تم إنشاؤها أثناء الأساليب التي لم يتم تجميعها بواسطة AOT لا تزال يتم تفسيرها أو تجميعها بواسطة JIT. يقوم 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 وهو خيار تم تمريره إلى أداة 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 التي تم تجميعها في ذاكرة ROM للنظام إلى أربع فئات:

  • كود مسار فئة التمهيد: يتم تجميعه باستخدام مرشح برنامج التحويل البرمجي لملف 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 (انظر لاحقًا في هذا المستند).
  • التطبيقات الأساسية الخاصة بالمنتج (راجع 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 مرشح المحول البرمجي الافتراضي للتطبيقات التي تم اختيارها. تم تعريف هذه التطبيقات في Android.bp أو include $(BUILD_PREBUILT) المحدد في Android.mk الخاص بها. إذا كانت غير محددة، فإن القيمة الافتراضية هي speed-profile ، أو verify مما إذا كانت القيمة غير محددة ولم يتم توفير ملف التعريف.

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (منذ Android 8 MR1)
  • يؤدي تمكين WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY إلى dexpreopts فقط لمسار فئة التمهيد وجرة خادم النظام.

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

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

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • يمرر الخيارات إلى dex2oat للتحكم في كيفية تجميع صورة التمهيد. يمكن استخدامه لتحديد قوائم فئات الصور المخصصة، وقوائم الفئات المترجمة، ومرشحات المترجم.

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • يمرر الخيارات إلى dex2oat للتحكم في كيفية تجميع كل شيء إلى جانب صورة التمهيد.

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • يوفر القدرة على تمرير خيارات dex2oat لوحدة معينة وتكوين المنتج. تم تعيينه في ملف device.mk الخاص بالمنتج بواسطة $(call add-product-dex-preopt-module-config,<modules>,<option>) حيث <modules> عبارة عن قائمة بأسماء LOCAL_MODULE و LOCAL_PACKAGE لملفات JAR وAPK ، على التوالى.

  • PRODUCT_DEXPREOPT_SPEED_APPS (منذ Android 8)
  • قائمة بالتطبيقات التي تم تحديدها على أنها أساسية للمنتجات والتي من المرغوب تجميعها باستخدام عامل تصفية برنامج التحويل البرمجي speed . على سبيل المثال، تحصل التطبيقات الدائمة مثل SystemUI على فرصة لاستخدام الترجمة الموجهة بالملف الشخصي فقط عند إعادة التشغيل التالية، لذلك قد يكون من الأفضل للمنتج أن تكون هذه التطبيقات دائمًا مترجمة بواسطة AOT.

  • PRODUCT_SYSTEM_SERVER_APPS (منذ Android 8)
  • قائمة التطبيقات التي تم تحميلها بواسطة خادم النظام. يتم تجميع هذه التطبيقات افتراضيًا باستخدام مرشح مترجم speed .

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

    في Android 7.0، تم تمكين تجميع 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 إذا لم يتم توفير ملف تعريف.
    • (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
  • فيما يلي قوائم JARs التي تم تحميلها بواسطة خادم النظام. يتم تجميع ملفات JAR باستخدام مرشح المترجم المحدد بواسطة PRODUCT_SYSTEM_SERVER_COMPILER_FILTER

    • (مطلوب) PRODUCT_SYSTEM_SERVER_JARS : قائمة JARs لمسار فئة خادم النظام على النظام الأساسي (أي كجزء من SYSTEMSERVERCLASSPATH ). يلزم إضافة ملفات JAR الخاصة بمسار خادم النظام إلى هذه القائمة. يؤدي الفشل في إضافة ملفات JAR الخاصة بمسار خادم النظام إلى القائمة إلى عدم تحميل ملفات JAR هذه.
    • (مطلوب) PRODUCT_APEX_SYSTEM_SERVER_JARS : قائمة JARs الخاصة بمسار خادم النظام والتي يتم تسليمها مع APEX (أي كجزء من SYSTEMSERVERCLASSPATH ). التنسيق هو <apex name>:<jar name> . مطلوب إضافة JARs لمسار خادم نظام APEX إلى هذه القائمة. يؤدي الفشل في إضافة ملفات JAR الخاصة بمسار خادم نظام APEX إلى هذه القائمة إلى عدم تحميل ملفات JAR هذه.
    • (اختياري، Android 13 والإصدارات الأقدم) PRODUCT_STANDALONE_SYSTEM_SERVER_JARS : قائمة JARs التي يقوم خادم النظام بتحميلها ديناميكيًا باستخدام أدوات تحميل فئة منفصلة (من خلال SystemServiceManager.startServiceFromJar ). إن إضافة ملفات JAR الخاصة بخادم النظام المستقل إلى هذه القائمة ليس أمرًا مطلوبًا ولكن يوصى به بشدة لأنه يجعل ملفات JAR مجمعة وبالتالي تتمتع بأداء جيد في وقت التشغيل.
    • (مطلوب منذ Android 13) PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS : قائمة JARs التي تم تسليمها مع APEX والتي يقوم خادم النظام بتحميلها ديناميكيًا باستخدام أدوات تحميل فئة منفصلة (أي من خلال SystemServiceManager.startServiceFromJar أو تم الإعلان عنها كـ <apex-system-service> ). التنسيق هو <apex name>:<jar name> . مطلوب إضافة JARs لخادم نظام APEX المستقل إلى هذه القائمة. يؤدي الفشل في إضافة JARs لخادم نظام APEX المستقل إلى هذه القائمة إلى فشل التمهيد.

    تكوين مسار فئة التمهيد

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

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

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

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

    تكوين وقت التشغيل

    خيارات جيت

    تؤثر الخيارات التالية على إصدارات Android فقط حيث يتوفر برنامج التحويل البرمجي ART JIT.

    • dalvik.vm.usejit : ما إذا كان JIT ممكّنًا أم لا.
    • dalvik.vm.jitinitialsize (افتراضي 64 كيلو بايت): السعة الأولية لذاكرة التخزين المؤقت للتعليمات البرمجية. سيتم تخزين ذاكرة التخزين المؤقت للتعليمات البرمجية بشكل منتظم في GC وتزداد إذا لزم الأمر.
    • dalvik.vm.jitmaxsize (افتراضي 64M): السعة القصوى لذاكرة التخزين المؤقت للتعليمات البرمجية.
    • dalvik.vm.jitthreshold (افتراضي 10000): الحد الأدنى الذي يجب أن يتجاوزه عداد "درجة الحرارة" للطريقة حتى يتم تجميع الطريقة بواسطة JIT. عداد "السخونة" هو مقياس داخلي لوقت التشغيل. ويتضمن عدد المكالمات والفروع الخلفية وعوامل أخرى.
    • dalvik.vm.usejitprofiles (حتى Android 13): سواء تم تمكين ملفات تعريف JIT أم لا؛ يمكن استخدام هذا حتى لو كان dalvik.vm.usejit خطأ. لاحظ أنه إذا كان هذا خطأ، 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، في حين أن الخيارات التي تمت مناقشتها في قسم تكوين System 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): عدد الخيوط ومجموعة نوى وحدة المعالجة المركزية (انظر أدناه) المستخدمة في الخلفية.
      • على وجه التحديد، يتوافق هذا مع فئة الأولوية PRIORITY_BACKGROUND في خدمة ART.
    • dalvik.vm.dex2oat-threads / dalvik.vm.dex2oat-cpu-set : عدد الخيوط ومجموعة نوى وحدة المعالجة المركزية المستخدمة في كل شيء آخر.

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

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

    عند تعيين خصائص تقارب وحدة المعالجة المركزية، نوصي بمطابقة الخاصية المقابلة لعدد سلاسل عمليات dex2oat لمطابقة عدد وحدات المعالجة المركزية المحددة لتجنب الذاكرة غير الضرورية وتنافس الإدخال/الإخراج:

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

    بالإضافة إلى خصائص النظام المذكورة أعلاه، يمكنك أيضًا استخدام ملفات تعريف المهام للتحكم في استخدام موارد dex2oat (راجع طبقة تجريد المجموعة Cgroup ).

    ملفات تعريف المهام المدعومة هي:

    • 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 (حتى Android 11): مرشح المترجم لصور التمهيد. منذ Android 12، يكون مرشح المترجم لصور التمهيد دائمًا هو 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> (منذ Android 7): عامل تصفية المترجم لكل شيء آخر. راجع تكوين خدمة ART لنظام Android 14 والإصدارات الأحدث، أو تكوين مدير الحزم لنظام Android 13 والإصدارات الأقدم.

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

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

    خيارات خدمة ART

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

    خيارات مدير الحزم

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

    تكوين محدد أ/ب

    تكوين مدمج

    بدءًا من 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

    يتم التحكم في إنشاء مؤشر ترابط 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.