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

Android 11 veya sonraki sürümler, sistem sunucusu ve önyükleme sınıf yolu gibi çeşitli sistem düzeyindeki bileşenlerin koduyla ilgili bilgileri kapsayan önyükleme resmi profilleri oluşturmayı destekler. Android Runtime (ART), sistem genelinde optimizasyonlar yapmak için bu bilgileri kullanır. Bu optimizasyonlardan bazıları Android'in performansı için kritiktir ve doğal olmayan tüm kodların (sistem veya uygulama düzeyinde) yürütülmesini etkiler. Bazı durumlarda, önyükleme resmi profilleri yürütme performansını ve bellek tüketimini iki haneli yüzdelerle etkileyebilir.

Önyükleme profili bilgilerini alma

Önyükleme resmi profilleri, kritik kullanıcı işlemleri (CUJ'ler) sırasında çalıştırılan 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, ardından bu bilgileri uygulama profiline (örneğin, /data/misc/profiles/cur/0/com.android.chrome/primary.prof) kaydeder. Burada, önyükleme sınıf yolu Dalvik yürütülebilir (DEX) dosyası tarafından dizine eklenir (ART profil biçimine bakın).

Önyükleme sınıf yolu klasörünün en çok kullanılan ve optimize edilmesi en önemli bölümünü belirlemek için CUJ'ler sırasında kaydedilen uygulama profillerini inceleyin (ö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 yolu içindeki bir yöntem tek bir uygulama tarafından kullanılıyorsa önyükleme profillerinin bir parçası olmamalıdır. Her cihaz, yöntem/sınıf seçimini CUJ seçimine ve test tarafından üretilen veri miktarına göre yapılandırmalıdır.

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

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

Şekil 1. Önyükleme resmi profillerini alma süreci

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

Önyükleme resmi profilleri aşağıdaki dosyaları ve verileri içerir.

  • Açılış sınıf yolu (frameworks/base/config/boot-image-profile.txt) profili. Açılış sınıf yolundaki hangi yöntemlerin optimize edileceğini, hangi sınıfın açılış .art resmine dahil edileceğini ve ilgili DEX dosyalarının nasıl düzenleneceğini belirler.

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

  • Sistem sunucusu bileşenlerinin profili (frameworks/base/services/art-profile). Sistem sunucusunda hangi yöntemlerin optimize edildiğini/derlendiğini, önyükleme .art resmine hangi sınıfın dahil edildiğini ve ilgili DEX dosyalarının nasıl düzenlendiğini belirler.

ART profili biçimi

ART profili, optimize etmeye değer yöntemler ve başlatma sırasında kullanılan sınıflar hakkındaki bilgiler de dahil olmak üzere, yüklenen her DEX dosyasından bilgi alır. Önyükleme resmi profil oluşturma etkinleştirildiğinde ART, önyükleme sınıf yolu ve sistem sunucusu JAR dosyalarını da profile ekler ve her DEX dosyasına, dosyayı kullanan paketin adını ekler.

Örneğin, aşağıdaki komutla ham önyükleme resmi profilini dökün:

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

Bu işlem sonucunda şuna benzer bir çıkış elde edilir:

=== 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şte, core-oj.jar kaynağından kullanılan iki paket listelenir.

  • Her iki işlem de DEX dizini 520 ile yöntemi kullanır ancak yalnızca systemui işlemi DEX dizini 521 ile yöntemi kullanır. Diğer profil bölümleri (ör. başlangıç sınıfları) için de aynı gerekçe geçerlidir.

Veri işleme sırasında, sistem düzeyindeki işlemlere (ö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 yöntemleri/sınıfları kullanıma göre filtreleyin.

Profil biçimi, her yöntemi dahili olarak birden fazla işaretle (başlangıç, başlangıç sonrası, sıcaklık, abi) ekler. Bu, yalnızca dökümü içeren biçimde 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 resmi profilleri oluşturma yapılandırmasını birkaç test cihazına dağıtın ve nihai önyükleme resmi profilini oluşturmadan önce sonuçları toplayın. profman aracı, birden fazla önyükleme resmi profilinin toplanmasını ve seçilmesini destekler ancak yalnızca önyükleme resminin 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 yine de optimize edilmesi kritik olan kodlar kullanabilir.

  • Tek bir cihazda çalıştırılan testin veri şekli, gerçek CUJ'leri çalıştıran test cihazlarına kıyasla çok farklı görünür. Çok sayıda test cihazınız yoksa önyükleme resmi profili optimizasyonlarının üretimde 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 önyükleme profili yapılandırmasını etkinleştirmek için aşağıdaki yöntemlerden birini kullanın.

  • 1. Seçenek: Sahne öğelerini manuel olarak ayarlayın (yeniden başlatma işlemine 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ı etki). Bunu yapmak için:

    1. Aşağıdaki iç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
  • 3. Seçenek: Aşağıdaki sunucu tarafı özellikleri 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 resmi profilleri oluşturma

Tek bir cihazda test kullanarak temel bir önyükleme resmi profili oluşturmak için aşağıdaki talimatları uygulayın.

  1. Cihazı kurun.

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

    2. (İsteğe bağlı) Yeni profil biçiminin diğer profilleri temizlemesi ve 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. CUJ'leri cihazda ç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 ayıklayı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 resmi 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 işaretlerini kullanarak profman komutunu değiştirin.

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

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