TI ART

Di Android 8.0 dan yang lebih tinggi, ART Tooling Interface (ART TI) mengekspos internal runtime tertentu, dan memungkinkan profiler dan debugger memengaruhi perilaku runtime aplikasi. Hal ini dapat digunakan untuk menerapkan alat performa canggih yang disediakan untuk menerapkan agen native di platform lain.

Internal runtime diekspos ke agen yang telah dimuat ke dalam proses runtime. Hal ini berkomunikasi dengan ART melalui panggilan langsung dan callback. Runtime mendukung beberapa agen sehingga berbagai masalah pembuatan profil ortogonal dapat dipisahkan. Agen dapat disediakan saat awal runtime (saat dalvikvm atau app_process dipanggil), atau dilampirkan ke proses yang sudah berjalan.

Karena kemampuan untuk membuat instrumen dan mengubah perilaku aplikasi dan runtime sangat canggih, dua tindakan pengamanan telah diintegrasikan ke dalam ART TI:

  • Pertama, kode yang mengekspos antarmuka agen, JVMTI, diimplementasikan sebagai plugin runtime, bukan komponen inti runtime. Pemuatan plugin dapat dibatasi, sehingga agen dapat diblokir agar tidak menemukan titik antarmuka.
  • Kedua, class ActivityManager dan proses runtime hanya mengizinkan agen disertakan ke aplikasi yang dapat di-debug. Aplikasi yang dapat di-debug telah ditandatangani oleh developer-nya untuk dianalisis dan diinstrumentasi, dan tidak didistribusikan kepada pengguna akhir. Google Play Store tidak mengizinkan distribusi aplikasi yang dapat di-debug. Hal ini memastikan aplikasi normal (termasuk komponen inti) tidak dapat diinstrumentasikan atau dimanipulasi.

Desain

Alur umum dan interkoneksi dalam aplikasi berinstrumen ditampilkan dalam Gambar 1.

Alur dan interkoneksi dalam aplikasi berinstrumen
Gambar 1. Alur dan interkoneksi aplikasi berinstrumen

libopenjdkjvmti plugin ART mengekspos ART TI, yang dirancang untuk mengakomodasi kebutuhan dan batasan platform:

  • Pendefinisian ulang class didasarkan pada file Dex, yang hanya berisi satu definisi class, bukan file class.
  • API bahasa Java untuk instrumentasi dan pendefinisian ulang tidak ditampilkan.

ART TI juga mendukung profiler Android Studio.

Memuat atau melampirkan agen

Untuk melampirkan agen saat startup runtime, gunakan perintah ini untuk memuat plugin JVMTI dan agen yang diberikan:

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

Tidak ada tindakan pengamanan yang diterapkan saat agen dimuat saat startup runtime, jadi perlu diingat bahwa runtime yang dimulai secara manual memungkinkan modikasi penuh tanpa tindakan pengamanan. (Tindakan ini memungkinkan pengujian ART.)

Catatan: Hal ini tidak berlaku untuk aplikasi normal (termasuk server sistem) di perangkat. Aplikasi diambil dari zygote yang sudah berjalan, dan proses zygote tidak diizinkan untuk memuat agen.

Untuk melampirkan agen ke aplikasi yang sudah berjalan, gunakan perintah ini:

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

Jika plugin JVMTI belum dimuat, melampirkan agen akan memuat plugin dan library agen.

Agen hanya dapat dilampirkan ke aplikasi yang sedang berjalan dan ditandai sebagai debuggable (bagian dari manifes aplikasi, dengan atribut android:debuggable ditetapkan ke true di node aplikasi). Class ActivityManager dan ART melakukan pemeriksaan sebelum mengizinkan agen dilampirkan. Class ActivityManager memeriksa informasi aplikasi saat ini (berasal dari data class PackageManager) untuk status yang dapat di-debug, dan runtime memeriksa statusnya saat ini, yang ditetapkan saat aplikasi dimulai.

Lokasi agen

Runtime perlu memuat agen ke dalam proses saat ini, sehingga agen dapat langsung terikat dan berkomunikasi dengannya. ART itu sendiri bersifat agnostik terkait lokasi spesifik tempat agen berasal. String ini digunakan untuk panggilan dlopen. Izin sistem file dan kebijakan SELinux membatasi pemuatan yang sebenarnya.

Untuk mengirimkan agen yang dapat dijalankan oleh aplikasi yang dapat di-debug, lakukan hal berikut:

  • Sematkan agen di direktori library APK aplikasi.
  • Gunakan run-as untuk menyalin agen ke direktori data aplikasi.

API

Metode berikut telah ditambahkan ke 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 API lainnya

Perintah attach-agent dapat dilihat oleh publik. Perintah ini melampirkan agen JVMTI ke proses yang sedang berjalan:

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;\''

Perintah am start -P dan am start-profiler/stop-profiler mirip dengan perintah attach-agent.

JVMTI

Fitur ini mengekspos JVMTI API ke agen (kode native). Kemampuan pentingnya meliputi:

  • Menentukan ulang class.
  • Melacak alokasi objek dan pembersihan sampah memori.
  • Melakukan iterasi pada semua objek dalam heap, mengikuti hierarki referensi objek.
  • Memeriksa stack panggilan Java.
  • Menangguhkan (dan melanjutkan) semua thread.

Kemampuan yang berbeda mungkin tersedia di versi Android yang berbeda.

Kompatibilitas

Fitur ini memerlukan dukungan runtime inti yang hanya tersedia di Android 8.0 dan yang lebih tinggi. Produsen perangkat tidak perlu melakukan perubahan apa pun untuk menerapkan fitur ini. Ini adalah bagian dari AOSP.

Validasi

CTS menguji hal berikut di Android 8 dan yang lebih tinggi:

  • Menguji apakah agen terpasang ke aplikasi yang dapat di-debug, dan gagal terpasang ke aplikasi yang tidak dapat di-debug.
  • Menguji semua JVMTI API yang diterapkan
  • Menguji apakah antarmuka biner untuk agen stabil

Pengujian tambahan telah ditambahkan ke Android 9 dan yang lebih baru, serta disertakan dalam pengujian CTS untuk rilis tersebut.