تنفيذ مترجم ART just-In-time (JIT)

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

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

هندسة JIT

هندسة JIT
الشكل 1. هندسة JIT.

تجميع JIT

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

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

    JIT الخفي
    الشكل 3. أنشطة JIT daemon.

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

سير عمل JIT

هندسة 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

لتعطيل 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