هنر TI

در اندروید 8.0 و بالاتر، رابط ابزار ART (ART TI) بخش‌های داخلی زمان اجرا مشخصی را در معرض دید قرار می‌دهد و به نمایه‌سازها و اشکال‌زداها اجازه می‌دهد بر رفتار زمان اجرا برنامه‌ها تأثیر بگذارند. این را می توان برای پیاده سازی ابزارهای عملکردی پیشرفته ای که برای پیاده سازی عوامل بومی بر روی پلتفرم های دیگر ارائه شده است، استفاده کرد.

داخلی های زمان اجرا در معرض عواملی قرار می گیرند که در فرآیند زمان اجرا بارگذاری شده اند. اینها از طریق تماس مستقیم و تماس با ART ارتباط برقرار می کنند. زمان اجرا از چندین عامل پشتیبانی می‌کند تا نگرانی‌های مختلف نمایه متعامد را بتوان از هم جدا کرد. Agent ها ممکن است در زمان شروع اجرا (زمانی که dalvikvm یا app_process فراخوانی می شوند)، یا به یک فرآیند در حال اجرا متصل شوند.

از آنجایی که توانایی ابزارسازی و تغییر رفتار برنامه و زمان اجرا بسیار قدرتمند است، دو معیار ایمنی در ART TI ادغام شده است:

  • ابتدا، کدی که رابط عامل، JVMTI را نشان می‌دهد، به‌عنوان یک افزونه زمان اجرا پیاده‌سازی می‌شود، نه جزء اصلی زمان اجرا. بارگذاری پلاگین ممکن است محدود شود، به طوری که عوامل نمی توانند هر یک از نقاط رابط را پیدا کنند.
  • دوم، هم کلاس ActivityManager و هم فرآیند زمان اجرا فقط به عوامل اجازه می‌دهند به برنامه‌های قابل اشکال‌زدایی متصل شوند. برنامه‌های قابل اشکال‌زدایی توسط توسعه‌دهندگانشان امضا شده‌اند تا مورد تجزیه و تحلیل و ابزار دقیق قرار گیرند، و بین کاربران نهایی توزیع نمی‌شوند. فروشگاه Google Play به توزیع برنامه‌های قابل اشکال‌زدایی اجازه نمی‌دهد. این تضمین می کند که برنامه های معمولی (از جمله اجزای اصلی) نمی توانند ابزار یا دستکاری شوند.

طراحی

جریان کلی و اتصال متقابل در یک برنامه ابزار دقیق در شکل 1 نشان داده شده است.

Flow and interconnection in an instrumented app
شکل 1. جریان و اتصال یک برنامه ابزاردار

پلاگین ART libopenjdkjvmti ART TI را نشان می دهد که برای پاسخگویی به نیازها و محدودیت های پلتفرم طراحی شده است:

  • تعریف مجدد کلاس بر اساس فایل‌های Dex است که به جای فایل‌های کلاس فقط یک تعریف کلاس دارد.
  • APIهای زبان جاوا برای ابزار دقیق و تعریف مجدد در معرض نمایش نیستند.

ART TI همچنین از پروفایل‌های اندروید استودیو پشتیبانی می‌کند.

یک عامل را بارگیری یا وصل کنید

برای پیوست کردن یک عامل در زمان راه اندازی، از این دستور برای بارگیری افزونه JVMTI و عامل داده شده استفاده کنید:

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

هنگامی که یک عامل در هنگام راه اندازی زمان اجرا بارگذاری می شود، اقدامات ایمنی وجود ندارد، بنابراین به خاطر داشته باشید که زمان اجرا به صورت دستی امکان اصلاح کامل بدون اقدامات ایمنی را فراهم می کند. (این اجازه آزمایش ART را می دهد.)

توجه: این برای برنامه های معمولی (از جمله سرور سیستم) روی یک دستگاه قابل اجرا نیست. برنامه‌ها از یک زیگوت در حال اجرا جدا می‌شوند و فرآیند zygote مجاز به بارگیری عوامل نیست.

برای پیوست کردن یک عامل به برنامه ای که از قبل در حال اجرا است، از این دستور استفاده کنید:

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 برای کپی کردن عامل در فهرست داده های برنامه استفاده کنید.

API ها

روش زیر به 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 {

سایر API های اندروید

دستور 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 API را در معرض عوامل (کد بومی) قرار می دهد. قابلیت های مهم عبارتند از:

  • تعریف مجدد یک کلاس
  • ردیابی تخصیص اشیا و جمع آوری زباله.
  • تکرار روی همه اشیاء در یک پشته، به دنبال درخت مرجع اشیاء.
  • بازرسی پشته های تماس جاوا.
  • تعلیق (و از سرگیری) همه موضوعات.

ممکن است قابلیت های مختلفی در نسخه های مختلف اندروید موجود باشد.

سازگاری

این ویژگی به پشتیبانی از زمان اجرا هسته ای نیاز دارد که فقط در اندروید 8.0 و بالاتر در دسترس است. سازندگان دستگاه برای اجرای این ویژگی نیازی به ایجاد هیچ تغییری ندارند. بخشی از AOSP است.

اعتبار سنجی

CTS موارد زیر را در اندروید 8 و بالاتر آزمایش می کند:

  • تست‌هایی که عوامل به برنامه‌های قابل اشکال‌زدایی متصل می‌شوند و به برنامه‌های غیراشکال‌زدایی متصل نمی‌شوند.
  • همه API های JVMTI پیاده سازی شده را آزمایش می کند
  • آزمایش می کند که رابط باینری برای عوامل پایدار است

تست‌های اضافی به اندروید ۹ و بالاتر اضافه شده‌اند و در تست‌های CTS برای آن نسخه‌ها گنجانده شده‌اند.