الفن TI

في Android 8.0 والإصدارات الأحدث، تكشف واجهة ART Tooling (ART TI) عن بعض العناصر الداخلية لوقت التشغيل، وتمكن ملفات التعريف ومصححات الأخطاء من التأثير على سلوك وقت تشغيل التطبيقات. ويمكن استخدام ذلك لتنفيذ أدوات الأداء الحديثة التي يتم توفيرها لتنفيذ الوكلاء الأصليين على الأنظمة الأساسية الأخرى.

يتم الكشف عن العناصر الداخلية في وقت التشغيل للوكلاء الذين تم تحميلهم في عملية وقت التشغيل. يتواصل هؤلاء مع ART من خلال المكالمات المباشرة وعمليات الاسترجاعات. يدعم وقت التشغيل العديد من الوكلاء بحيث يمكن فصل اهتمامات ملفات التعريف المتعامدة المختلفة. قد يتم توفير الوكلاء إما في بداية وقت التشغيل (عند استدعاء dalvikvm أو app_process )، أو إرفاقهم بعملية قيد التشغيل بالفعل.

نظرًا لأن القدرة على أدوات وتعديل سلوك التطبيق ووقت التشغيل قوية جدًا، فقد تم دمج مقياسين للسلامة في ART TI:

  • أولاً، يتم تنفيذ الكود الذي يكشف واجهة الوكيل، JVMTI، كمكون إضافي لوقت التشغيل، وليس مكونًا أساسيًا لوقت التشغيل. قد يتم تقييد تحميل المكونات الإضافية، بحيث يمكن منع الوكلاء من العثور على أي من نقاط الواجهة.
  • ثانيًا، تسمح كل من فئة ActivityManager وعملية وقت التشغيل للوكلاء فقط بالارتباط بالتطبيقات القابلة للتصحيح. تم توقيع التطبيقات القابلة للتصحيح من قبل مطوريها ليتم تحليلها وقياسها، ولا يتم توزيعها على المستخدمين النهائيين. لا يسمح متجر Google Play بتوزيع التطبيقات القابلة للتصحيح. وهذا يضمن عدم إمكانية التحكم في التطبيقات العادية (بما في ذلك المكونات الأساسية) أو معالجتها.

تصميم

يظهر الشكل 1 التدفق العام والترابط في التطبيق المجهز.

Flow and interconnection in an instrumented app
الشكل 1. التدفق والترابط للتطبيق المجهز

يعرض البرنامج المساعد ART libopenjdkjvmti ART TI، والذي تم تصميمه لتلبية احتياجات وقيود النظام الأساسي:

  • تعتمد إعادة تعريف الفئة على ملفات Dex ، التي تحتوي على تعريف فئة واحد فقط، بدلاً من ملفات الفئة.
  • لا يتم عرض واجهات برمجة التطبيقات بلغة Java للأجهزة وإعادة التعريف.

يدعم ART TI أيضًا ملفات تعريف Android Studio.

تحميل أو إرفاق وكيل

لإرفاق وكيل عند بدء تشغيل وقت التشغيل، استخدم هذا الأمر لتحميل كل من البرنامج الإضافي JVMTI والوكيل المحدد:

dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …

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

ملاحظة: لا ينطبق هذا على التطبيقات العادية (بما في ذلك خادم النظام) الموجودة على الجهاز. يتم تشعب التطبيقات من زيجوت قيد التشغيل بالفعل، ولا يُسمح لعملية زيجوت بتحميل الوكلاء.

لإرفاق وكيل بتطبيق قيد التشغيل بالفعل، استخدم هذا الأمر:

adb shell cmd activity attach-agent [process]
/path/to/agent/libagent.so[=agent-options]

إذا لم يتم تحميل البرنامج الإضافي JVMTI بعد، فإن إرفاق الوكيل يؤدي إلى تحميل كل من البرنامج الإضافي ومكتبة الوكيل.

لا يجوز إرفاق الوكيل إلا بتطبيق قيد التشغيل تم وضع علامة عليه على أنه قابل للتصحيح (جزء من بيان التطبيق، مع تعيين السمة android:debuggable على true في عقدة التطبيق). تقوم كل من فئة ActivityManager وART بإجراء عمليات التحقق قبل السماح بإرفاق الوكيل. تتحقق فئة ActivityManager من معلومات التطبيق الحالية (المشتقة من بيانات فئة PackageManager ) بحثًا عن الحالة القابلة للتصحيح، ويتحقق وقت التشغيل من حالته الحالية، والتي تم تعيينها عند بدء تشغيل التطبيق.

مواقع الوكيل

يحتاج وقت التشغيل إلى تحميل الوكلاء في العملية الحالية، بحيث يمكن للوكيل الارتباط بها والتواصل معها مباشرةً. إن ART نفسها لا أدري فيما يتعلق بالموقع المحدد الذي يأتي منه الوكيل. يتم استخدام السلسلة لاستدعاء dlopen . أذونات نظام الملفات وسياسات SELinux تقيد التحميل الفعلي.

لتسليم الوكلاء الذين يمكن تشغيلهم بواسطة تطبيق قابل للتصحيح، قم بما يلي:

  • قم بتضمين الوكيل في دليل المكتبة الخاص بملف APK الخاص بالتطبيق.
  • استخدم run-as لنسخ الوكيل إلى دليل بيانات التطبيق.

واجهات برمجة التطبيقات

تمت إضافة الطريقة التالية إلى 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.

التوافق

تحتاج هذه الميزة إلى دعم وقت التشغيل الأساسي الذي لا يتوفر إلا على نظام التشغيل Android 8.0 والإصدارات الأحدث. لا تحتاج الشركات المصنعة للأجهزة إلى إجراء أي تغييرات لتنفيذ هذه الميزة. إنه جزء من AOSP.

تصديق

تختبر CTS ما يلي على نظام Android 8 والإصدارات الأحدث:

  • الاختبارات التي يعلقها الوكلاء بالتطبيقات القابلة لتصحيح الأخطاء، ويفشلون في إرفاقها بالتطبيقات غير القابلة للتصحيح.
  • يختبر جميع واجهات برمجة تطبيقات JVMTI المنفذة
  • اختبارات أن الواجهة الثنائية للوكلاء مستقرة

تمت إضافة اختبارات إضافية إلى Android 9 والإصدارات الأحدث، وتم تضمينها في اختبارات CTS لتلك الإصدارات.