يتضمّن وقت تشغيل Android (ART) مجمّعًا أثناء التنفيذ (JIT) مع ميزة تحديد خصائص الرمز البرمجي التي تحسّن باستمرار أداء تطبيقات Android أثناء تشغيلها. يُكمّل مجمّع JIT مجمّع ART الحالي الذي يسبق وقت التشغيل (AOT) ويحسّن أداء وقت التشغيل، ويوفر مساحة التخزين، ويسرّع تحديثات التطبيقات والنظام. ويحسّن أيضًا أداء مجمّع AOT من خلال تجنُّب تباطؤ النظام أثناء التحديثات التلقائية للتطبيقات أو إعادة تجميع التطبيقات أثناء التحديثات عبر الأجهزة (OTA).
على الرغم من أنّ JIT وAOT يستخدمان المجمّع نفسه مع مجموعة مماثلة من التحسينات، قد لا يكون الرمز البرمجي الذي تم إنشاؤه متطابقًا. يستفيد JIT من معلومات نوع وقت التشغيل، ويمكنه إجراء عملية التضمين بشكل أفضل، ويجعل عملية تجميع الاستبدال على المكدس (OSR) ممكنة، وكل ذلك يؤدي إلى إنشاء رمز برمجي مختلف قليلاً.
بنية JIT
تجميع أثناء التنفيذ
يتضمّن تجميع أثناء التنفيذ الأنشطة التالية:
- يشغّل المستخدِم التطبيق، ما يؤدي إلى تحميل ART لملف
.dex.- إذا كان ملف
.oat(البرنامج الثنائي AOT لملف.dex) متاحًا، يستخدمه وقت تشغيل Android (ART) مباشرةً. على الرغم من إنشاء ملفات.oatبانتظام، لا تحتوي دائمًا على رمز برمجي مجمّع (الثنائي AOT). - إذا كان ملف
.oatلا يحتوي على رمز برمجي مجمّع، يمر ART عبر JIT والمفسّر لتنفيذ ملف.dex.
- إذا كان ملف
- يتم تفعيل JIT لأي تطبيق لم يتم تجميعه وفقًا لفلتر التجميع
speed(الذي يشير إلى "تجميع أكبر قدر ممكن من التطبيق"). - يتم تفريغ بيانات ملف JIT الشخصي في ملف في دليل نظام لا يمكن للتطبيق الوصول إليه إلا.
- يحلّل البرنامج الخفي للتجميع AOT (
dex2oat) هذا الملف لتوجيه عملية التجميع.
الشكل 3. أنشطة البرنامج الخفي JIT
تُعدّ "خدمات Google Play" مثالاً تستخدمه تطبيقات أخرى تتشابه في سلوكها مع المكتبات المشترَكة.
سير عمل JIT
- يتم تخزين معلومات تحديد الخصائص في ذاكرة التخزين المؤقت للرمز البرمجي وتخضع لعملية جمع البيانات غير الضرورية في حال نقص الذاكرة.
- لا يمكن ضمان احتواء اللقطة التي تم التقاطها عندما كان التطبيق في الخلفية على بيانات كاملة (أي كل ما تم تجميعه باستخدام JIT).
- لا تتم محاولة تسجيل كل شيء (لأنّ ذلك قد يؤثر في أداء وقت التشغيل ).
- يمكن أن تكون الطرق في ثلاث حالات مختلفة:
- مفسّرة (رمز برمجي dex)
- مجمّعة باستخدام JIT
- مجمّعة باستخدام AOT
- يعتمد مقدار الذاكرة المطلوب لتشغيل JIT بدون التأثير في أداء التطبيق في المقدّمة على التطبيق المعني. تتطلب التطبيقات الكبيرة ذاكرة أكبر من التطبيقات الصغيرة. وبشكل عام، تستقر التطبيقات الكبيرة عند حوالي 4 ميغابايت.
تفعيل تسجيل JIT
لتفعيل تسجيل JIT، شغِّل الأوامر التالية:
adb rootadb shell stopadb shell setprop dalvik.vm.extra-opts -verbose:jitadb shell start
إيقاف JIT
لإيقاف JIT، شغِّل الأوامر التالية:
adb rootadb shell stopadb shell setprop dalvik.vm.usejit falseadb 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
ملاحظة: يحتفظ هذا الأمر ببيانات الملف الشخصي المحلية.