تنفيذ مجمّع ART في الوقت المناسب

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

على الرغم من أنّ ميزة التجميع أثناء التنفيذ وميزة AOT تستخدمان المُجمِّع نفسه مع مجموعة مماثلة من التحسينات، قد لا يكون الرمز الذي تم إنشاؤه متطابقًا. يستفيد JIT من المعلومات من نوع بيئة التشغيل، ويمكنه تنفيذ عملية تضمين أفضل، ويجعل تجميع استبدال التكديس (OSR) ممكنًا، وكل ذلك ينتج عنه تعليمات برمجية مختلفة قليلاً.

بنية التجميع أثناء التشغيل (JIT)

بنية التجميع أثناء التشغيل (JIT)
الشكل 1. بنية JIT.

تجميع JIT

يتضمن التجميع في JIT الأنشطة التالية:

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

    البرنامج الخفي لترجمة JavaScript أثناء التنفيذ
    الشكل 3. أنشطة البرنامج الخفي في JIT.

خدمة Google Play هي مثال على التطبيقات الأخرى التي تتصرف بطريقة مشابهة للمكتبات المشتركة.

سير عمل JIT

بنية JIT
الشكل 4. تدفق البيانات أثناء التنفيذ
  • يتم تخزين معلومات التحليل في ذاكرة التخزين المؤقت للرمز وتخضع لجمع المهملات في حال الضغط على الذاكرة.
    • وليس هناك ما يضمن احتواء اللقطة التي يتم التقاطها عندما كان التطبيق في الخلفية على بيانات كاملة (أي جميع البيانات التي تم جمعها باستخدام JIT).
    • وليست هناك محاولة لضمان تسجيل كل البيانات (لأن ذلك قد يؤثر في أداء بيئة التشغيل).
  • يمكن أن تكون الطرق في ثلاث حالات مختلفة:
    • مفسَّرة (رمز dex)
    • تم تجميعه أثناء التنفيذ
    • تم تجميعه باستخدام تقنية AOT
    إذا كان رمز AOT ورمز JIT متوفّرَين (على سبيل المثال، بسبب عمليات إلغاء التحسين المتكرّرة)، يُفضّل استخدام الرمز المُنشئ أثناء التشغيل.
  • تعتمد متطلبات الذاكرة لتشغيل JIT بدون التأثير في أداء التطبيقات التي تعمل في المقدّمة على التطبيق المعني. تتطلّب التطبيقات الكبيرة مزيدًا من الذاكرة مقارنةً بالتطبيقات الصغيرة. بشكل عام، يصل حجم التطبيقات الكبيرة إلى 4 ميغابايت تقريبًا.

تفعيل تسجيل JIT

لتفعيل تسجيل JIT، شغِّل الطلبات التالية:

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

إيقاف ميزة "التجميع أثناء التنفيذ"

لإيقاف JIT، شغِّل الأوامر التالية:

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start

فرض عملية التجميع

لفرض التجميع، شغِّل ما يلي:

adb shell cmd package compile

حالات الاستخدام الشائعة لاجبار تجميع حزمة معيّنة:

  • المستندة إلى الملف الشخصي:
    adb shell cmd package compile -m speed-profile -f my-package
    
  • كامل:
    adb shell cmd package compile -m speed -f my-package
    

حالات الاستخدام الشائعة لاجبار تجميع جميع الحِزم:

  • المستندة إلى الملف الشخصي:
    adb shell cmd package compile -m speed-profile -f -a
    
  • كامل:
    adb shell cmd package compile -m speed -f -a
    

محو بيانات الملف الشخصي

على الإصدار 13 من Android أو الإصدارات الأقدم

لمحو بيانات الملف الشخصي على الجهاز وإزالة الرمز المجمّع، نفِّذ ما يلي:

adb shell pm compile --reset 

على الإصدار 14 من Android أو الإصدارات الأحدث

لمحو بيانات الملف الشخصي على الجهاز فقط:

adb shell pm art clear-app-profiles 

ملاحظة: على عكس الأمر المخصّص لنظام التشغيل Android 13 أو الإصدارات الأقدم، لا يؤدي هذا الأمر إلى محو بيانات الملف الشخصي الخارجي (`.dm`) التي تم تثبيتها مع التطبيق.

لمحو بيانات الملف الشخصي على الجهاز وإزالة الرمز المجمَّع الذي تم إنشاؤه من بيانات الملف الشخصي على الجهاز (أي إعادة الضبط إلى حالة التثبيت)، يمكنك تنفيذ ما يلي:

adb shell pm compile --reset 

ملاحظة: لا يزيل هذا الأمر الرمز المجمَّع الذي تم إنشاؤه من بيانات الملف الشخصي الخارجي (‎.dm) التي تم تثبيتها مع التطبيق.

لمحو جميع الرموز البرمجية المجمَّعة، نفِّذ الأمر التالي:

adb shell cmd package compile -m verify -f 

ملاحظة: يحتفظ هذا الأمر ببيانات الملف الشخصي على الجهاز.