Runtime Android (ART) menyertakan pengompilasi tepat waktu (JIT) dengan pembuatan profil kode yang terus meningkatkan performa aplikasi Android saat dijalankan. Pengompilasi JIT melengkapi pengompilasi ahead-of-time (AOT) ART saat ini dan meningkatkan performa runtime, menghemat ruang penyimpanan, serta mempercepat update aplikasi dan sistem. Pengompilasi ini juga meningkatkan pengompilasi AOT dengan menghindari perlambatan sistem selama update aplikasi otomatis atau kompilasi ulang aplikasi selama update over-the-air (OTA).
Meskipun JIT dan AOT menggunakan pengompilasi yang sama dengan kumpulan pengoptimalan yang serupa, kode yang dihasilkan mungkin tidak identik. JIT menggunakan informasi jenis runtime, dapat melakukan inlining yang lebih baik, dan memungkinkan kompilasi penggantian on stack (OSR), yang semuanya menghasilkan kode yang sedikit berbeda.
Arsitektur JIT
Kompilasi JIT
Kompilasi JIT melibatkan aktivitas berikut:
- Pengguna menjalankan aplikasi, yang kemudian memicu ART untuk memuat file
.dex.- Jika file
.oat(biner AOT untuk file.dex) tersedia, ART akan menggunakannya secara langsung. Meskipun file.oatdibuat secara rutin, file tersebut tidak selalu berisi kode yang dikompilasi (biner AOT). - Jika file
.oattidak berisi kode yang dikompilasi, ART akan menjalankan JIT dan interpreter untuk mengeksekusi file.dex.
- Jika file
- JIT diaktifkan untuk aplikasi apa pun yang tidak dikompilasi sesuai dengan filter kompilasi
speed(yang menyatakan "kompilasi sebanyak mungkin dari aplikasi"). - Data profil JIT di-dump ke file di direktori sistem yang hanya dapat diakses oleh aplikasi.
- Daemon kompilasi AOT (
dex2oat) mengurai file tersebut untuk mendorong kompilasinya.
Gambar 3. Aktivitas daemon JIT.
Layanan Google Play adalah contoh yang digunakan oleh aplikasi lain yang berperilaku mirip dengan library bersama.
Alur kerja JIT
- Informasi pembuatan profil disimpan dalam cache kode dan dikenai pengumpulan sampah di bawah tekanan memori.
- Tidak ada jaminan bahwa snapshot yang diambil saat aplikasi berada di latar belakang akan berisi data lengkap (yaitu, semua yang di-JIT).
- Tidak ada upaya untuk memastikan semuanya dicatat (karena hal ini dapat memengaruhi performa runtime).
- Metode dapat berada dalam tiga status yang berbeda:
- ditafsirkan (kode dex)
- dikompilasi JIT
- dikompilasi AOT
- Persyaratan memori untuk menjalankan JIT tanpa memengaruhi performa aplikasi latar depan bergantung pada aplikasi yang dimaksud. Aplikasi besar memerlukan lebih banyak memori daripada aplikasi kecil. Secara umum, aplikasi besar stabil di sekitar 4 MB.
Mengaktifkan logging JIT
Untuk mengaktifkan logging JIT, jalankan perintah berikut:
adb rootadb shell stopadb shell setprop dalvik.vm.extra-opts -verbose:jitadb shell start
Menonaktifkan JIT
Untuk menonaktifkan JIT, jalankan perintah berikut:
adb rootadb shell stopadb shell setprop dalvik.vm.usejit falseadb shell start
Memaksa kompilasi
Untuk memaksa kompilasi, jalankan perintah berikut:
adb shell cmd package compile
Kasus penggunaan umum untuk memaksa kompilasi paket tertentu:
- Berbasis profil:
adb shell cmd package compile -m speed-profile -f my-package
- Penuh:
adb shell cmd package compile -m speed -f my-package
Kasus penggunaan umum untuk memaksa kompilasi semua paket:
- Berbasis profil:
adb shell cmd package compile -m speed-profile -f -a
- Penuh:
adb shell cmd package compile -m speed -f -a
Menghapus data profil
Di Android 13 atau yang lebih lama
Untuk menghapus data profil lokal dan menghapus kode yang dikompilasi, jalankan perintah berikut:
adb shell pm compile --reset
Di Android 14 atau yang lebih baru
Untuk menghapus data profil lokal saja:
adb shell pm art clear-app-profiles
Catatan: Tidak seperti perintah untuk Android 13 atau yang lebih lama, perintah ini tidak menghapus data profil eksternal (`.dm`) yang diinstal dengan aplikasi.
Untuk menghapus data profil lokal dan menghapus kode yang dikompilasi yang dihasilkan dari data profil lokal (yaitu, untuk mereset ke status penginstalan), jalankan perintah berikut:
adb shell pm compile --reset
Catatan: Perintah ini tidak menghapus kode yang dikompilasi yang dihasilkan dari data profil eksternal (`.dm`) yang diinstal dengan aplikasi.
Untuk menghapus semua kode yang dikompilasi, jalankan perintah ini:
adb shell cmd package compile -m verify -f
Catatan: Perintah ini mempertahankan data profil lokal.