Menerapkan ART Just-In-Time (JIT) Compiler

Android runtime (ART) menyertakan kompiler just-in-time (JIT) dengan profil kode yang terus meningkatkan kinerja aplikasi Android saat dijalankan. Kompiler JIT melengkapi kompiler sebelumnya (AOT) ART saat ini dan meningkatkan kinerja runtime, menghemat ruang penyimpanan, dan mempercepat pembaruan aplikasi dan sistem. Ini juga meningkatkan kompiler AOT dengan menghindari perlambatan sistem selama pembaruan aplikasi otomatis atau kompilasi ulang aplikasi selama pembaruan over-the-air (OTA).

Meskipun JIT dan AOT menggunakan kompiler yang sama dengan serangkaian pengoptimalan yang serupa, kode yang dihasilkan mungkin tidak sama. JIT memanfaatkan informasi jenis runtime, dapat melakukan inlining yang lebih baik, dan memungkinkan kompilasi penggantian tumpukan (OSR), yang semuanya menghasilkan kode yang sedikit berbeda.

arsitektur JIT

arsitektur JIT
Gambar 1. Arsitektur JIT.

kompilasi JIT

Kompilasi JIT melibatkan kegiatan berikut:

Komp yang dipandu profil
Gambar 2. Kompilasi dengan panduan profil.
  1. Pengguna menjalankan aplikasi, yang kemudian memicu ART untuk memuat file .dex .
    • Jika file .oat (biner AOT untuk file .dex ) tersedia, ART menggunakannya secara langsung. Meskipun file .oat dihasilkan secara teratur, mereka tidak selalu berisi kode yang dikompilasi (biner AOT).
    • Jika file .oat tidak berisi kode yang dikompilasi, ART berjalan melalui JIT dan interpreter untuk mengeksekusi file .dex .
  2. JIT diaktifkan untuk aplikasi apa pun yang tidak dikompilasi sesuai dengan filter kompilasi speed (yang mengatakan "kompilasi sebanyak yang Anda bisa dari aplikasi").
  3. Data profil JIT dibuang ke file di direktori sistem yang hanya dapat diakses oleh aplikasi.
  4. Daemon kompilasi AOT ( dex2oat ) mem-parsing file tersebut untuk mengarahkan kompilasinya.

    daemon JIT
    Gambar 3. Aktivitas daemon JIT.

Layanan Google Play adalah contoh yang digunakan oleh aplikasi lain yang berperilaku serupa dengan pustaka bersama.

alur kerja JIT

arsitektur JIT
Gambar 4. Aliran data JIT.
  • Informasi profil disimpan dalam cache kode dan menjadi sasaran 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 direkam (karena ini dapat memengaruhi kinerja runtime).
  • Metode dapat berada dalam tiga status berbeda:
    • ditafsirkan (kode dex)
    • dikompilasi JIT
    • Dikompilasi AOT
    Jika kedua kode JIT dan AOT ada (misalnya karena de-optimasi berulang), kode JITed lebih disukai.
  • Persyaratan memori untuk menjalankan JIT tanpa memengaruhi kinerja aplikasi latar depan bergantung pada aplikasi yang dimaksud. Aplikasi besar membutuhkan lebih banyak memori daripada aplikasi kecil. Secara umum, aplikasi besar menstabilkan 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

Menonaktifkan 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 yang berikut ini:

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

Untuk menghapus data profil dan menghapus kode yang dikompilasi, jalankan yang berikut ini:

  • Untuk satu paket:
    adb shell cmd package compile --reset my-package
    
  • Untuk semua paket:
    adb shell cmd package compile --reset -a