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

Android 11 veya sonraki sürümlerde, sistem sunucusu ve önyükleme sınıf yolu gibi çeşitli sistem düzeyindeki bileşenlerin koduyla ilgili bilgileri kapsayan başlatma görüntüsü profilleri oluşturulabilir. Android Çalışma Zamanı (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, başlatma görüntüsü profilleri, yürütme performansını ve bellek tüketimini çift haneli yüzdelerle etkileyebilir.

Önyükleme profili bilgilerini alma

Başlatma görüntüsü profilleri, kritik kullanıcı yolculukları (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 uygulama profilinde (ör. /data/misc/profiles/cur/0/com.android.chrome/primary.prof) kaydeder. Bu bilgiler, önyükleme sınıf yolu Dalvik EXecutable (DEX) dosyası tarafından dizine eklenir (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çimine 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 bağımsız 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 bunu yapabilirsiniz) işleme ve yöntem/sınıf seçimi için temel olarak kullanabilirsiniz.

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

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

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

Başlatma 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ıflar hakkında bilgiler yer alır. Başlatma görüntüsü profili oluşturma etkinleştirildiğinde ART, önyükleme sınıf yolu ve sistem sunucusu JAR dosyalarını da profile dahil eder ve her DEX dosyasını, onu kullanan paketin adıyla ek açıklamalı hale getirir.

Örneğin, aşağıdaki komutla ham önyükleme görüntüsü profilini dökü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şlemde de DEX dizini 520 olan yöntem kullanılı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, filtre yöntemlerine/sınıflarına kullanım durumuna göre öncelik verin. Sistem düzeyindeki süreçlere (ör. sistem sunucusu veya systemui) ya da en çok tercih edilen olmayabilecek ancak yine de önemli olan yöntemlere (ör. kamera uygulaması tarafından kullanılan yöntemler) öncelik verin.

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.

  • Başlatma görüntüsü profili oluşturma yapılandırmasını birkaç test cihazına dağıtın ve nihai başlatma görüntüsü profilini oluşturmadan önce sonuçları toplayın. profman aracı, birden fazla başlatma görüntüsü profilinin toplanmasını ve seçilmesini destekler ancak yalnızca aynı başlatma 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ık 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 başlatma görüntüsü profili optimizasyonlarının canlı sürümde iyi çalışacağından emin olmak için aynı cihazı kullanarak birkaç CUJ ç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 donanımlarını 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 kullanın (dosya silinene kadar kalıcı efekt). 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
    

Başlatma görüntüsü profilleri oluşturma

Tek bir cihazda test yaparak temel bir başlatma 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 başlatma 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, kullanılabilir seçim eşiği işaretlerini kullanarak profman komutunu 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.