SENI TI

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. Ini dapat digunakan untuk mengimplementasikan alat kinerja canggih yang disediakan untuk mengimplementasikan agen asli di platform lain.

Internal runtime diekspos ke agen yang telah dimuat ke dalam proses runtime. Ini berkomunikasi dengan ART melalui panggilan langsung dan panggilan balik. Runtime mendukung banyak agen sehingga permasalahan profil ortogonal yang berbeda dapat dipisahkan. Agen dapat disediakan pada saat runtime dimulai (ketika dalvikvm atau app_process dipanggil), atau dilampirkan ke proses yang sudah berjalan.

Karena kemampuan untuk menginstrumentasikan dan memodifikasi perilaku aplikasi dan runtime sangat kuat, dua langkah keselamatan telah diintegrasikan ke dalam ART TI:

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

Desain

Alur umum dan interkoneksi dalam aplikasi berinstrumen ditunjukkan pada Gambar 1 .

Flow and interconnection in an instrumented app
Gambar 1. Alur dan interkoneksi aplikasi yang diinstrumentasi

Plugin ART libopenjdkjvmti memaparkan ART TI, yang dirancang untuk mengakomodasi kebutuhan dan kendala platform:

  • Definisi ulang kelas didasarkan pada file Dex , yang hanya berisi satu definisi kelas, bukan file kelas.
  • API bahasa Java untuk instrumentasi dan definisi ulang tidak diekspos.

ART TI juga mendukung profiler Android Studio.

Muat atau lampirkan 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 langkah-langkah keamanan yang diterapkan ketika agen dimuat saat runtime startup, jadi perlu diingat bahwa runtime yang dimulai secara manual memungkinkan modifikasi penuh tanpa langkah-langkah keamanan. (Ini memungkinkan pengujian ART.)

Catatan: Ini tidak berlaku untuk aplikasi normal (termasuk server sistem) pada perangkat. Aplikasi bercabang dari zigot yang sudah berjalan, dan proses zigot tidak diizinkan 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 perpustakaan agen.

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

Lokasi agen

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

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

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

Lebah

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 {

API Android lainnya

Perintah lampirkan-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 lampirkan-agent.

JVMTI

Fitur ini memaparkan JVMTI API ke agen (kode asli). Kemampuan penting tersebut antara lain:

  • Mendefinisikan ulang kelas.
  • Melacak alokasi objek dan pengumpulan sampah.
  • Mengulangi semua objek dalam tumpukan, mengikuti pohon referensi objek.
  • Memeriksa tumpukan panggilan Java.
  • Menangguhkan (dan melanjutkan) semua thread.

Kemampuan yang berbeda mungkin tersedia pada versi Android yang berbeda.

Kesesuaian

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

Validasi

CTS menguji hal berikut pada Android 8 dan lebih tinggi:

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

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