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

Android 11 veya sonraki sürümlerde, sistem sunucusu ve başlatma sınıf yolu gibi çeşitli sistem düzeyindeki bileşenlerin koduyla ilgili bilgileri kapsayan başlatma resmi profilleri oluşturulabilir. Android Runtime (ART), bu bilgileri sistem genelinde optimizasyonlar yapmak için kullanır. Bu optimizasyonlardan bazıları Android'in performansı açısından kritik öneme sahiptir ve yerel olmayan tüm kodların (sistem veya uygulama düzeyinde) yürütülmesini etkiler. 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 alma

Önyükleme görüntüsü profilleri, kritik kullanıcı işlemleri (CUJ'ler) sırasında yürütülen uygulamaların profillerinden elde edilir. 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, ardından bu bilgileri önyükleme sınıf yolu Dalvik EXecutable (DEX) dosyası tarafından dizine eklendiği uygulama profilinde (örneğin, /data/misc/profiles/cur/0/com.android.chrome/primary.prof) kaydeder (bkz. ART profil biçimi).

CUJ'ler sırasında kaydedilen uygulama profillerini inceleyerek önyükleme sınıf yolunun hangi bölümünün en çok kullanıldığını ve optimize etmek için en önemli olduğunu belirleyin (örnek için ART profil biçimi bölümüne bakın). Tüm yöntemleri veya sınıfları dahil etmek performansı olumsuz 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 bir parçası olmamalıdır. Her cihaz, CUJ seçimine ve testle üretilen veri miktarına göre yöntem/sınıf seçimini yapılandırmalıdır.

Cihazdaki tüm uygulama profillerinden başlatma sınıf yolu bilgilerini toplamak için adb shell cmd package snapshot-profile android komutunu çalıştırın. Toplanan bilgileri, tek tek profilleri manuel olarak toplamanıza gerek kalmadan (isterseniz yapabilirsiniz) işleme ve yöntem/sınıf seçimi için temel olarak kullanabilirsiniz.

Başlatma görüntüsü profili

1.şekil Başlatma görüntüsü profillerini alma süreci

Başlatma görüntüsü profil verileri

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

  • Önyükleme sınıf yolu için profil (frameworks/base/config/boot-image-profile.txt. Önyükleme sınıf yolundaki hangi yöntemlerin optimize edileceğini ve hangi sınıfın önyükleme .art görüntüsüne dahil edileceğini belirler.

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

  • Sistem sunucusu bileşenleri için profil (frameworks/base/services/art-profile). Sistem sunucusundaki hangi yöntemlerin optimize edileceğini/derleneceğini, hangi sınıfın önyükleme .art görüntüsüne dahil edileceğini ve ilgili DEX dosyalarının nasıl düzenleneceğini belirler.

ART profili biçimi

ART profili, yüklenen her DEX dosyasından bilgi alır. Bu bilgiler arasında, optimizasyona değer yöntemler ve başlatma sırasında kullanılan sınıflarla ilgili bilgiler yer alır. Önyükleme görüntüsü profili oluşturma etkinleştirildiğinde ART, profilde önyükleme sınıf yolu ve sistem sunucusu JAR dosyalarını da içerir ve her DEX dosyasını, onu kullanan paketin adıyla notlandırır.

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

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

Bu, şuna benzer bir çıkış ü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ıyor. Her girişte, core-oj.jar tarihinden itibaren kullanılan iki paket listelenir.

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

Veri işleme sırasında, kullanım durumuna göre filtre yöntemleri/sınıfları, sistem düzeyindeki süreçlere (ör. sistem sunucusu veya systemui) ya da yaygın olarak kullanılmayabilecek ancak yine de önemli olan yöntemlere (ör. kamera uygulaması tarafından kullanılan yöntemler) öncelik vererek filtreleyin.

Profil biçimi, her yöntemi dahili olarak birden fazla işaretle (başlangıç, başlangıç sonrası, sıcaklık, abi) açıklama ekler. Bu, yalnızca döküm biçiminde gösterilenden daha fazladır. Tüm sinyallerden yararlanmak için mevcut komut dosyalarını değiştirin.

Öneriler

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

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

  • Sistem süreçleri 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 yine de optimizasyon için kritik olan kodlar kullanabilir.

  • Tek bir cihaz çalıştırmasından elde edilen veri şekli, gerçek dünyadaki CUJ'leri yürüten test cihazlarına kıyasla çok farklı görünür. Çok sayıda test cihazınız yoksa önyükleme görüntüsü profili optimizasyonlarının üretimde iyi çalışacağından emin olmak için aynı cihazı kullanarak çeşitli CUJ'ler çalıştırın (bu senaryo aşağıda açıklanmıştır).

Cihazları yapılandırma

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

  • 1. seçenek: Sahne öğelerini manuel olarak ayarlama (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
  • 2. seçenek: local.prop (dosya silinene kadar kalıcı efekt) kullanın. Bunu yapmak için:

    1. Aşağıdaki içeriğe sahip 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
  • 3. seçenek: Aşağıdaki sunucu tarafı özelliklerini ayarlamak için cihaz yapılandırmasını kullanın:

    adb shell device_config put runtime_native_boot profilebootclasspath true
    adb shell device_config put runtime_native_boot profilesystemserver true
    

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

Tek bir cihazda test yaparak 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 biçiminin diğer profilleri temizleyip değiştirmesi zaman alır. Profil toplama işlemini 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. Cihazda 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 profman komutunu, kullanılabilir seçim eşiği işaretlerini kullanarak ayarlayın.

    • --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.