Konfigurasi ART

Halaman ini membahas cara mengonfigurasi Android runtime (ART) dan opsi kompilasi-nya. Topik yang dibahas di sini mencakup konfigurasi prakompilasi image sistem, opsi kompilasi dex2oat, dan cara mengorbankan ruang partisi sistem, ruang partisi data, dan performa.

Lihat ART dan Dalvik serta Format Dalvik yang dapat dieksekusi untuk digunakan dengan ART. Lihat Memverifikasi Perilaku Aplikasi di Android Runtime (ART) untuk memastikan aplikasi Anda berfungsi dengan benar.

Cara kerja ART

ART menggunakan kompilasi mendahului waktu (AOT), dan mulai Android 7, ART menggunakan kombinasi campuran kompilasi AOT, kompilasi tepat waktu (JIT), dan interpretasi, dan kompilasi AOT dapat dipandu profil. Kombinasi semua mode eksekusi ini dapat dikonfigurasi dan akan dibahas di bagian ini. Sebagai contoh, perangkat Pixel dikonfigurasi untuk berfungsi dalam alur berikut:

  1. Aplikasi awalnya diinstal dengan file metadata dex (.dm) yang didistribusikan oleh Play Store, yang berisi profil cloud. ART AOT mengompilasi metode yang tercantum dalam profil cloud. Atau, jika aplikasi diinstal tanpa file metadata dex, kompilasi AOT tidak dilakukan.
  2. Beberapa kali pertama aplikasi berjalan, metode yang tidak dikompilasi AOT akan ditafsirkan. Di antara metode yang ditafsirkan, metode yang sering dieksekusi kemudian dikompilasi dengan JIT. ART membuat profil lokal berdasarkan eksekusi dan menggabungkannya dengan profil cloud (jika ada profil cloud).
  3. Saat perangkat tidak ada aktivitas dan sedang diisi dayanya, daemon kompilasi akan berjalan untuk mengompilasi ulang aplikasi berdasarkan profil gabungan yang dihasilkan selama beberapa kali pengoperasian pertama.
  4. Pada pengoperasian aplikasi berikutnya, ART menggunakan artefak yang dihasilkan oleh daemon kompilasi, yang berisi lebih banyak kode yang dikompilasi AOT, dibandingkan dengan yang dihasilkan selama Metode yang tidak dikompilasi AOT masih diinterpretasikan atau dikompilasi JIT. ART memperbarui penginstalan profil, berdasarkan eksekusi, dan profil tersebut kemudian akan diambil oleh daemon kompilasi yang dijalankan berikutnya.

ART terdiri dari compiler (alat dex2oat) dan runtime (libart.so) yang dimuat selama booting. Alat dex2oat mengambil file APK dan menghasilkan satu atau beberapa file artefak kompilasi yang dimuat runtime. Jumlah file, ekstensi, dan namanya dapat berubah di seluruh rilis, tetapi mulai dari rilis Android 8, file ini dibuat:

  • .vdex: berisi beberapa metadata tambahan untuk mempercepat verifikasi, terkadang bersama kode DEX APK yang tidak dikompresi.
  • .odex: berisi kode yang dikompilasi AOT untuk metode dalam APK.
  • .art (optional) berisi representasi internal ART dari beberapa string dan class yang tercantum dalam APK, yang digunakan untuk mempercepat peluncuran aplikasi.

Opsi kompilasi

Ada dua kategori opsi kompilasi untuk ART:

  1. Konfigurasi ROM sistem: Kode apa yang dikompilasi AOT saat mem-build image sistem.
  2. Konfigurasi runtime: cara ART mengompilasi dan menjalankan aplikasi di perangkat.

Filter compiler

Salah satu opsi ART inti untuk mengonfigurasi kedua kategori ini adalah filter compiler. Filter compiler mendorong cara ART mengompilasi kode DEX dan merupakan opsi yang diteruskan ke alat dex2oat. Mulai Android 8, ada empat filter yang didukung secara resmi:

  • verify: Hanya menjalankan verifikasi kode DEX (tanpa kompilasi AOT).
  • quicken: (Android 11 atau yang lebih lama) Menjalankan verifikasi kode DEX dan mengoptimalkan beberapa petunjuk DEX untuk mendapatkan performa penafsir yang lebih baik.
  • speed: Menjalankan verifikasi kode DEX dan mengompilasi semua metode dengan AOT. Tidak mengoptimalkan pemuatan class untuk class apa pun.
  • speed-profile: Menjalankan verifikasi kode DEX, metode kompilasi AOT yang tercantum dalam profil, dan mengoptimalkan pemuatan class untuk class dalam profil.

Konfigurasi ROM sistem

Library dan aplikasi yang diinstal sebelumnya dikompilasi AOT saat image sistem sedang di-build. Proses ini disebut dexpreopt. File yang dikompilasi tersebut dapat digunakan selama semua dependensi tetap tidak berubah, terutama classpath booting.

Catatan: Jika perangkat menggunakan update modul sistem, classpath booting kemungkinan besar akan berubah pada update berikutnya, yang membuat semua file dexpreopt tidak berlaku dan tidak dapat digunakan.

Ada sejumlah opsi build ART yang tersedia untuk mengonfigurasi dexpreopt. Cara Anda mengonfigurasi opsi ini bergantung pada ruang penyimpanan yang tersedia untuk image sistem dan jumlah aplikasi yang diprainstal. JAR/APK yang dikompilasi ke dalam ROM sistem dapat dibagi menjadi empat kategori:

  • Kode classpath booting: dikompilasi dengan filter compiler speed-profile secara default.
  • Kode server sistem (lihat PRODUCT_SYSTEM_SERVER_JARS, PRODUCT_APEX_SYSTEM_SERVER_JARS, PRODUCT_STANDALONE_SYSTEM_SERVER_JARS, PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS nanti dalam dokumen ini):
    • (Android 14 dan yang lebih baru) Dikompilasi dengan filter compiler speed-profile secara default, atau dikompilasi dengan filter compiler speed jika profil tidak disediakan.
    • (Android 13 dan yang lebih lama) Dikompilasi dengan filter compiler speed secara default.
    Dapat dikonfigurasi melalui PRODUCT_SYSTEM_SERVER_COMPILER_FILTER (lihat nanti dalam dokumen ini).
  • Aplikasi inti khusus produk (lihat PRODUCT_DEXPREOPT_SPEED_APPS nanti dalam dokumen ini): dikompilasi dengan filter compiler speed secara default.
  • Semua aplikasi lainnya: dikompilasi dengan filter compiler speed-profile secara default, atau dikompilasi dengan filter compiler verify jika profil tidak disediakan.

    Dapat dikonfigurasi melalui PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (lihat nanti dalam dokumen ini).

Opsi Makefile

  • WITH_DEXPREOPT
  • Apakah dex2oat dipanggil pada kode DEX yang diinstal di image sistem. Diaktifkan secara default.

  • DONT_DEXPREOPT_PREBUILTS (Android 5 dan yang lebih baru)
  • Mengaktifkan DONT_DEXPREOPT_PREBUILTS akan mencegah prebuilt di-dexpreopt. Ini adalah aplikasi yang memiliki include $(BUILD_PREBUILT) yang ditentukan dalam Android.mk. Melewati dexpreopt aplikasi bawaan yang cenderung diupdate melalui Google Play akan menghemat ruang dalam image sistem, tetapi akan menambah waktu booting pertama. Perhatikan bahwa opsi ini tidak memengaruhi aplikasi bawaan yang ditentukan di Android.bp.

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (Android 9 dan yang lebih tinggi)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER menentukan filter compiler default untuk aplikasi dexpreopt. Aplikasi ini ditentukan dalam Android.bp atau memiliki include $(BUILD_PREBUILT) yang ditentukan dalam Android.mk. Jika tidak ditentukan, nilai defaultnya adalah speed-profile, atau verify jika nilai tidak ditentukan dan profil tidak diberikan.

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (sejak Android 8 MR1)
  • Mengaktifkan dexpreopts WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY hanya classpath booting dan jar server sistem.

  • LOCAL_DEX_PREOPT
  • Dexpreopt juga dapat diaktifkan atau dinonaktifkan berdasarkan aplikasi individual dengan menentukan opsi LOCAL_DEX_PREOPT dalam definisi modul. Hal ini dapat berguna untuk menonaktifkan dexpreopt aplikasi yang dapat langsung menerima update Google Play karena update akan membuat kode dexpreopt dalam image sistem menjadi usang. Hal ini juga berguna untuk menghemat ruang di OTA upgrade versi utama karena pengguna mungkin sudah memiliki aplikasi versi yang lebih baru di partisi data.

    LOCAL_DEX_PREOPT mendukung nilai true atau false untuk mengaktifkan atau menonaktifkan dexpreopt. Selain itu, nostripping dapat ditentukan jika dexpreopt tidak boleh menghapus file classes.dex dari file APK atau JAR. Biasanya file ini dihapus karena tidak lagi diperlukan setelah dexpreopt, tetapi opsi terakhir ini diperlukan untuk memungkinkan tanda tangan APK pihak ketiga tetap valid.

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • Meneruskan opsi ke dex2oat untuk mengontrol cara kompilasi gambar booting. Ini dapat digunakan untuk menentukan daftar class gambar yang disesuaikan, daftar class yang dikompilasi, dan filter compiler.

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • Meneruskan opsi ke dex2oat untuk mengontrol cara semua hal selain image booting dikompilasi.

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • Memberikan kemampuan untuk meneruskan opsi dex2oat untuk modul dan konfigurasi produk tertentu. Nilai ini ditetapkan dalam file device.mk produk oleh $(call add-product-dex-preopt-module-config,<modules>,<option>) dengan <modules> adalah daftar nama LOCAL_MODULE dan LOCAL_PACKAGE untuk file JAR dan APK.

  • PRODUCT_DEXPREOPT_SPEED_APPS (sejak Android 8)
  • Daftar aplikasi yang telah diidentifikasi sebagai inti produk dan yang diinginkan untuk dikompilasi dengan filter compiler speed. Misalnya, aplikasi persisten seperti SystemUI mendapatkan kesempatan untuk menggunakan kompilasi terpandu profil hanya saat mulai ulang berikutnya, jadi sebaiknya produk ini selalu mengompilasi aplikasi ini dengan AOT.

  • PRODUCT_SYSTEM_SERVER_APPS (sejak Android 8)
  • Daftar aplikasi yang dimuat oleh server sistem. Aplikasi ini dikompilasi secara default dengan filter compiler speed.

  • PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD (sejak Android 8)
  • Apakah akan menyertakan versi debug ART di perangkat. Secara default, fitur ini diaktifkan untuk build userdebug dan eng. Perilaku ini dapat diganti dengan menetapkan opsi secara eksplisit ke true atau false.

    Secara default, perangkat menggunakan versi non-debug (libart.so). Untuk beralih, tetapkan properti sistem persist.sys.dalvik.vm.lib.2 ke libartd.so.

  • WITH_DEXPREOPT_PIC (hingga Android 7)
  • Di Android 5.1.0 hingga Android 6.0.1, WITH_DEXPREOPT_PIC dapat ditentukan untuk mengaktifkan kode yang tidak bergantung posisi (PIC). Dengan demikian, kode yang dikompilasi dari image tidak perlu dipindahkan dari /system ke /data/dalvik-cache, sehingga menghemat ruang di partisi data. Namun, ada sedikit dampak runtime karena tindakan ini menonaktifkan pengoptimalan yang memanfaatkan kode yang bergantung pada posisi. Biasanya, perangkat yang ingin menghemat ruang di /data harus mengaktifkan kompilasi PIC.

    Di Android 7.0, kompilasi PIC diaktifkan secara default.

  • WITH_DEXPREOPT_BOOT_IMG_ONLY (hingga Android 7 MR1)
  • Opsi ini diganti dengan WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY yang juga melakukan pra-pemilihan JAR server sistem.

  • PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
  • Opsi ini menentukan filter compiler untuk server sistem.

    • (Android 14 dan yang lebih tinggi) Jika tidak ditentukan, filter compiler speed-profile akan digunakan, atau filter compiler speed akan digunakan jika profil tidak disediakan.
    • (Android 13 dan yang lebih lama) Jika tidak ditentukan, filter compiler speed akan digunakan.
    • Jika disetel ke speed, filter compiler speed akan digunakan.
    • Jika ditetapkan ke speed-profile, filter compiler speed-profile akan digunakan, atau filter compiler verify akan digunakan jika profil tidak disediakan.
    • Jika disetel ke verify, filter compiler verify akan digunakan.

  • PRODUCT_SYSTEM_SERVER_JARS, PRODUCT_APEX_SYSTEM_SERVER_JARS, PRODUCT_STANDALONE_SYSTEM_SERVER_JARS, PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS
  • Berikut adalah daftar JAR yang dimuat oleh server sistem. JAR dikompilasi dengan filter compiler yang ditentukan oleh PRODUCT_SYSTEM_SERVER_COMPILER_FILTER

    • (Wajib) PRODUCT_SYSTEM_SERVER_JARS: Daftar JAR classpath server sistem di platform (yaitu, sebagai bagian dari SYSTEMSERVERCLASSPATH). Menambahkan JAR classpath server sistem ke daftar ini diperlukan. Kegagalan menambahkan JAR classpath server sistem ke daftar akan menyebabkan JAR tersebut tidak dimuat.
    • (Wajib) PRODUCT_APEX_SYSTEM_SERVER_JARS: Daftar JAR classpath server sistem yang dikirimkan dengan APEX (yaitu, sebagai bagian dari SYSTEMSERVERCLASSPATH). Formatnya adalah <apex name>:<jar name>. Anda harus menambahkan JAR classpath server sistem APEX ke daftar ini. Kegagalan menambahkan JAR classpath server sistem APEX ke daftar ini akan mengakibatkan JAR tersebut tidak dimuat.
    • (Opsional, Android 13 dan yang lebih lama) PRODUCT_STANDALONE_SYSTEM_SERVER_JARS: Daftar JAR yang dimuat server sistem secara dinamis menggunakan classloader terpisah (melalui SystemServiceManager.startServiceFromJar). Menambahkan JAR server sistem mandiri ke daftar ini tidak diperlukan, tetapi sangat direkomendasikan karena membuat JAR dikompilasi dan memiliki performa runtime yang baik.
    • (wajib, sejak Android 13) PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS: Daftar JAR yang dikirimkan dengan APEX yang dimuat server sistem secara dinamis menggunakan classloader terpisah (yaitu, melalui SystemServiceManager.startServiceFromJar atau dideklarasikan sebagai <apex-system-service>). Formatnya adalah <apex name>:<jar name>. Menambahkan JAR server sistem APEX mandiri ke daftar ini diperlukan. Gagal menambahkan JAR server sistem APEX mandiri ke daftar ini akan menyebabkan kegagalan booting.

    Konfigurasi classpath booting

    Daftar class yang dimuat sebelumnya adalah daftar class yang diinisialisasi Zygote saat startup. Hal ini membuat setiap aplikasi tidak perlu menjalankan penginisialisasi class ini secara terpisah, sehingga memungkinkan aplikasi dimulai lebih cepat dan berbagi halaman dalam memori. File daftar class yang dimuat sebelumnya terletak di frameworks/base/config/preloaded-classes secara default, dan berisi daftar yang disesuaikan untuk penggunaan ponsel standar. Hal ini mungkin berbeda untuk perangkat lain seperti perangkat wearable, dan harus disesuaikan sesuai kebutuhan. Berhati-hatilah saat menyesuaikannya; menambahkan terlalu banyak class akan membuang memori saat class yang tidak digunakan dimuat. Menambahkan terlalu sedikit class akan memaksa setiap aplikasi harus memiliki salinannya sendiri, yang lagi-lagi, akan membuang memori.

    Contoh penggunaan (di device.mk produk):

    PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
    

    Catatan: Anda harus menempatkan baris ini sebelum mewarisi makefile konfigurasi produk yang mendapatkan default dari build/target/product/base.mk.

    Konfigurasi runtime

    Opsi JIT

    Opsi berikut memengaruhi rilis Android hanya jika compiler JIT ART tersedia.

    • dalvik.vm.usejit: Apakah JIT diaktifkan atau tidak.
    • dalvik.vm.jitinitialsize (default 64K): Kapasitas awal cache kode. Cache kode akan melakukan GC secara berkala dan bertambah jika diperlukan.
    • dalvik.vm.jitmaxsize (default 64 M): Kapasitas maksimum cache kode.
    • dalvik.vm.jitthreshold (default 10000): Nilai minimum yang harus dilalui penghitung "hotness" metode agar metode dikompilasi JIT. Penghitung "hotness" adalah metrik internal untuk runtime. Hal ini mencakup jumlah panggilan, cabang mundur, dan faktor lainnya.
    • dalvik.vm.usejitprofiles (hingga Android 13): Apakah profil JIT diaktifkan atau tidak; ini dapat digunakan meskipun dalvik.vm.usejit bernilai salah. Perhatikan bahwa jika nilainya salah, filter compiler speed-profile tidak mengompilasi metode apa pun dengan AOT dan setara dengan verify. Sejak Android 14, profil JIT selalu diaktifkan dan tidak dapat dinonaktifkan.
    • dalvik.vm.jitprithreadweight (default ke dalvik.vm.jitthreshold / 20): Bobot "sampel" JIT (lihat jitthreshold) untuk UI thread aplikasi. Gunakan untuk mempercepat kompilasi metode yang secara langsung memengaruhi pengalaman pengguna saat berinteraksi dengan aplikasi.
    • dalvik.vm.jittransitionweight (default ke dalvik.vm.jitthreshold / 10): Bobot pemanggilan metode yang bertransisi antara kode kompilasi dan penafsir. Hal ini membantu memastikan metode yang terlibat dikompilasi untuk meminimalkan transisi (yang mahal).

    Opsi Dex2oat

    Opsi ini memengaruhi kompilasi di perangkat (alias, dexopt), dan beberapa di antaranya juga memengaruhi dexpreopt, sedangkan opsi yang dibahas di bagian Konfigurasi ROM sistem di atas hanya memengaruhi dexpreopt.

    Opsi untuk mengontrol penggunaan resource:

    • dalvik.vm.image-dex2oat-threads/dalvik.vm.image-dex2oat-cpu-set (hingga Android 11): Jumlah thread dan kumpulan core CPU (lihat di bawah) yang akan digunakan untuk image booting.
    • dalvik.vm.boot-dex2oat-threads/dalvik.vm.boot-dex2oat-cpu-set:
      • (hingga Android 11) Jumlah thread dan kumpulan core CPU (lihat di bawah) yang akan digunakan selama waktu booting untuk semua hal selain image booting.
      • (sejak Android 12) Jumlah thread dan kumpulan core CPU (lihat di bawah) yang akan digunakan selama waktu booting untuk semuanya, termasuk image booting.
        • Secara khusus, sejak Android 14, hal ini sesuai dengan class prioritas PRIORITY_BOOT di Layanan ART.
    • dalvik.vm.restore-dex2oat-threads/dalvik.vm.restore-dex2oat-cpu-set:
      • (sejak Android 11, hingga Android 13) Jumlah thread dan kumpulan core CPU (lihat di bawah) yang akan digunakan untuk memulihkan dari pencadangan cloud.
      • (sejak Android 14) Jumlah thread dan kumpulan core CPU (lihat di bawah) yang akan digunakan untuk semua hal yang lebih sensitif terhadap latensi daripada biasanya, termasuk memulihkan dari pencadangan cloud.
        • Secara khusus, ini sesuai dengan class prioritas PRIORITY_INTERACTIVE_FAST di Layanan ART.
    • dalvik.vm.background-dex2oat-threads/ dalvik.vm.background-dex2oat-cpu-set (sejak Android 14): Jumlah thread dan kumpulan core CPU (lihat di bawah) yang akan digunakan di latar belakang.
      • Secara khusus, ini sesuai dengan class prioritas PRIORITY_BACKGROUND di Layanan ART.
    • dalvik.vm.dex2oat-threads/dalvik.vm.dex2oat-cpu-set: Jumlah thread dan kumpulan core CPU yang akan digunakan untuk hal lainnya.

    Kumpulan core CPU harus ditentukan sebagai daftar ID CPU yang dipisahkan koma. Misalnya, untuk menjalankan di dex2oat pada core CPU 0-3, tetapkan:

    dalvik.vm.dex2oat-cpu-set=0,1,2,3
    

    Saat menetapkan properti afinitas CPU, sebaiknya cocokkan properti yang sesuai untuk jumlah thread dex2oat agar cocok dengan jumlah CPU yang dipilih untuk menghindari pertentangan memori dan I/O yang tidak perlu:

    dalvik.vm.dex2oat-cpu-set=0,1,2,3
    dalvik.vm.dex2oat-threads=4
    

    Selain properti sistem di atas, Anda juga dapat menggunakan profil tugas untuk mengontrol penggunaan resource dex2oat (lihat Lapisan Abstraksi Cgroup).

    Profil tugas yang didukung adalah:

    • Dex2OatBackground (sejak Android 14) (secara default mewarisi Dex2OatBootComplete): Mengontrol resource yang akan digunakan di latar belakang.
      • Secara khusus, ini sesuai dengan class prioritas PRIORITY_BACKGROUND di Layanan ART.
    • Dex2OatBootComplete:
      • (hingga Android 13) Mengontrol resource yang akan digunakan untuk semua hal setelah booting.
      • (sejak Android 14) Mengontrol resource yang akan digunakan untuk semua hal setelah booting dan bukan di latar belakang.
        • Secara khusus, ini sesuai dengan class prioritas PRIORITY_INTERACTIVE_FAST dan PRIORITY_INTERACTIVE di Layanan ART.

    Jika properti sistem dan profil tugas ditentukan, keduanya akan diterapkan.

    Opsi untuk mengontrol ukuran heap:

    • dalvik.vm.image-dex2oat-Xms: Ukuran heap awal untuk image booting.
    • dalvik.vm.image-dex2oat-Xmx: Ukuran heap maksimum untuk image booting.
    • dalvik.vm.dex2oat-Xms: Ukuran heap awal untuk semua yang lain.
    • dalvik.vm.dex2oat-Xmx: Ukuran heap maksimum untuk semua yang lain.

    Opsi yang mengontrol ukuran heap awal dan maksimum untuk dex2oat tidak boleh dikurangi karena dapat membatasi aplikasi yang dapat dikompilasi.

    Opsi untuk mengontrol filter compiler:

    • dalvik.vm.image-dex2oat-filter (hingga Android 11): Filter compiler untuk image booting. Sejak Android 12, filter compiler untuk image booting selalu speed-profile dan tidak dapat diubah.
    • dalvik.vm.systemservercompilerfilter (sejak Android 13): Filter compiler untuk server sistem. Lihat PRODUCT_SYSTEM_SERVER_COMPILER_FILTER.
    • dalvik.vm.systemuicompilerfilter (sejak Android 13): Filter compiler untuk paket UI Sistem.
    • dalvik.vm.dex2oat-filter (hingga Android 6): Filter compiler untuk semua yang lain.
    • pm.dexopt.<reason> (sejak Android 7): Filter compiler untuk semua yang lain. Lihat Konfigurasi Layanan ART untuk Android 14 dan yang lebih baru, atau Konfigurasi Pengelola Paket untuk Android 13 dan yang lebih lama.

    Opsi lain untuk mengontrol kompilasi semua hal selain image booting:

    • dalvik.vm.dex2oat-very-large (sejak Android 7.1): Total ukuran file dex minimum dalam byte untuk menonaktifkan kompilasi AOT.
    • dalvik.vm.dex2oat-swap (sejak Android 7.1) (default: true): Mengizinkan penggunaan file swap untuk dex2oat. Hal ini dapat membantu menghindari error kehabisan memori. Perhatikan bahwa meskipun opsi ini diaktifkan, dex2oat hanya akan menggunakan file swap dalam kondisi tertentu, seperti saat jumlah file dex besar, dan kondisinya dapat berubah.
    • dalvik.vm.ps-min-first-save-ms (sejak Android 12): Waktu minimum yang harus ditunggu sebelum runtime membuat profil aplikasi, saat pertama kali aplikasi diluncurkan.
    • dalvik.vm.ps-min-save-period-ms (sejak Android 12): Waktu minimum yang harus ditunggu sebelum memperbarui profil aplikasi.
    • dalvik.vm.dex2oat64.enabled (sejak Android 11) (default: false): Apakah akan menggunakan dex2oat versi 64-bit.
    • dalvik.vm.bgdexopt.new-classes-percent (sejak Android 12) (default: 20): Persentase minimum, antara 0 dan 100, dari class baru dalam profil untuk memicu kompilasi ulang. Hanya berlaku untuk kompilasi terpandu profil (speed-profile), biasanya selama dexopt latar belakang. Perhatikan bahwa ada juga nilai minimum 50 class baru selain nilai minimum persentase, dan nilai minimum ini tidak dapat dikonfigurasi.
    • dalvik.vm.bgdexopt.new-methods-percent (sejak Android 12) (default: 20): Persentase minimum, antara 0 dan 100, dari metode baru dalam profil untuk memicu kompilasi ulang. Hanya berlaku untuk kompilasi terpandu profil (speed-profile), biasanya selama dexopt latar belakang. Perhatikan bahwa ada juga batas minimum 100 metode baru selain batas persentase, dan tidak dapat dikonfigurasi.
    • dalvik.vm.dex2oat-max-image-block-size (sejak Android 10) (default: 524288) Ukuran blok solid maksimum untuk gambar terkompresi. Gambar besar dibagi menjadi serangkaian blok solid sehingga tidak ada blok yang lebih besar dari ukuran maksimum.
    • dalvik.vm.dex2oat-resolve-startup-strings (sejak Android 10) (default: true) Jika benar, menyebabkan dex2oat me-resolve semua string const yang direferensikan dari metode yang ditandai sebagai "startup" di profil.
    • debug.generate-debug-info (default: false) Apakah akan membuat informasi debug untuk proses debug native atau tidak, seperti informasi penguraian stack, simbol ELF, dan bagian dwarf.
    • dalvik.vm.dex2oat-minidebuginfo (sejak Android 9) (default: true) Apakah akan menghasilkan jumlah minimal informasi debug yang dikompresi LZMA yang diperlukan untuk mencetak pelacakan balik atau tidak.

    Opsi Layanan ART

    Mulai Android 14, kompilasi AOT di perangkat untuk aplikasi (alias dexopt) ditangani oleh Layanan ART. Untuk informasi tentang cara mengonfigurasi Layanan ART, lihat Konfigurasi Layanan ART.

    Opsi pengelola paket

    Sebelum Android 14, kompilasi AOT di perangkat untuk aplikasi (alias dexopt) ditangani oleh pengelola paket. Untuk informasi tentang cara mengonfigurasi pengelola paket untuk dexopt, lihat Konfigurasi Pengelola Paket.

    Konfigurasi khusus A/B

    Konfigurasi ROM

    Mulai Android 7.0, perangkat dapat menggunakan dua partisi sistem untuk mengaktifkan update sistem A/B. Untuk menghemat ukuran partisi sistem, file yang dipilih sebelumnya dapat diinstal di partisi sistem kedua yang tidak digunakan. Kemudian, file tersebut disalin ke partisi data saat booting pertama.

    Contoh penggunaan (di device-common.mk):

    PRODUCT_PACKAGES += \
         cppreopts.sh
    PRODUCT_PROPERTY_OVERRIDES += \
         ro.cp_system_other_odex=1
    

    Dan di BoardConfig.mk perangkat:

    BOARD_USES_SYSTEM_OTHER_ODEX := true
    

    Perhatikan bahwa kode classpath booting, kode server sistem, dan aplikasi core khusus produk selalu dikompilasi ke partisi sistem. Secara default, semua aplikasi lain dikompilasi ke partisi sistem kedua yang tidak digunakan. Hal ini dapat dikontrol dengan SYSTEM_OTHER_ODEX_FILTER, yang memiliki nilai secara default:

    SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
    

    Dexopt OTA latar belakang

    Pada perangkat yang mengaktifkan A/B, aplikasi dapat dikompilasi di latar belakang sebelum dimulai ulang dengan image sistem baru. Lihat Kompilasi aplikasi di latar belakang untuk menyertakan skrip kompilasi dan biner secara opsional dalam image sistem. Filter kompilasi yang digunakan untuk kompilasi ini dikontrol dengan:

    pm.dexopt.ab-ota=speed-profile
    

    Sebaiknya gunakan speed-profile untuk memanfaatkan kompilasi yang dibimbing profil dan menghemat penyimpanan.

    Opsi JDWP

    Pembuatan thread Java Debug Wire Protocol (JDWP) dalam build userdebug dikontrol melalui properti sistem persist.debug.dalvik.vm.jdwp.enabled. Secara default, properti ini tidak ditetapkan dan thread JDWP hanya dibuat untuk aplikasi yang dapat di-debug. Untuk mengaktifkan thread JDWP untuk aplikasi yang dapat di-debug dan tidak dapat di-debug, tetapkan persist.debug.dalvik.vm.jdwp.enabled ke 1. Perangkat harus dimulai ulang agar perubahan pada properti diterapkan.

    Untuk men-debug aplikasi yang tidak dapat di-debug pada build userdebug, aktifkan JDWP dengan menjalankan perintah berikut:

      adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
      adb reboot
      
    Untuk perangkat yang menjalankan Android 13 dan yang lebih lama, runtime membuat thread JDWP untuk aplikasi yang dapat di-debug dan tidak dapat di-debug pada build userdebug. Artinya, Anda dapat melampirkan debugger atau membuat profil aplikasi apa pun pada build userdebug.