في الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث، تعرض واجهة ART Tooling Interface (ART TI) بعض العناصر الداخلية لوقت التشغيل، وتتيح لأدوات تحليل الأداء ومصحّحات الأخطاء التأثير في سلوك وقت تشغيل التطبيقات. ويمكن استخدام ذلك لتنفيذ أحدث أدوات الأداء التي يتم توفيرها لتنفيذ المساعِدين الأصليين على منصات أخرى.
يتم عرض العناصر الداخلية لوقت التشغيل للوكلاء الذين تم تحميلهم في عملية وقت التشغيل.
ويتواصل هؤلاء مع فريق ART من خلال المكالمات المباشرة والمكالمات المُعاد إجراؤها. يتيح وقت التشغيل استخدام وكلاء متعدّدين حتى يمكن فصل المخاوف المختلفة المتعلّقة بالملف الشخصي المتعامَد. يمكن توفير العوامل إما عند بدء وقت التشغيل (عند
استدعاءdalvikvm
أو app_process
) أو إرفاقها
بعملية قيد التشغيل.
بما أنّ إمكانية قياس وتعديل سلوك التطبيق ووقت التشغيل مفيدة للغاية، تم دمج تدبيرَي أمان في أداة تحليل أدوات تطوير البرامج (ART TI):
- أولاً، يتم تنفيذ الرمز الذي يعرِض واجهة الوكيل، JVMTI، كأحد ملفّات برمجية تكميلية لوقت التشغيل، وليس كمكوّن أساسي لوقت التشغيل. قد يتم تقييد تحميل المكوّنات الإضافية، حتى لا يتمكّن موظّفو الدعم من العثور على أيّ من نقاط واجهة العميل.
- ثانيًا، لا تسمح كلّ من فئة
ActivityManager
وعملية التشغيل للموظفين إلا بالانضمام إلى التطبيقات التي يمكن تصحيح أخطاءها. تم التوقيع على التطبيقات القابلة لتصحيح الأخطاء من قِبل مطوّريها ليتم تحليلها واستخدامها، ولا يتم توزيعها على المستخدمين النهائيين. لا يسمح متجر Google Play بتوزيع التطبيقات التي يمكن تصحيح أخطاءها. يضمن ذلك عدم إمكانية استخدام التطبيقات العادية (بما في ذلك المكوّنات الأساسية) أو التلاعب بها.
التصميم
يوضّح الشكل 1 عملية التنقّل العامة والربط في تطبيق تمّ اختباره.

يعرِض المكوّن الإضافي لـ ART libopenjdkjvmti
واجهة برمجة التطبيقات ART TI، وهي
مصمّمة لاستيعاب احتياجات المنصة والقيود المفروضة عليها:
- تستند إعادة تعريف الفئة إلى ملفات
Dex
التي تحتوي على تعريف فئة واحد فقط بدلاً من ملفات الفئات. - لا يتم عرض واجهات برمجة التطبيقات بلغة Java لأدوات القياس وإعادة التعريف.
تتوافق أداة ART TI أيضًا مع أدوات تحليل الأداء في "استوديو Android".
تحميل وكيل أو إرفاقه
لإرفاق وكيل عند بدء التشغيل في وقت التشغيل، استخدِم هذا الأمر لتحميل كلّ من المكوّن الإضافي JVMTI والوكيل المحدّد:
dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …
لا يتم اتخاذ إجراءات أمان عند تحميل وكيل في وقت التشغيل عند بدء التشغيل، لذا يُرجى العِلم أنّ وقت التشغيل الذي يتم بدؤه يدويًا يسمح بالتعديل الكامل بدون إجراءات أمان. (يسمح هذا الإجراء باختبار ART).
ملاحظة: لا ينطبق ذلك على التطبيقات العادية (بما في ذلك خادم النظام) على الجهاز. يتم إنشاء التطبيقات من نواة zygote قيد التشغيل، ولا يُسمح لعملية zygote بتحميل العوامل.
لإرفاق وكيل بتطبيق قيد التشغيل، استخدِم الأمر التالي:
adb shell cmd activity attach-agent [process] /path/to/agent/libagent.so[=agent-options]
إذا لم يتم تحميل المكوّن الإضافي JVMTI بعد، يؤدي إرفاق وكيل إلى تحميل كلٍّ من المكوّن الإضافي ومكتبة الوكيل.
لا يمكن ربط وكيل إلا بتطبيق قيد التشغيل تم وضع علامة عليه يمكن تصحيح أخطاءه (جزء من بيان التطبيق، مع ضبط سمة
android:debuggable
على true
في node
التطبيق). تُجري كلّ من فئة ActivityManager
وART عمليات
تحقّق قبل السماح بإرفاق موظّف دعم. تتحقّق فئة ActivityManager
من معلومات التطبيق الحالية (المشتقة من بيانات فئة PackageManager
) بحثًا عن الحالة التي يمكن تصحيح أخطاءها، وتتحقّق مرحلة التشغيل من حالتها الحالية،
التي تم ضبطها عند بدء تشغيل التطبيق.
المواقع الجغرافية للوكلاء
يجب أن تحمِّل بيئة التشغيل موظّفي الدعم إلى العملية الحالية، لكي يتمكّن موظّف الدعم
من الربط بها مباشرةً والتواصل معها. لا يعتمد نظام ART على معرفة الموقع الجغرافي المحدّد الذي يأتي منه موظّف الدعم. يتم استخدام السلسلة
لمكالمة dlopen
. تؤدي أذونات نظام الملفات وسياسات SELinux
إلى حظر التحميل الفعلي.
لإرسال وكلاء يمكن تشغيلهم من خلال تطبيق قابل لتصحيح الأخطاء، اتّبِع الخطوات التالية:
- يجب تضمين الوكيل في دليل المكتبة الخاص بملف APK للتطبيق.
- استخدِم
run-as
لنسخ الوكيل إلى directoryملف بيانات التطبيق.
واجهات برمجة التطبيقات
تمّت إضافة الطريقة التالية إلى android.os.Debug
.
/** * Attach a library as a jvmti agent to the current runtime, with the given classloader * determining the library search path. * Note: agents may only be attached to debuggable apps. Otherwise, this function will * throw a SecurityException. * * @param library the library containing the agent. * @param options the options passed to the agent. * @param classLoader the classloader determining the library search path. * * @throws IOException if the agent could not be attached. * @throws a SecurityException if the app is not debuggable. */ public static void attachJvmtiAgent(@NonNull String library, @Nullable String options, @Nullable ClassLoader classLoader) throws IOException {
واجهات برمجة تطبيقات Android الأخرى
يكون الأمر attach-agent مرئيًا للجميع. يربط هذا الأمر وكيل JVMTI بعملية جارية:
adb shell 'am attach-agent com.example.android.displayingbitmaps \'/data/data/com.example.android.displayingbitmaps/code_cache/libfieldnulls.so=Ljava/lang/Class;.name:Ljava/lang/String;\''
تشبه الأوامر am start -P
وam
start-profiler/stop-profiler
الأمر attach-agent.
JVMTI
توفّر هذه الميزة واجهة برمجة التطبيقات JVMTI للعملاء (الرمز الأصلي). تشمل الإمكانات المهمة ما يلي:
- إعادة تعريف فئة
- تتبُّع تخصيص الكائنات وجمع المهملات
- تكرار جميع العناصر في حزمة، باتّباع شجرة مرجع العناصر
- فحص حزم استدعاء Java
- تعليق (واستئناف) جميع سلاسل المحادثات
قد تتوفّر إمكانات مختلفة في إصدارات مختلفة من Android.
التوافق
تتطلّب هذه الميزة توافق وقت التشغيل الأساسي الذي لا يتوفّر إلا على الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث. ولا يحتاج مصنعو الأجهزة إلى إجراء أي تغييرات لتنفيذ هذه الميزة. وهو جزء من AOSP.
التحقُّق
تختبر مجموعة اختبار التوافق (CTS) ما يلي على نظام التشغيل Android 8 والإصدارات الأحدث:
- الاختبارات التي يُرفقها موظّفو الدعم بالتطبيقات التي يمكن تصحيح أخطاءها، ولا يمكنهم إرفاقها بالتطبيقات التي لا يمكن تصحيح أخطاءها
- اختبار جميع واجهات برمجة تطبيقات JVMTI التي تم تنفيذها
- اختبارات لضمان ثبات واجهة الوكيل الثنائية
تمت إضافة اختبارات إضافية إلى الإصدار 9 من Android والإصدارات الأحدث، ويتم تضمينها في اختبارات CTS لهذه الإصدارات.