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

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

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

بنية JIT

بنية JIT
الشكل 1. بنية JIT

تجميع أثناء التنفيذ

يتضمّن تجميع أثناء التنفيذ الأنشطة التالية:

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

    البرنامج الخفي JIT
    الشكل 3. أنشطة البرنامج الخفي JIT

تُعدّ "خدمات Google Play" مثالاً تستخدمه تطبيقات أخرى تتشابه في سلوكها مع المكتبات المشترَكة.

سير عمل JIT

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

تفعيل تسجيل JIT

لتفعيل تسجيل JIT، شغِّل الأوامر التالية:

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

إيقاف JIT

لإيقاف 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
    

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

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

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

adb shell pm compile --reset 

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

لمحو بيانات الملف الشخصي المحلية فقط:

adb shell pm art clear-app-profiles 

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

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

adb shell pm compile --reset 

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

لمحو كل الرمز البرمجي المجمّع، شغِّل هذا الأمر:

adb shell cmd package compile -m verify -f 

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