Mengimplementasikan compiler tepat waktu ART

Android runtime (ART) menyertakan compiler tepat waktu (JIT) dengan pembuatan profil kode yang terus meningkatkan performa aplikasi Android saat dijalankan. Compiler JIT melengkapi compiler ahead-of-time (AOT) pada ART dan meningkatkan performa runtime, menghemat ruang penyimpanan, serta mempercepat pembaruan aplikasi dan sistem. API ini juga meningkatkan compiler AOT dengan menghindari perlambatan sistem selama update aplikasi otomatis atau kompilasi ulang aplikasi selama update over the air (OTA).

Meskipun JIT dan AOT menggunakan compiler 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 stack (OSR), yang semuanya menghasilkan kode yang sedikit berbeda.

Arsitektur JIT

Arsitektur JIT
Gambar 1. Arsitektur JIT.

kompilasi JIT

Kompilasi JIT melibatkan aktivitas berikut:

Komposisi yang dipandu profil
Gambar 2. Kompilasi yang dipandu profil.
  1. 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 .oat dihasilkan secara rutin, file tersebut tidak selalu berisi kode yang dikompilasi (biner AOT).
    • Jika file .oat tidak berisi kode yang dikompilasi, ART akan berjalan melalui JIT dan penafsir untuk mengeksekusi file .dex.
  2. JIT diaktifkan untuk semua aplikasi yang tidak dikompilasi sesuai dengan filter kompilasi speed (yang mengatakan "kompilasi sebanyak yang Anda bisa dari aplikasi").
  3. Data profil JIT dibuang ke file dalam direktori sistem yang hanya dapat diakses oleh aplikasi tersebut.
  4. Daemon kompilasi AOT (dex2oat) mengurai file tersebut untuk mendorong kompilasinya.

    daemon JIT
    Gambar 3. Aktivitas daemon JIT.

Layanan Google Play adalah contoh yang digunakan oleh aplikasi lain yang berperilaku mirip dengan library bersama.

Alur kerja JIT

Arsitektur JIT
Gambar 4. Aliran data JIT.
  • Informasi pembuatan profil disimpan dalam cache kode dan tunduk pada pembersihan sampah memori 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 direkam (karena hal ini dapat memengaruhi performa runtime).
  • Metode dapat berada dalam tiga status yang berbeda:
    • ditafsirkan (kode dex)
    • Dikompilasi JIT
    • AOT dikompilasi
    Jika kode JIT dan AOT ada (misalnya karena de-pengoptimalan berulang), kode JIT lebih disukai.
  • 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 sekitar 4 MB.

Mengaktifkan pencatatan JIT

Untuk mengaktifkan logging JIT, jalankan perintah berikut:

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

Nonaktifkan JIT

Untuk menonaktifkan JIT, jalankan perintah berikut:

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb 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
    
  • Lengkap:
    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 menyimpan data profil lokal.