Mengonfigurasi ART

Halaman ini membahas cara mengkonfigurasi ART dan opsi kompilasinya. Topik yang dibahas di sini meliputi konfigurasi pra-kompilasi citra sistem, opsi kompilasi dex2oat, dan cara menukar ruang partisi sistem, ruang partisi data, dan kinerja.

Lihat ART dan Dalvik , format Dalvik yang Dapat Dieksekusi , dan halaman lainnya di source.android.com untuk bekerja dengan ART. Lihat Memverifikasi Perilaku Aplikasi di Android Runtime (ART) untuk memastikan aplikasi Anda berfungsi dengan baik.

Bagaimana ART bekerja?

ART menggunakan kompilasi sebelumnya (AOT), dan mulai dari Android 7.0 (Nougat atau N), ia menggunakan kombinasi hibrida dari kompilasi AOT, just-in-time (JIT), dan kompilasi yang dipandu profil. Kombinasi dari semua mode kompilasi ini dapat dikonfigurasi dan akan dibahas di bagian ini. Sebagai contoh, perangkat Pixel dikonfigurasi dengan alur kompilasi berikut:

  1. Aplikasi awalnya diinstal tanpa kompilasi AOT. Beberapa kali pertama aplikasi berjalan, itu akan ditafsirkan, dan metode yang sering dieksekusi akan dikompilasi JIT.
  2. Saat perangkat idle dan mengisi daya, daemon kompilasi berjalan ke kompilasi AOT kode yang sering digunakan berdasarkan profil yang dihasilkan selama proses pertama.
  3. Restart aplikasi berikutnya akan menggunakan kode yang dipandu profil dan menghindari kompilasi JIT saat runtime untuk metode yang sudah dikompilasi. Metode yang dikompilasi JIT selama proses baru akan ditambahkan ke profil, yang kemudian akan diambil oleh daemon kompilasi.

ART terdiri dari kompiler (alat dex2oat ) dan runtime ( libart.so ) yang dimuat untuk memulai Zygote. Alat dex2oat mengambil file APK dan menghasilkan satu atau beberapa file artefak kompilasi yang dimuat waktu proses. Jumlah file, ekstensi, dan namanya dapat berubah di seluruh rilis, tetapi pada rilis Android O, file yang dihasilkan adalah:

  • .vdex : berisi kode DEX APK yang tidak terkompresi, dengan beberapa metadata tambahan untuk mempercepat verifikasi.
  • .odex : berisi kode kompilasi AOT untuk metode dalam APK.
  • .art (optional) : berisi representasi internal ART dari beberapa string dan kelas yang tercantum dalam APK, yang digunakan untuk mempercepat startup aplikasi.

Opsi kompilasi

Pilihan kompilasi untuk ART terdiri dari dua kategori:

  1. Konfigurasi ROM sistem: kode apa yang dikompilasi AOT saat membangun citra sistem.
  2. Konfigurasi runtime: bagaimana ART mengkompilasi dan menjalankan aplikasi pada perangkat.

Salah satu opsi ART inti untuk mengkonfigurasi dua kategori ini adalah filter kompilator . Filter kompiler mengarahkan bagaimana ART mengkompilasi kode DEX dan merupakan opsi yang diteruskan ke alat dex2oat . Mulai di Android O, ada empat filter yang didukung secara resmi:

  • verifikasi : hanya jalankan verifikasi kode DEX.
  • quicken : jalankan verifikasi kode DEX dan optimalkan beberapa instruksi DEX untuk mendapatkan kinerja penerjemah yang lebih baik.
  • speed : jalankan verifikasi kode DEX dan kompilasi AOT semua metode.
  • speed-profile : jalankan verifikasi kode DEX dan metode kompilasi AOT yang tercantum dalam file profil.

Konfigurasi ROM sistem

Ada sejumlah opsi pembuatan ART yang tersedia untuk mengonfigurasi ROM sistem. Cara mengonfigurasi opsi ini bergantung pada ruang penyimpanan yang tersedia untuk /system dan jumlah aplikasi pra-instal. JAR/APK yang dikompilasi ke dalam ROM sistem dapat dibagi dalam empat kategori:

  • Kode classpath boot: dikompilasi dengan filter kompiler kecepatan secara default.
  • Kode server sistem: dikompilasi dengan filter kompiler kecepatan secara default.
  • Aplikasi inti khusus produk: dikompilasi dengan filter kompiler kecepatan secara default.
  • Semua aplikasi lain: dikompilasi dengan filter kompiler quicken secara default.

Opsi Makefile

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

  • DONT_DEXPREOPT_PREBUILTS (sejak Android L)
  • Mengaktifkan DONT_DEXPREOPT_PREBUILTS mencegah prebuilt agar tidak dioptimalkan sebelumnya. Ini adalah aplikasi yang include $(BUILD_PREBUILT) yang ditentukan di Android.mk mereka, seperti Gmail. Melewatkan pra-optimasi aplikasi bawaan yang kemungkinan akan diperbarui melalui Google Play menghemat /system tetapi menambah waktu boot pertama.

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (sejak Android 9)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER menentukan filter kompilator default untuk aplikasi yang dioptimalkan sebelumnya. Ini adalah aplikasi yang include $(BUILD_PREBUILT) yang ditentukan di Android.mk mereka, seperti Gmail. Jika tidak ditentukan, nilai default dipercepat.

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (baru di Android O MR1)
  • Mengaktifkan WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY hanya mengoptimalkan boot classpath dan toples server sistem.

  • LOCAL_DEX_PREOPT
  • Pra-optimasi juga dapat diaktifkan atau dinonaktifkan pada aplikasi individual dengan menentukan opsi LOCAL_DEX_PREOPT dalam definisi modul. Ini dapat berguna untuk menonaktifkan pra-pengoptimalan aplikasi yang mungkin segera menerima pembaruan Google Play karena pembaruan akan membuat kode yang telah dioptimalkan sebelumnya dalam citra sistem menjadi usang. Ini juga berguna untuk menghemat ruang pada OTA pemutakhiran versi utama karena pengguna mungkin sudah memiliki versi aplikasi yang lebih baru di partisi data.

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

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • Melewati opsi ke dex2oat untuk mengontrol bagaimana image boot dikompilasi. Ini dapat digunakan untuk menentukan daftar kelas gambar yang disesuaikan, daftar kelas yang dikompilasi, dan filter kompiler.

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • Melewati opsi ke dex2oat untuk mengontrol bagaimana segala sesuatu selain image boot dikompilasi.

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • Menyediakan kemampuan untuk melewatkan opsi dex2oat untuk modul dan konfigurasi produk tertentu. Ini diatur dalam file device.mk produk oleh $(call add-product-dex-preopt-module-config,<modules>,<option>) di mana <modules> adalah daftar nama LOCAL_MODULE dan LOCAL_PACKAGE untuk JAR dan APK file, masing-masing.

  • PRODUCT_DEXPREOPT_SPEED_APPS (New in Android O)
  • Daftar aplikasi yang telah diidentifikasi sebagai inti produk dan yang diinginkan untuk dikompilasi dengan filter kompilator kecepatan . Misalnya, aplikasi persisten seperti SystemUI mendapatkan kesempatan untuk menggunakan kompilasi yang dipandu profil hanya pada reboot berikutnya, jadi mungkin lebih baik bagi produk agar aplikasi ini selalu dikompilasi AOT.

  • PRODUCT_SYSTEM_SERVER_APPS (New in Android O)
  • Daftar aplikasi yang dimuat oleh server sistem. Aplikasi ini akan dikompilasi secara default dengan filter kompilator kecepatan .

  • PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD(Post Android O)
  • Apakah akan menyertakan versi debug ART pada perangkat. Secara default, ini diaktifkan untuk userdebug dan eng build. Perilaku dapat ditimpa dengan secara eksplisit menyetel opsi ke true atau false .

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

  • WITH_DEXPREOPT_PIC (Removed in Android O)
  • Di Android 5.1.0 hingga Android 6.0.1, WITH_DEXPREOPT_PIC dapat ditentukan untuk mengaktifkan kode posisi-independen (PIC). Dengan ini, kode yang dikompilasi dari gambar tidak harus dipindahkan dari /sistem ke /data/dalvik-cache, menghemat ruang di partisi data. Namun, ada sedikit dampak runtime karena 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 (dihapus di Android O MR1)
  • Opsi ini diganti dengan WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY yang juga mendahului toples server sistem.

Konfigurasi jalur kelas boot

  • Daftar Kelas yang Dimuat sebelumnya
  • Daftar kelas yang dimuat sebelumnya adalah daftar kelas yang diinisialisasi zigot saat startup. Ini menghemat setiap aplikasi dari keharusan menjalankan inisialisasi kelas ini secara terpisah, memungkinkan mereka untuk memulai lebih cepat dan berbagi halaman di memori. File daftar kelas yang dimuat sebelumnya terletak di frameworks/base/config/preloaded-classes secara default, dan berisi daftar yang disesuaikan untuk penggunaan telepon biasa. Ini mungkin berbeda untuk perangkat lain seperti perangkat yang dapat dikenakan, dan harus disesuaikan. Hati-hati saat menyetel ini; menambahkan terlalu banyak kelas menghabiskan memori saat kelas yang tidak digunakan dimuat. Menambahkan terlalu sedikit kelas memaksa setiap aplikasi harus memiliki salinannya sendiri, yang sekali lagi, membuang-buang memori.

    Contoh penggunaan (di device.mk produk):

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

    Catatan: Baris ini harus ditempatkan sebelum mewarisi makefile konfigurasi produk apa pun yang mendapatkan konfigurasi default dari: build/target/product/base.mk

  • Daftar Kelas Gambar
  • Daftar kelas gambar adalah daftar kelas yang diinisialisasi dex2oat sebelumnya dan disimpan di file boot.art. Ini memungkinkan zigot untuk memuat hasil ini dari file boot.art saat startup alih-alih menjalankan inisialisasi untuk kelas-kelas ini sendiri selama pramuat. Fitur utama dari ini adalah bahwa halaman yang dimuat dari gambar dan dibagikan di antara proses dapat bersih, memungkinkan mereka untuk ditukar dengan mudah dalam situasi memori rendah. Di L, secara default daftar kelas gambar menggunakan daftar yang sama dengan daftar kelas yang dimuat sebelumnya. Mulai pasca-L di AOSP, daftar kelas gambar kustom dapat ditentukan menggunakan:

    PRODUCT_DEX_PREOPT_BOOT_FLAGS
    

    Contoh penggunaan (di device.mk produk):

    PRODUCT_DEX_PREOPT_BOOT_FLAGS += --image-classes=<filename>
    
  • Daftar Kelas yang Disusun
  • Dalam AOSP pasca-L, subset kelas dari classpath boot dapat ditentukan untuk dikompilasi selama pra-optimasi menggunakan daftar kelas yang dikompilasi. Ini bisa menjadi opsi yang berguna untuk perangkat yang memiliki ruang sangat sempit dan tidak dapat memuat seluruh image boot yang telah dioptimalkan sebelumnya. Namun, kelas catatan yang tidak ditentukan oleh daftar ini tidak akan dikompilasi - bahkan pada perangkat - dan harus ditafsirkan, yang berpotensi memengaruhi kinerja waktu proses. Secara default, dex2oat akan mencari daftar kelas yang dikompilasi di $OUT/system/etc/compiled-classes, jadi yang khusus dapat disalin ke lokasi itu oleh device.mk. Lokasi file tertentu juga dapat ditentukan menggunakan:

    PRODUCT_DEX_PREOPT_BOOT_FLAGS
    

    Contoh penggunaan (di device.mk produk):

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

    Catatan: Baris ini harus ditempatkan sebelum mewarisi makefile konfigurasi produk apa pun yang mendapatkan konfigurasi default dari: build/target/product/base.mk

Konfigurasi waktu proses

Pilihan Jit

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

  • dalvik.vm.usejit: apakah JIT diaktifkan atau tidak.
  • dalvik.vm.jitinitialsize (default 64K): kapasitas awal cache kode. Cache kode akan secara teratur GC dan meningkat jika diperlukan.
  • dalvik.vm.jitmaxsize (default 64M): kapasitas maksimum cache kode.
  • dalvik.vm.jitthreshold: (default 10000) - Ini adalah ambang batas yang harus dilewati oleh penghitung "panas" metode agar metode dikompilasi JIT. Penghitung "panas" adalah metrik internal untuk runtime. Ini termasuk jumlah panggilan, cabang mundur, dan faktor lainnya.
  • dalvik.vm.usejitprofiles: apakah profil JIT diaktifkan atau tidak; ini dapat digunakan bahkan jika dalvik.vm.usejit salah. Perhatikan bahwa jika ini salah, profil kecepatan filter kompilator tidak mengkompilasi metode AOT apa pun dan setara dengan quicken .
  • dalvik.vm.jitprithreadweight (default ke dalvik.vm.jitthreshold / 20) - Bobot "sampel" JIT (lihat jitthreshold) untuk thread UI 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 penerjemah. Ini membantu memastikan metode yang terlibat dikompilasi untuk meminimalkan transisi (yang mahal).

Opsi pengelola paket

Sejak Android 7.0, ada cara umum untuk menentukan tingkat kompilasi/verifikasi yang terjadi pada berbagai tahap. Level kompilasi dapat dikonfigurasi melalui properti sistem dengan defaultnya adalah:

  • pm.dexopt.install=speed-profile
  • Ini adalah filter kompilasi yang digunakan saat menginstal aplikasi melalui Google Play. Kami menyarankan filter penginstalan diatur ke profil kecepatan untuk mengaktifkan penggunaan profil dari file metadata dex. Perhatikan bahwa jika profil tidak disediakan atau jika profil kecepatan kosong sama dengan quicken.

  • pm.dexopt.bg-dexopt=speed-profile
  • Ini adalah filter kompilasi yang digunakan saat perangkat dalam keadaan idle, mengisi daya, dan terisi penuh. Coba filter kompiler profil kecepatan untuk memanfaatkan kompilasi yang dipandu profil dan menghemat penyimpanan.

  • pm.dexopt.boot=verify
  • Filter kompilasi yang digunakan setelah pembaruan over-the-air. Kami sangat menyarankan filter compiler verifikasi untuk opsi ini untuk menghindari waktu booting yang sangat lama.

  • pm.dexopt.first-boot=quicken
  • Filter kompilasi untuk pertama kalinya perangkat melakukan booting. Filter yang digunakan di sini hanya akan memengaruhi waktu boot setelah pabrik. Kami menyarankan penyaring dipercepat untuk menghindari waktu yang lama sebelum pengguna dapat menggunakan telepon untuk pertama kalinya. Perhatikan bahwa jika semua aplikasi di /system sudah dikompilasi dengan filter kompiler quicken atau dikompilasi dengan filter kompiler profil kecepatan atau kecepatan, pm.dexopt.first-boot tidak berpengaruh.

Opsi Dex2oat

Perhatikan bahwa opsi ini memengaruhi dex2oat selama kompilasi di perangkat serta selama pra-pengoptimalan, sedangkan sebagian besar opsi yang dibahas di atas hanya memengaruhi pra-pengoptimalan.

Untuk mengontrol dex2oat saat mengkompilasi gambar boot:

  • dalvik.vm.image-dex2oat-Xms: ukuran tumpukan awal
  • dalvik.vm.image-dex2oat-Xmx: ukuran tumpukan maksimum
  • dalvik.vm.image-dex2oat-filter: opsi filter kompiler
  • dalvik.vm.image-dex2oat-threads: jumlah utas yang akan digunakan

Untuk mengontrol dex2oat saat mengkompilasi semuanya selain gambar boot:

  • dalvik.vm.dex2oat-Xms: ukuran tumpukan awal
  • dalvik.vm.dex2oat-Xmx: ukuran tumpukan maksimum
  • dalvik.vm.dex2oat-filter: opsi filter kompiler

Pada rilis melalui Android 6.0, satu opsi tambahan disediakan untuk mengompilasi semuanya selain image boot:

  • dalvik.vm.dex2oat-threads: jumlah utas yang digunakan

Dimulai dengan Android 6.1, ini menjadi dua opsi tambahan untuk mengompilasi semuanya selain gambar boot:

  • dalvik.vm.boot-dex2oat-threads: jumlah utas yang digunakan selama waktu boot
  • dalvik.vm.dex2oat-threads: jumlah utas yang digunakan setelah waktu boot

Dimulai dengan Android 7.1, dua opsi disediakan untuk mengontrol bagaimana memori digunakan saat mengompilasi semuanya selain image boot:

  • dalvik.vm.dex2oat-very-large: total ukuran file dex minimum dalam byte untuk menonaktifkan kompilasi AOT
  • dalvik.vm.dex2oat-swap: gunakan file swap dex2oat (untuk perangkat dengan memori rendah)

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

Dimulai dengan Android 11, tiga opsi afinitas CPU disediakan untuk memungkinkan utas kompiler dibatasi ke grup CPU tertentu:

  • dalvik.vm.boot-dex2oat-cpu-set: CPU menjalankan utas dex2oat selama waktu boot
  • dalvik.vm.image-dex2oat-cpu-set: CPU menjalankan dex2oat saat mengkompilasi gambar boot
  • dalvik.vm.dex2oat-cpu-set: CPU menjalankan utas dex2oat setelah waktu boot

CPU harus ditentukan sebagai daftar id CPU yang dipisahkan koma. Misalnya untuk menjalankan dex2oat pada CPU 0-3, atur:

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

Saat menyetel properti afinitas CPU, kami menyarankan untuk mencocokkan properti yang sesuai untuk jumlah utas dex2oat agar sesuai dengan jumlah CPU yang dipilih untuk menghindari pertikaian memori dan I/O yang tidak perlu:

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

Dimulai dengan Android 12, opsi berikut ditambahkan:

  • dalvik.vm.ps-min-first-save-ms: waktu menunggu runtime untuk menghasilkan profil aplikasi, pertama kali aplikasi diluncurkan
  • dalvik.vm.ps-min-save-period-ms: waktu minimum untuk menunggu sebelum memperbarui profil aplikasi
  • dalvik.vm.systemservercompilerfilter: filter compiler yang akan digunakan perangkat saat mengkompilasi ulang server sistem

Konfigurasi khusus A/B

konfigurasi ROM

Mulai Android 7.0, perangkat dapat menggunakan dua partisi sistem untuk mengaktifkan pembaruan sistem A/B . Untuk menghemat ukuran partisi sistem, file yang telah dipilih sebelumnya dapat diinstal di partisi sistem kedua yang tidak digunakan. Mereka kemudian disalin ke partisi data pada boot 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 boot, kode server sistem, dan aplikasi inti khusus produk selalu dikompilasi ke partisi sistem. Secara default, semua aplikasi lain dikompilasi ke partisi sistem kedua yang tidak digunakan. Ini dapat dikontrol dengan SYSTEM_OTHER_ODEX_FILTER , yang secara default memiliki nilai:

SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%

OTA dekstop latar belakang

Dengan perangkat berkemampuan A/B, aplikasi dapat dikompilasi di latar belakang untuk memperbarui ke citra sistem baru. Lihat Kompilasi aplikasi di latar belakang untuk secara opsional menyertakan skrip kompilasi dan binari dalam citra sistem. Filter kompilasi yang digunakan untuk kompilasi ini dikontrol dengan:

pm.dexopt.ab-ota=speed-profile

Sebaiknya gunakan profil kecepatan untuk memanfaatkan kompilasi yang dipandu profil dan menghemat penyimpanan.