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.

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.