ART'yi Yapılandırma

Bu sayfada ART ve derleme seçeneklerinin nasıl yapılandırılacağı anlatılmaktadır. Burada ele alınan konular, sistem görüntüsünün ön derleme yapılandırmasını, dex2oat derleme seçeneklerini ve sistem bölümü alanı, veri bölümü alanı ve performansın nasıl değiş tokuş edileceğini içerir.

ART ile çalışmak için ART ve Dalvik , Dalvik Yürütülebilir formatı ve source.android.com'da kalan sayfalara bakın. Uygulamalarınızın düzgün çalıştığından emin olmak için Android Çalışma Zamanında (ART) Uygulama Davranışını Doğrulama konusuna bakın.

SANAT nasıl çalışır?

ART, önceden (AOT) derleme kullanır ve Android 7.0'dan (Nougat veya N) başlayarak, AOT, tam zamanında (JIT) derleme ve profil kılavuzlu derlemenin karma bir kombinasyonunu kullanır. Tüm bu derleme modlarının kombinasyonu yapılandırılabilir ve bu bölümde tartışılacaktır. Örnek olarak, Pixel cihazları aşağıdaki derleme akışıyla yapılandırılır:

  1. Bir uygulama başlangıçta herhangi bir AOT derlemesi olmadan yüklenir. Uygulama ilk birkaç kez çalıştırıldığında yorumlanacak ve sıklıkla yürütülen yöntemler JIT derlenecektir.
  2. Cihaz boştayken ve şarj olurken, bir derleme arka plan programı, ilk çalıştırmalar sırasında oluşturulan bir profile dayalı olarak sık kullanılan kodu AOT derlemek için çalışır.
  3. Bir uygulamanın bir sonraki yeniden başlatılması, profil kılavuzlu kodu kullanacak ve halihazırda derlenmiş yöntemler için çalışma zamanında JIT derlemesi yapmaktan kaçınacaktır. Yeni çalıştırmalar sırasında JIT'i derleyen yöntemler profile eklenecek ve daha sonra derleme arka plan programı tarafından alınacaktır.

ART, bir derleyici ( dex2oat aracı) ve Zygote'u başlatmak için yüklenen bir çalışma zamanı ( libart.so ) içerir. dex2oat aracı bir APK dosyası alır ve çalışma zamanının yüklediği bir veya daha fazla derleme yapıt dosyası oluşturur. Dosya sayısı, uzantıları ve adları sürümler arasında değişebilir, ancak Android O sürümünden itibaren oluşturulan dosyalar şunlardır:

  • .vdex : APK'nın sıkıştırılmamış DEX kodunu ve doğrulamayı hızlandırmak için bazı ek meta verileri içerir.
  • .odex : APK'daki yöntemler için AOT derlenmiş kodunu içerir.
  • .art (optional) : APK'da listelenen ve uygulamanın başlatılmasını hızlandırmak için kullanılan bazı dizelerin ve sınıfların ART dahili temsillerini içerir.

Derleme seçenekleri

ART için derleme seçenekleri iki kategoridedir:

  1. Sistem ROM yapılandırması: Bir sistem görüntüsü oluştururken hangi kodun AOT tarafından derlendiği.
  2. Çalışma zamanı yapılandırması: ART'nin bir cihazdaki uygulamaları nasıl derlediği ve çalıştırdığı.

Bu iki kategoriyi yapılandırmak için bir temel ART seçeneği, derleyici filtreleridir . Derleyici filtreleri, ART'nin DEX kodunu nasıl derlediğini yönlendirir ve dex2oat aracına iletilen bir seçenektir. Android O'dan başlayarak, resmi olarak desteklenen dört filtre vardır:

  • doğrula : yalnızca DEX kodu doğrulamasını çalıştırın.
  • Quicken : Daha iyi yorumlayıcı performansı elde etmek için DEX kod doğrulamasını çalıştırın ve bazı DEX talimatlarını optimize edin.
  • hız : DEX kod doğrulamasını çalıştırın ve tüm yöntemleri AOT-derleyin.
  • speed-profile : bir profil dosyasında listelenen DEX kod doğrulamasını ve AOT derleme yöntemlerini çalıştırın.

Sistem ROM yapılandırması

Bir sistem ROM'unu yapılandırmak için bir dizi ART oluşturma seçeneği vardır. Bu seçeneklerin nasıl yapılandırılacağı, /system için kullanılabilir depolama alanına ve önceden yüklenmiş uygulamaların sayısına bağlıdır. Bir sistem ROM'unda derlenen JAR'lar/APK'lar dört kategoriye ayrılabilir:

  • Önyükleme sınıf yolu kodu: varsayılan olarak hız derleyici filtresiyle derlenir.
  • Sistem sunucusu kodu: varsayılan olarak hız derleyici filtresiyle derlenir.
  • Ürüne özel çekirdek uygulamalar: varsayılan olarak hız derleyici filtresiyle derlenir.
  • Diğer tüm uygulamalar: varsayılan olarak hızlı derleyici filtresiyle derlenir .

Makefile seçenekleri

  • WITH_DEXPREOPT
  • dex2oat sistem görüntüsünde kurulu DEX kodunda çağrılıp çağrılmadığı. Varsayılan olarak etkindir.

  • DONT_DEXPREOPT_PREBUILTS (Android L'den beri)
  • DONT_DEXPREOPT_PREBUILTS etkinleştirilmesi, önceden oluşturulmuşların önceden optimize edilmesini engeller. Bunlar, Gmail gibi Android.mk include $(BUILD_PREBUILT) uygulamalardır. Google Play aracılığıyla güncellenmesi muhtemel olan önceden oluşturulmuş uygulamaların ön optimizasyonunu atlamak, /system alanından tasarruf sağlar, ancak ilk açılış süresine eklenir.

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (Android 9'dan beri)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER , önceden optimize edilmiş uygulamalar için varsayılan derleyici filtresini belirtir. Bunlar, Gmail gibi Android.mk include $(BUILD_PREBUILT) uygulamalardır. Belirtilmemişse, varsayılan değer hızlıdır.

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (Android O MR1'de yeni)
  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY etkinleştirilmesi, yalnızca önyükleme sınıf yolunu ve sistem sunucusu kavanozlarını önceden optimize eder.

  • LOCAL_DEX_PREOPT
  • Modül tanımında LOCAL_DEX_PREOPT seçeneği belirlenerek, ön optimizasyon da bireysel uygulama bazında etkinleştirilebilir veya devre dışı bırakılabilir. Bu, güncellemeler sistem görüntüsündeki önceden optimize edilmiş kodu geçersiz kılacağından, Google Play güncellemelerini hemen alabilecek uygulamaların ön optimizasyonunu devre dışı bırakmak için faydalı olabilir. Bu, kullanıcıların veri bölümünde zaten daha yeni uygulama sürümlerine sahip olabileceğinden, ana sürüm yükseltme OTA'larında yerden tasarruf etmek için de yararlıdır.

    LOCAL_DEX_PREOPT , ön optimizasyonu etkinleştirmek veya devre dışı bırakmak için sırasıyla 'true' veya 'false' değerlerini destekler. Ayrıca, ön optimizasyonun classes.dex dosyasını APK veya JAR dosyasından çıkarmaması gerekiyorsa 'nostripping' belirtilebilir. Normalde bu dosya, ön optimizasyondan sonra artık gerekli olmadığından kaldırılır, ancak bu son seçenek, üçüncü taraf APK imzalarının geçerli kalmasına izin vermek için gereklidir.

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • Önyükleme görüntüsünün nasıl derlendiğini denetlemek için seçenekleri dex2oat . Özelleştirilmiş görüntü sınıfları listelerini, derlenmiş sınıf listelerini ve derleyici filtrelerini belirtmek için kullanılabilir.

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • Önyükleme görüntüsü dışındaki her şeyin nasıl derlendiğini kontrol etmek için seçenekleri dex2oat .

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • Belirli bir modül ve ürün konfigürasyonu için dex2oat seçeneklerini geçme yeteneği sağlar. Bir ürünün device.mk dosyasında $(call add-product-dex-preopt-module-config,<modules>,<option>) tarafından ayarlanır; burada <modules> , JAR ve APK için LOCAL_MODULE ve LOCAL_PACKAGE adlarının bir listesidir. sırasıyla dosyalar.

  • PRODUCT_DEXPREOPT_SPEED_APPS (New in Android O)
  • Ürünler için temel olarak tanımlanan ve hız derleyici filtresiyle derlenmesi istenen uygulamaların listesi. Örneğin, SystemUI gibi kalıcı uygulamalar, yalnızca bir sonraki yeniden başlatmada profil kılavuzlu derlemeyi kullanma şansına sahiptir, bu nedenle ürün için bu uygulamaların her zaman AOT tarafından derlenmesi daha iyi olabilir.

  • PRODUCT_SYSTEM_SERVER_APPS (New in Android O)
  • Sistem sunucusu tarafından yüklenen uygulamaların listesi. Bu uygulamalar varsayılan olarak hız derleyici filtresiyle derlenecektir.

  • PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD(Post Android O)
  • Cihazda ART'nin hata ayıklama sürümünün dahil edilip edilmeyeceği. Varsayılan olarak, bu, userdebug ve eng derlemeleri için etkinleştirilmiştir. Bu davranış, seçenek açıkça true veya false olarak ayarlanarak geçersiz kılınabilir.

    Varsayılan olarak, cihaz hata ayıklama olmayan sürümü ( libart.so ) kullanır. Geçiş yapmak için, sistem özelliğini persist.sys.dalvik.vm.lib.2 olarak libartd.so olarak ayarlayın.

  • WITH_DEXPREOPT_PIC (Removed in Android O)
  • Android 5.1.0'dan Android 6.0.1'e kadar, WITH_DEXPREOPT_PIC , konumdan bağımsız kodu (PIC) etkinleştirmek için belirtilebilir. Bununla, görüntüden derlenen kodun /system'den /data/dalvik-cache'ye taşınması gerekmez, bu da veri bölümünde yerden tasarruf sağlar. Ancak, konuma bağlı koddan yararlanan bir optimizasyonu devre dışı bıraktığı için çalışma zamanı üzerinde hafif bir etkisi vardır. Tipik olarak, /data içinde yer kazanmak isteyen aygıtlar PIC derlemesini etkinleştirmelidir.

    Android 7.0'da PIC derlemesi varsayılan olarak etkindi.

  • WITH_DEXPREOPT_BOOT_IMG_ONLY (Android O MR1'de kaldırılmıştır)
  • Bu seçenek, sistem sunucusu kavanozlarını da önceden seçen WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY ile değiştirildi.

Önyükleme sınıf yolu yapılandırması

  • Önceden Yüklenmiş Sınıflar Listesi
  • Önceden yüklenmiş sınıflar listesi, zigotun başlangıçta başlattığı sınıfların bir listesidir. Bu, her uygulamayı bu sınıf başlatıcıları ayrı ayrı çalıştırma zorunluluğundan kurtararak daha hızlı başlamalarına ve bellekteki sayfaları paylaşmalarına olanak tanır. Önceden yüklenmiş sınıflar listesi dosyası, varsayılan olarak frameworks/base/config/preloaded-classes konumunda bulunur ve tipik telefon kullanımı için ayarlanmış bir liste içerir. Bu, giyilebilir cihazlar gibi diğer cihazlar için farklı olabilir ve buna göre ayarlanmalıdır. Bunu ayarlarken dikkatli olun; kullanılmayan sınıflar yüklendiğinde çok fazla sınıf eklemek hafızayı boşa harcar. Çok az sınıf eklemek, her uygulamayı kendi kopyasına sahip olmaya zorlar ve bu da yine hafızayı boşa harcar.

    Örnek kullanım (ürünün device.mk dosyasında):

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

    Not: Bu satır, varsayılanı şuradan alan herhangi bir ürün yapılandırma makefile dosyasını devralmadan önce yerleştirilmelidir: build/target/product/base.mk

  • Resim Sınıfları Listesi
  • Görüntü sınıfları listesi, dex2oat'ın önceden başlattığı ve boot.art dosyasında depoladığı sınıfların bir listesidir. Bu, zigotun önyükleme sırasında bu sınıflar için başlatıcıları kendisi çalıştırmak yerine başlangıçta bu sonuçları boot.art dosyasından yüklemesine olanak tanır. Bunun önemli bir özelliği, görüntüden yüklenen ve işlemler arasında paylaşılan sayfaların temiz olabilmesi ve düşük bellek durumlarında kolayca değiştirilebilmesidir. L'de, varsayılan olarak görüntü sınıfları listesi, önceden yüklenmiş sınıflar listesiyle aynı listeyi kullanır. AOSP'de L sonrası başlayarak, aşağıdakiler kullanılarak özel bir görüntü sınıfları listesi belirtilebilir:

    PRODUCT_DEX_PREOPT_BOOT_FLAGS
    

    Örnek kullanım (ürünün device.mk içinde):

    PRODUCT_DEX_PREOPT_BOOT_FLAGS += --image-classes=<filename>
    
  • Derlenmiş Sınıflar Listesi
  • L AOSP sonrası, önyükleme sınıf yolundan bir sınıf alt kümesi, derlenmiş sınıflar listesi kullanılarak ön optimizasyon sırasında derlenmek üzere belirtilebilir. Bu, alanı çok dar olan ve önceden optimize edilmiş önyükleme görüntüsünün tamamına sığamayan aygıtlar için yararlı bir seçenek olabilir. Ancak, bu listede belirtilmeyen not sınıfları derlenmeyecek - cihazda bile - ve yorumlanmaları gerekir, bu da çalışma zamanı performansını potansiyel olarak etkiler. Varsayılan olarak, dex2oat $OUT/system/etc/compiled-classes içinde derlenmiş bir sınıf listesi arayacaktır, böylece özel bir sınıf bu konuma device.mk tarafından kopyalanabilir. Belirli bir dosya konumu şu şekilde de belirtilebilir:

    PRODUCT_DEX_PREOPT_BOOT_FLAGS
    

    Örnek kullanım (ürünün device.mk ):

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

    Not: Bu satır, varsayılanı şuradan alan herhangi bir ürün yapılandırma makefile dosyasını devralmadan önce yerleştirilmelidir: build/target/product/base.mk

Çalışma zamanı yapılandırması

Jit seçenekleri

Aşağıdaki seçenekler, yalnızca ART JIT derleyicisinin kullanılabilir olduğu Android sürümlerini etkiler.

  • dalvik.vm.usejit: JIT'in etkin olup olmadığı.
  • dalvik.vm.jitinitialsize (varsayılan 64K): kod önbelleğinin başlangıç ​​kapasitesi. Kod önbelleği düzenli olarak GC yapacak ve gerekirse artacaktır.
  • dalvik.vm.jitmaxsize (varsayılan 64M): kod önbelleğinin maksimum kapasitesi.
  • dalvik.vm.jitthreshold: (varsayılan 10000) - Bu, yöntemin JIT derlenmesi için bir yöntemin "sıcaklık" sayacının geçmesi gereken eşiktir. "Sıcaklık" sayacı, çalışma zamanına dahil olan bir ölçümdür. Çağrıların sayısını, geriye dönük dalları ve diğer faktörleri içerir.
  • dalvik.vm.usejitprofiles: JIT profillerinin etkin olup olmadığı; bu, dalvik.vm.usejit yanlış olsa bile kullanılabilir. Bu yanlışsa, derleyici filtresi hız profilinin hiçbir yöntemi AOT derlemediğini ve quicken ile eşdeğer olduğunu unutmayın.
  • dalvik.vm.jitprithreadweight (varsayılan dalvik.vm.jitthreshold / 20) - Uygulama UI iş parçacığı için JIT "örneklerinin" (jitthreshold'a bakın) ağırlığı. Uygulamayla etkileşim kurarken kullanıcıların deneyimini doğrudan etkileyen yöntemlerin derlenmesini hızlandırmak için kullanın.
  • dalvik.vm.jittransitionweight: (varsayılan olarak dalvik.vm.jitthreshold / 10) derleme kodu ile yorumlayıcı arasında geçiş yapan yöntem çağırmanın ağırlığı. Bu, geçişleri (pahalı olan) en aza indirmek için ilgili yöntemlerin derlendiğinden emin olmaya yardımcı olur.

Paket yöneticisi seçenekleri

Android 7.0'dan beri, çeşitli aşamalarda gerçekleşen derleme/doğrulama düzeyini belirlemenin genel bir yolu vardır. Derleme seviyeleri, varsayılanlar şu şekilde olacak şekilde sistem özellikleri aracılığıyla yapılandırılabilir:

  • pm.dexopt.install=speed-profile
  • Bu, Google Play üzerinden uygulama yüklerken kullanılan derleme filtresidir. Dex meta veri dosyalarından profillerin kullanımını etkinleştirmek için kurulum filtresinin speed-profile olarak ayarlanmasını öneririz. Bir profil sağlanmadıysa veya boşsa speed-profile, hızlandırmaya eşdeğerdir.

  • pm.dexopt.bg-dexopt=speed-profile
  • Bu, cihaz boştayken, şarj olurken ve tam şarjlıyken kullanılan derleme filtresidir. Profil yönlendirmeli derlemeden yararlanmak ve depolama alanından tasarruf etmek için hız profili derleyici filtresini deneyin.

  • pm.dexopt.boot=verify
  • Havadan güncellemeden sonra kullanılan derleme filtresi. Çok uzun önyükleme sürelerinden kaçınmak için bu seçenek için derleyici doğrulama filtresini şiddetle öneririz.

  • pm.dexopt.first-boot=quicken
  • Aygıtın ilk kez önyükleme yaptığı derleme filtresi. Burada kullanılan filtre, yalnızca fabrikadan sonra önyükleme süresini etkiler. Kullanıcının telefonu ilk kez kullanmaya başlamadan önce uzun süre geçmesini önlemek için filtrenin hızlandırılmasını öneririz. /system içindeki tüm uygulamalar zaten quicken derleyici filtresiyle derlenmişse veya hız veya hız profili derleyici filtresiyle derlenmişse, pm.dexopt.first pm.dexopt.first-boot hiçbir etkisi olmadığını unutmayın.

Dex2oat seçenekleri

Bu seçeneklerin cihaz üzerinde derleme sırasında olduğu kadar ön optimizasyon sırasında dex2oat etkilediğine, ancak yukarıda tartışılan seçeneklerin çoğunun yalnızca ön optimizasyonu etkilediğine dikkat edin.

Önyükleme görüntüsünü derlerken dex2oat kontrol etmek için:

  • dalvik.vm.image-dex2oat-Xms: ilk yığın boyutu
  • dalvik.vm.image-dex2oat-Xmx: maksimum yığın boyutu
  • dalvik.vm.image-dex2oat-filter: derleyici filtre seçeneği
  • dalvik.vm.image-dex2oat-threads: kullanılacak iş parçacığı sayısı

Önyükleme görüntüsü dışındaki her şeyi derlerken dex2oat kontrol etmek için:

  • dalvik.vm.dex2oat-Xms: ilk yığın boyutu
  • dalvik.vm.dex2oat-Xmx: maksimum yığın boyutu
  • dalvik.vm.dex2oat-filter: derleyici filtre seçeneği

Android 6.0 üzerinden yayınlanan sürümlerde, önyükleme görüntüsünün yanı sıra her şeyi derlemek için ek bir seçenek sunulur:

  • dalvik.vm.dex2oat-threads: kullanılacak iş parçacığı sayısı

Android 6.1 ile başlayarak, bu, önyükleme görüntüsünün yanı sıra her şeyi derlemek için iki ek seçenek haline gelir:

  • dalvik.vm.boot-dex2oat-threads: önyükleme sırasında kullanılacak iş parçacığı sayısı
  • dalvik.vm.dex2oat-threads: önyükleme süresinden sonra kullanılacak iş parçacığı sayısı

Android 7.1'den başlayarak, önyükleme görüntüsü dışındaki her şeyi derlerken belleğin nasıl kullanıldığını kontrol etmek için iki seçenek sunulur:

  • dalvik.vm.dex2oat-very-large: AOT derlemesini devre dışı bırakmak için bayt cinsinden minimum toplam dex dosya boyutu
  • dalvik.vm.dex2oat-swap: dex2oat takas dosyasını kullanın (düşük bellekli cihazlar için)

dex2oat için ilk ve maksimum yığın boyutunu kontrol eden seçenekler, hangi uygulamaların derlenebileceğini sınırlayabileceğinden azaltılmamalıdır.

Android 11'den başlayarak, derleyici iş parçacıklarının belirli bir CPU grubuyla sınırlandırılmasına izin vermek için üç CPU benzeşim seçeneği sunulur:

  • dalvik.vm.boot-dex2oat-cpu-set: Önyükleme sırasında dex2oat iş parçacıklarını çalıştıran CPU'lar
  • dalvik.vm.image-dex2oat-cpu-set: Önyükleme görüntüsünü derlerken dex2oat çalıştıran CPU'lar
  • dalvik.vm.dex2oat-cpu-set: Önyükleme zamanından sonra dex2oat iş parçacıklarını çalıştıran CPU'lar

CPU'lar, virgülle ayrılmış CPU kimlikleri listesi olarak belirtilmelidir. Örneğin, 0-3 CPU'larında dex2oat üzerinde çalışmak için şunu ayarlayın:

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

CPU benzeşim özelliklerini ayarlarken, gereksiz bellek ve G/Ç çekişmesini önlemek için dex2oat iş parçacığı sayısı için karşılık gelen özelliği seçilen CPU sayısıyla eşleştirmenizi öneririz:

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

Android 12'den başlayarak, aşağıdaki seçenekler eklendi:

  • dalvik.vm.ps-min-first-save-ms: çalışma zamanının uygulamanın bir profilini oluşturmasını bekleme süresi, uygulama ilk kez başlatıldığında
  • dalvik.vm.ps-min-save-period-ms: Bir uygulamanın profilini güncellemeden önce minimum bekleme süresi
  • dalvik.vm.systemservercompilerfilter: cihazın sistem sunucusunu yeniden derlerken kullanacağı derleyici filtresi

A/B'ye özel yapılandırma

ROM yapılandırması

Android 7.0'dan itibaren, cihazlar A/B sistem güncellemelerini etkinleştirmek için iki sistem bölümü kullanabilir. Sistem bölümü boyutundan tasarruf etmek için önceden seçilmiş dosyalar kullanılmayan ikinci sistem bölümüne yüklenebilir. Daha sonra ilk açılışta veri bölümüne kopyalanırlar.

Örnek kullanım ( device-common.mk içinde):

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

Ve cihazın BoardConfig.mk :

BOARD_USES_SYSTEM_OTHER_ODEX := true

Önyükleme sınıf yolu kodunun, sistem sunucusu kodunun ve ürüne özgü çekirdek uygulamaların her zaman sistem bölümünü derlediğine dikkat edin. Varsayılan olarak, diğer tüm uygulamalar kullanılmayan ikinci sistem bölümünde derlenir. Bu, varsayılan olarak bir değere sahip olan SYSTEM_OTHER_ODEX_FILTER ile kontrol edilebilir:

SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%

Arka plan dexopt OTA

A/B özellikli cihazlarla, yeni sistem görüntüsüne güncelleme için uygulamalar arka planda derlenebilir. Derleme komut dosyasını ve ikili dosyaları isteğe bağlı olarak sistem görüntüsüne dahil etmek için arka planda Uygulama derlemesine bakın. Bu derleme için kullanılan derleme filtresi şu şekilde kontrol edilir:

pm.dexopt.ab-ota=speed-profile

Profil yönlendirmeli derlemeden yararlanmak ve depolama alanından tasarruf etmek için hız profilini kullanmanızı öneririz.