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

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

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

بنية JIT

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

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

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

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

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

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

سير عمل JIT

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

تفعيل تسجيل الأخطاء في الوقت الفعلي

لتفعيل تسجيل 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 

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