Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Mengonfigurasi ART

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

Lihat ART dan Dalvik , format Dalvik Executable , 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 advance-of-time (AOT), dan mulai di Android 7.0 (Nougat atau N), ART menggunakan kombinasi hybrid 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 aliran kompilasi berikut:

  1. Aplikasi pada awalnya diinstal tanpa kompilasi AOT apa pun. Beberapa kali pertama aplikasi berjalan, itu akan diinterpretasikan, dan metode yang sering dieksekusi akan dikompilasi JIT.
  2. Saat perangkat dalam keadaan idle dan mengisi daya, daemon kompilasi berjalan ke kompilasi AOT kode yang sering digunakan berdasarkan profil yang dihasilkan selama operasi pertama.
  3. Restart aplikasi berikutnya akan menggunakan kode yang dipandu profil dan menghindari melakukan kompilasi JIT pada waktu proses 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 setiap rilis, tetapi sejak rilis Android O, file yang sedang dibuat adalah:

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

Opsi kompilasi

Pilihan kompilasi untuk ART terdiri dari dua kategori:

  1. Konfigurasi Sistem ROM: kode apa yang dikompilasi AOT saat membangun image sistem.
  2. Konfigurasi waktu proses: cara ART mengompilasi dan menjalankan aplikasi di perangkat.

Satu opsi ART inti untuk mengonfigurasi kedua kategori ini adalah filter kompilator . Filter kompilator dex2oat cara ART mengkompilasi kode DEX dan merupakan opsi yang diteruskan ke alat dex2oat . Mulai Android O, ada empat filter yang didukung secara resmi:

  • verifikasi : hanya jalankan verifikasi kode DEX.
  • percepat : jalankan verifikasi kode DEX dan optimalkan beberapa petunjuk DEX untuk mendapatkan kinerja juru bahasa yang lebih baik.
  • kecepatan : jalankan verifikasi kode DEX dan kompilasi AOT semua metode.
  • speed-profile : jalankan verifikasi kode DEX dan metode kompilasi AOT yang terdaftar dalam file profil.

Konfigurasi sistem ROM

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

  • Kode jalur kelas boot: dikompilasi dengan filter kompilator kecepatan secara default.
  • Kode server sistem: dikompilasi dengan filter kompilator kecepatan secara default.
  • Aplikasi inti khusus produk: dikompilasi dengan filter kompilator kecepatan secara default.
  • Semua aplikasi lain: dikompilasi dengan filter kompilator percepat secara default.

Opsi Makefile

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

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

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (sejak Android 9)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER menentukan filter compiler default untuk aplikasi yang telah dioptimalkan sebelumnya. Ini adalah aplikasi yang include $(BUILD_PREBUILT) 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 pra-pengoptimalan hanya pada jalur kelas boot dan jars server sistem.

  • LOCAL_DEX_PREOPT
  • Pra-pengoptimalan juga dapat diaktifkan atau dinonaktifkan pada masing-masing aplikasi 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 gambar sistem menjadi usang. Ini juga berguna untuk menghemat ruang pada OTA peningkatan versi utama karena pengguna mungkin sudah memiliki versi aplikasi yang lebih baru di partisi data.

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

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

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

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • Memberikan kemampuan untuk meneruskan opsi dex2oat untuk modul dan konfigurasi produk tertentu. Ini disetel dalam file device.mk produk oleh $(call add-product-dex-preopt-module-config,<modules>,<option>) 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 penyusun kecepatan . Misalnya, aplikasi persisten seperti SystemUI mendapatkan kesempatan untuk menggunakan kompilasi yang dipandu profil hanya pada booting ulang 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 speed compiler filter.

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

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

  • 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 tidak tergantung posisi (PIC). Dengan ini, kode yang dikompilasi dari gambar tidak harus dipindahkan dari / system ke / data / dalvik-cache, menghemat ruang di partisi data. Namun, ada sedikit dampak waktu proses 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 menggunakan stoples server sistem.

Boot konfigurasi classpath

  • Daftar Kelas yang Dimuat sebelumnya
  • Daftar kelas yang dimuat sebelumnya adalah daftar kelas yang diinisialisasi oleh zigot saat memulai. Ini menyelamatkan setiap aplikasi dari keharusan menjalankan penginisialisasi kelas ini secara terpisah, memungkinkan mereka untuk memulai lebih cepat dan berbagi halaman dalam 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 disetel dengan sesuai. Berhati-hatilah saat menyetel ini; menambahkan terlalu banyak kelas akan memboroskan memori saat kelas yang tidak digunakan dimuat. Menambahkan terlalu sedikit kelas akan memaksa setiap aplikasi untuk memiliki salinannya sendiri, yang sekali lagi menghabiskan 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 yang default dari: build/target/product/base.mk

  • Daftar Kelas Gambar
  • Daftar kelas gambar adalah daftar kelas yang dex2oat diinisialisasi sebelumnya dan disimpan di file boot.art. Ini memungkinkan zigot untuk memuat hasil ini keluar dari file boot.art saat startup alih-alih menjalankan penginisialisasi untuk kelas-kelas ini sendiri selama pramuat. Fitur utama dari hal ini adalah halaman yang dimuat dari gambar dan dibagikan di antara proses dapat dibersihkan, memungkinkannya untuk ditukar dengan mudah dalam situasi memori rendah. Di L, secara default daftar kelas gambar menggunakan daftar yang sama seperti 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>
    
    .dll
  • Daftar Kelas yang Disusun
  • Dalam AOSP pasca-L, subset kelas dari jalur kelas boot dapat ditentukan untuk dikompilasi selama pra-pengoptimalan menggunakan daftar kelas yang dikompilasi. Ini bisa menjadi opsi yang berguna untuk perangkat dengan ruang yang sangat sempit dan tidak dapat memuat seluruh gambar boot yang dioptimalkan sebelumnya. Namun, kelas catatan yang tidak ditentukan oleh daftar ini tidak akan dikompilasi - bahkan pada perangkatnya - dan harus ditafsirkan, berpotensi memengaruhi kinerja waktu proses. Secara default, dex2oat akan mencari daftar kelas yang dikompilasi di $ OUT / system / etc / compiled-class, sehingga 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 yang default dari: build/target/product/base.mk

Konfigurasi runtime

Opsi jit

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

  • dalvik.vm.usejit: apakah JIT diaktifkan atau tidak.
  • dalvik.vm.jitinitialsize (default 64K): kapasitas awal cache kode. Cache kode secara teratur akan menjadi 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 "hotness" dari suatu metode agar metode tersebut dapat dikompilasi JIT. Penghitung "hotness" adalah metrik internal runtime. Ini mencakup jumlah panggilan, cabang mundur, dan faktor lainnya.
  • profil dalvik.vm.usejit: apakah profil JIT diaktifkan atau tidak; ini dapat digunakan bahkan jika dalvik.vm.usejit salah. Perhatikan bahwa jika ini salah, profil kecepatan filter kompiler tidak AOT-mengkompilasi metode 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 interpreter. 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 di berbagai tahapan. Tingkat kompilasi dapat dikonfigurasi melalui properti sistem dengan default:

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

  • pm.dexopt.bg-dexopt=speed-profile
  • Ini adalah filter kompilasi yang digunakan saat perangkat menganggur, 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 update over-the-air. Kami sangat menyarankan filter verifikasi kompilator untuk opsi ini untuk menghindari waktu boot 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 booting setelah pabrik. Kami menyarankan filter dipercepat untuk menghindari waktu yang lama sebelum pengguna dapat menggunakan telepon untuk pertama kalinya. Perhatikan bahwa jika semua aplikasi di /system sudah disusun dengan filter compiler mempercepat atau dikompilasi dengan filter kecepatan atau speed-profil compiler, yang 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 sedang mengompilasi gambar boot:

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

Untuk mengontrol dex2oat saat mengkompilasi semua hal selain gambar boot:

  • dalvik.vm.dex2oat-Xms: ukuran heap awal
  • dalvik.vm.dex2oat-Xmx: ukuran heap maksimum
  • dalvik.vm.dex2oat-filter: opsi filter penyusun

Pada rilis melalui Android 6.0, satu opsi tambahan disediakan untuk mengompilasi segala sesuatu selain gambar boot:

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

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

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

Dimulai dengan Android 7.1, tersedia dua opsi untuk mengontrol bagaimana memori digunakan saat mengompilasi segala sesuatu selain gambar 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 mereka dapat membatasi aplikasi apa yang dapat dikompilasi.

Dimulai dengan Android 11, tiga opsi afinitas CPU disediakan untuk memungkinkan thread compiler 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 mengompilasi gambar boot
  • dalvik.vm.dex2oat-cpu-set: CPU menjalankan utas dex2oat setelah waktu boot

CPU harus ditetapkan sebagai daftar id CPU yang dipisahkan koma. Misalnya untuk berjalan di dex2oat pada CPU 0-3, setel:

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

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

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

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 jalur kelas 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 memiliki nilai secara default:

SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%

Latar belakang dexopt OTA

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

pm.dexopt.ab-ota=speed-profile

Kami merekomendasikan penggunaan profil-kecepatan untuk memanfaatkan kompilasi terpandu profil dan menghemat penyimpanan.