Önyükleme görüntüsü profilleri

Android 11 veya üzeri, sistem sunucusu ve önyükleme sınıf yolu gibi çeşitli sistem düzeyindeki bileşenlerin koduyla ilgili bilgileri kapsayan önyükleme görüntü profilleri oluşturmayı destekler. Android Runtime (ART), bazıları Android'in performansı açısından kritik olan ve tüm yerel olmayan kodların (sistem veya uygulama düzeyi) yürütülmesini etkileyen sistem çapında optimizasyonlar gerçekleştirmek için bu bilgileri kullanır. Bazı durumlarda, önyükleme görüntüsü profilleri yürütme performansını ve bellek tüketimini çift haneli yüzdelerle etkileyebilir.

Önyükleme profili bilgilerini alın

Önyükleme görüntüsü profilleri, kritik kullanıcı yolculukları (CUJ'ler) sırasında yürütülen uygulamaların profillerinden türetilir. Belirli bir cihaz yapılandırmasında ART, uygulamalar tarafından kullanılan önyükleme sınıf yolu yöntemlerini ve sınıflarını (JIT profillerinin bir parçası olarak) yakalar ve ardından bu bilgileri uygulama profiline kaydeder (örneğin, /data/misc/profiles/cur/0/com.android.chrome/primary.prof ), burada önyükleme sınıf yolu Dalvik EXecutable (DEX) dosyası tarafından indekslenir (bkz. ART profil formatı ).

Önyükleme sınıf yolunun hangi kısmının en çok kullanıldığını ve optimize edilmesinin en önemli olduğunu belirlemek için CUJ'ler sırasında kaydedilen uygulama profillerini inceleyin (örneğin, bkz . ART profil formatı ). Tüm yöntemlerin veya sınıfların dahil edilmesi performansı olumsuz yönde etkiler; bu nedenle en sık kullanılan kod yollarına odaklanın. Örneğin, önyükleme sınıf yolundaki bir yöntem tek bir uygulama tarafından kullanılıyorsa, önyükleme profillerinin parçası olmamalıdır. Her cihazın, CUJ seçimine ve test tarafından üretilen veri miktarına göre yöntem/sınıf seçimini yapılandırması gerekir.

Cihazdaki tüm bireysel uygulama profillerinden önyükleme sınıf yolu bilgilerini toplamak için adb shell cmd package snapshot-profile android komutunu çalıştırın. Toplu bilgileri, tek tek profilleri manuel olarak toplamadan, işleme ve yöntem/sınıf seçimi için temel olarak kullanabilirsiniz (ancak istenirse bunu yapabilirsiniz).

Önyükleme görüntüsü profili

Şekil 1. Önyükleme görüntüsü profillerini alma işlemi

Önyükleme görüntüsü profil verileri

Önyükleme görüntüsü profilleri aşağıdaki dosyaları ve verileri içerir.

  • Önyükleme sınıf yolu profili ( frameworks/base/config/boot-image-profile.txt ). Önyükleme sınıf yolundan hangi yöntemlerin optimize edileceğini, önyükleme .art görüntüsüne hangi sınıfın dahil edileceğini ve karşılık gelen DEX dosyalarının nasıl düzenlendiğini belirler.

  • Önceden yüklenmiş sınıfların listesi. Zygote'ta hangi sınıfların önceden yüklendiğini belirler.

  • Sistem sunucusu bileşenlerinin profili ( frameworks/base/services/art-profile ). Sistem sunucusundaki hangi yöntemlerin optimize edileceğini/derleneceğini, önyükleme .art görüntüsüne hangi sınıfın dahil edileceğini ve karşılık gelen DEX dosyalarının nasıl düzenlendiğini belirler.

ART profil formatı

ART profili, optimize edilmeye değer yöntemler ve başlatma sırasında kullanılan sınıflar hakkında bilgiler de dahil olmak üzere, yüklenen DEX dosyalarının her birinden bilgi yakalar. Önyükleme görüntüsü profili oluşturma etkinleştirildiğinde, ART ayrıca profile önyükleme sınıf yolunu ve sistem sunucusu JAR dosyalarını da dahil eder ve her DEX dosyasına onu kullanan paketin adını ekler.

Örneğin, ham önyükleme görüntüsü profilini aşağıdaki komutla boşaltın:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

Bu şuna benzer bir çıktı üretir:

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

Yukarıdaki örnekte:

  • core-oj.jar com.google.android.ext.services ve com.android.systemui tarafından kullanılır. Her giriş core-oj.jar kullanılan iki paketi listeler.

  • Her iki işlem de DEX indeksi 520'ye sahip yöntemi kullanır, ancak yalnızca systemui işlemi DEX indeksi 521'e sahip yöntemi kullanır. Aynı mantık diğer profil bölümleri (örneğin başlangıç ​​sınıfları) için de geçerlidir.

Veri işleme sırasında, sistem düzeyindeki işlemlere (örneğin, sistem sunucusu veya systemui ) veya yaygın olarak kullanılmayan ancak yine de önemli olan yöntemlere (örneğin, sunucu tarafından kullanılan yöntemler) öncelik vererek, kullanıma dayalı yöntemleri/sınıfları filtreleyin. kamera uygulaması).

Profil formatı, her yönteme birden fazla bayrakla (başlangıç, başlangıç ​​sonrası, hotness, abi) dahili olarak açıklama ekler; bu, salt döküm formatında görüntülenenden daha fazladır. Tüm sinyallerden yararlanmak için mevcut komut dosyalarını değiştirin.

Öneriler

En iyi sonuçları elde etmek için aşağıdaki yönergeleri kullanın.

  • Önyükleme görüntü profilleri oluşturmaya yönelik yapılandırmayı birkaç test cihazına dağıtın ve son önyükleme görüntü profilini oluşturmadan önce sonuçları toplayın. profman aracı birden çok önyükleme görüntüsü profilinin toplanmasını ve seçilmesini destekler, ancak yalnızca önyükleme görüntüsünün aynı sürümüyle (aynı önyükleme sınıf yolu) çalışır.

  • Sistem işlemleri tarafından kullanılan yöntemlere/sınıflara seçim önceliği verin. Bu yöntemler/sınıflar, diğer uygulamalar tarafından sıklıkla kullanılmayan ancak optimize edilmesi yine de kritik olan kodları kullanabilir.

  • Tek bir cihaz çalıştırmasından elde edilen veri şekli, gerçek dünyadaki CUJ'leri çalıştıran test cihazlarıyla karşılaştırıldığında çok farklı görünüyor. Geniş bir test cihazı filonuz yoksa, önyükleme görüntüsü profili optimizasyonlarının üretimde iyi çalışacağına dair güveni artırmak için aynı cihazı birkaç CUJ çalıştırmak için kullanın (bu senaryo aşağıda açıklanmıştır).

Cihazları yapılandırma

Sistem özellikleri aracılığıyla önyükleme profili yapılandırmasını etkinleştirmek için aşağıdaki yöntemlerden birini kullanın.

  • Seçenek 1: Donanımları manuel olarak ayarlayın (yeniden başlatmaya kadar çalışır):

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
    
  • Seçenek 2: local.prop kullanın (dosya silinene kadar kalıcı etki). Böyle yaparak:

    1. İçeriği içeren bir local.prop dosyası oluşturun:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. Aşağıdaki komutları çalıştırın:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
      
  • Seçenek 3: Aşağıdaki sunucu tarafı özelliklerini ayarlamak için cihaz yapılandırmasını kullanın:

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

Önyükleme görüntüsü profilleri oluşturun

Tek bir cihazda test kullanarak temel bir önyükleme görüntüsü profili oluşturmak için aşağıdaki talimatları kullanın.

  1. Cihazı kurun.

    1. Cihazı, Cihazları yapılandırma bölümünde açıklandığı şekilde yapılandırın.

    2. (İsteğe bağlı) Yeni profil formatının diğer profilleri temizlemesi ve değiştirmesi zaman alır. Profil toplamayı hızlandırmak için cihazdaki tüm profilleri sıfırlayın.

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
      
    3. Cihazdaki CUJ'leri çalıştırın.

  2. Aşağıdaki komutu kullanarak profili yakalayın:

    adb shell cmd package snapshot-profile android
    
  3. Aşağıdaki komutu kullanarak profili çıkarın:

    adb pull /data/misc/profman/android.prof
    
  4. Aşağıdaki komutları kullanarak önyükleme sınıf yolu JAR dosyalarına gidin:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
    
  5. Aşağıdaki profman komutunu kullanarak önyükleme görüntüsü profilini oluşturun.

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
    
  6. Verileri kullanarak, mevcut seçim eşiği bayraklarını kullanarak profman komutunu değiştirin.

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    Tam listeyi görüntülemek için profman yardım sayfasına veya kaynak koduna bakın.