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

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

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

هندسة جيت

هندسة جيت
الشكل 1. بنية JIT.

تجميع JIT

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

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

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

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

سير عمل JIT

هندسة جيت
الشكل 4. تدفق البيانات JIT.
  • يتم تخزين معلومات ملفات التعريف في ذاكرة التخزين المؤقت للتعليمات البرمجية وإخضاعها لجمع البيانات المهملة تحت ضغط الذاكرة.
    • ليس هناك ما يضمن أن اللقطة التي تم التقاطها عندما كان التطبيق في الخلفية ستحتوي على بيانات كاملة (على سبيل المثال، كل ما تم JITed).
    • لا توجد محاولة لضمان تسجيل كل شيء (لأن ذلك قد يؤثر على أداء وقت التشغيل).
  • يمكن أن تكون الطرق في ثلاث حالات مختلفة:
    • مترجم (رمز dex)
    • JIT جمعت
    • تم تجميع AOT
    في حالة وجود كود JIT وAOT (على سبيل المثال بسبب عمليات إلغاء التحسين المتكررة)، يُفضل كود JITed.
  • تعتمد متطلبات الذاكرة لتشغيل 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
    

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

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

  • لحزمة واحدة:
    adb shell cmd package compile --reset my-package
    
  • لجميع الحزم:
    adb shell cmd package compile --reset -a