در Android 8.0 و بالاتر، «میانای ابزارسازی ART» (ART TI) برخیاز درونبرنامههای زمان اجرا را آشکار میکند و به نمایهگرها و اشکالزداها امکان میدهد بر عملکرد زمان اجرای برنامهها تأثیر بگذارند. از این میتوان برای پیادهسازی ابزارهای عملکردی پیشرفتهای که برای پیادهسازی عاملهای بومی در پلاتفرمهای دیگر ارائه شدهاند استفاده کرد.
درونمایههای زمان اجرا برای عاملهایی که در فرایند زمان اجرا بار شدهاند آشکار میشود.
اینها ازطریق تماسهای مستقیم و تماسهای برگشتی با ART ارتباط برقرار میکنند. زمان اجرا از چند عامل پشتیبانی میکند تا نگرانیهای مختلف نمایهسازی متعامد از هم جدا شوند. کارگزاران ممکن است در زمان شروع زمان اجرا (زمانی که dalvikvm یا app_process فراخوانی میشوند) ارائه شوند یا به فرایند درحال اجرا پیوست شوند.
ازآنجاییکه قابلیت ابزاربندی و اصلاح رفتار برنامه و زمان اجرا بسیار قدرتمند است، دو اقدام ایمنی در ART TI ادغام شده است:
- ابتدا، کدی که میانای عامل، JVMTI، را افشا میکند بهعنوان افزونه زمان اجرا پیادهسازی میشود، نه بهعنوان مؤلفه اصلی زمان اجرا. ممکن است بار کردن افزونه محدود شود تا عاملها نتوانند هیچکدام از نقاط میانای کاربری را پیدا کنند.
- دوم، هم کلاس
ActivityManagerو هم فرایند زمان اجرا فقط به عاملها اجازه میدهند به برنامههای اشکالزداییپذیر پیوست شوند. برنامههای قابلاشکالزدایی توسط توسعهدهندگانشان برای تجزیهوتحلیل و ابزارسازی تأیید شدهاند و برای کاربران نهایی توزیع نمیشوند. «فروشگاه Google Play» اجازه توزیع برنامههای قابلاشکالزدایی را نمیدهد. این کار تضمین میکند که برنامههای عادی (ازجمله مؤلفههای اصلی) نمیتوانند ابزاربندی یا دستکاری شوند.
طراحی
جریان کلی و اتصال داخلی در برنامه ابزاردار در شکل ۱ نشان داده شده است.
افزایه ART libopenjdkjvmti «میانای ابزار ART» را نمایان میکند که
برای برآورده کردن نیازها و محدودیتهای پلاتفرم طراحی شده است:
- تعریف مجدد کلاس براساس
Dexفایل است که بهجای فایلهای کلاس، فقط حاوی یک تعریف کلاس است. - میاناهای برنامهسازی کاربردی زبان جاوا برای ابزار دقیق و بازتعریف درمعرض دید قرار نمیگیرند.
ART TI از نمایهگرهای «استودیو Android» نیز پشتیبانی میکند.
بار کردن یا پیوست کردن عامل
برای پیوست کردن نماینده در زمان راهاندازی زمان اجرا، از این دستور برای بار کردن هم افزایه 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» را برای عاملها (کد بومی) نمایان میکند. قابلیتهای مهم عبارتاند از:
- تعریف مجدد کلاس.
- درحال ردیابی تخصیص شیء و جمعآوری زباله.
- تکرار کردن همه اشیاء در پشته، دنبال کردن درخت مرجع اشیاء.
- درحال بازرسی پشتههای تماس جاوا.
- درحال تعلیق (و ازسرگیری) همه رشتهها.
قابلیتهای مختلف ممکن است در نسخههای مختلف Android دردسترس باشد.
سازگاری
این ویژگی به پشتیبانی زمان اجرای هسته نیاز دارد که فقط در Android نسخه ۸.۰ و بالاتر دردسترس است. تولیدکنندگان دستگاه برای پیادهسازی این ویژگی نیازی به ایجاد تغییر ندارند. این برنامه بخشی از AOSP است.
اعتبارسنجی
CTS موارد زیر را در Android 8 و بالاتر آزمایش میکند:
- آزمایشهایی که عاملها به برنامههای اشکالزداییپذیر پیوست میکنند و به برنامههای اشکالزداییناپذیر پیوست نمیکنند.
- همه میاناهای برنامهسازی کاربردی JVMTI پیادهسازیشده را آزمایش میکند
- آزمایش میکند که رابط باینری برای عاملها پایدار است
آزمایشهای بیشتری به Android نسخه ۹ و بالاتر اضافه شده است و در آزمایشهای CTS برای این نسخهها گنجانده شده است.