Temel Profiller Oluşturma

Jetpack Macrobenchmark kitaplığını ve BaselineProfileRule kullanarak her uygulama sürümü için otomatik olarak profiller oluşturun. Temel profiller kullanılırken derleme iyileştirmeleri sunan com.android.tools.build:gradle:8.0.0 veya daha yeni bir sürümü kullanmanızı öneririz.

Yeni bir referans profili oluşturmak için genel adımlar şunlardır:

  1. Temel Profil modülünü ayarlayın.
  2. Temel profiller oluşturmaya yardımcı olan JUnit testini tanımlayın.
  3. Optimize etmek istediğiniz kritik kullanıcı yolculuklarını (CUJ'ler) ekleyin.
  4. Temel profili oluşturun.

Referans profilini oluşturduktan sonra, hız iyileştirmelerini ölçmek için fiziksel bir cihaz kullanarak karşılaştırma yapın.

AGP 8.2 veya sonraki bir sürümle yeni bir referans profili oluşturma

Yeni bir temel profil oluşturmanın en kolay yolu, Android Studio Iguana ve Android Gradle Plugin (AGP) 8.2'den itibaren kullanılabilen temel profil modülü şablonunu kullanmaktır.

Android Studio Baseline Profile Generator modülü şablonu, temel profil oluşturmak ve karşılaştırmak için yeni bir modülün oluşturulmasını otomatikleştirir. Şablon çalıştırıldığında, tipik derleme yapılandırmasının, temel profil oluşturmanın ve doğrulama kodunun çoğu oluşturulur. Şablon, uygulamanın başlatılmasını ölçmek için referans profilleri oluşturmak ve karşılaştırmak üzere kod oluşturur.

Temel Profil modülünü ayarlama

Referans Profil modülü şablonunu çalıştırmak için aşağıdaki adımları uygulayın:

  1. Dosya > Yeni > Yeni Modül'ü seçin.
  2. Şablonlar panelinde Referans Profil Oluşturucu şablonunu seçin ve yapılandırın:
    Şekil 1. Temel Profil Oluşturucu modülü şablonu.

    Şablondaki alanlar şunlardır:

    • Hedef uygulama: Temel profilin hangi uygulama için oluşturulduğunu tanımlar. Projenizde yalnızca tek bir uygulama modülü varsa bu listede yalnızca bir öğe bulunur.
    • Modül adı: Oluşturulan referans profil modülü için istediğiniz ad.
    • Paket adı: Temel Profil modülü için istediğiniz paket adı.
    • Dil: Oluşturulan kodun Kotlin mi yoksa Java mı olmasını istediğinizi belirtir.
    • Derleme yapılandırma dili: Derleme yapılandırma komut dosyalarınız için Kotlin Script (KTS) mi yoksa Groovy mu kullanmak istediğinizi belirtir.
    • Gradle tarafından yönetilen cihaz kullanın: Uygulamanızı test etmek için Gradle tarafından yönetilen cihazlar kullanıp kullanmadığınızı belirtir.
  3. Sonlandır'ı tıklayın. Yeni modül oluşturulur. Kaynak denetimi kullanıyorsanız yeni oluşturulan modül dosyalarını kaynak denetimine eklemeniz istenebilir.

Temel profil oluşturucuyu tanımlama

Yeni oluşturulan modül, hem referans profilini oluşturmak hem de karşılaştırmak hem de yalnızca temel uygulama başlangıcını test etmek için testler içerir. Bu raporları CUJ'leri ve gelişmiş başlangıç iş akışlarını içerecek şekilde genişletmenizi öneririz. Uygulama başlatılmasıyla ilgili testlerin, includeInStartupProfile'un true olarak ayarlandığı bir rule bloğunda bulunduğundan emin olun. Buna karşılık, optimum performans için uygulama başlatılmasıyla ilgili olmayan testlerin bir Başlangıç Profili'ne dahil edilmediğinden emin olun. Uygulama başlatma optimizasyonları, referans profilin başlatma profili olarak adlandırılan özel bir bölümünü tanımlamak için kullanılır.

Bu CUJ'leri, oluşturulan referans profil ve karşılaştırma kodu dışında soyutlarsanız her ikisi için de kullanılabilirler. Bu, sürdürülebilirliğe yardımcı olur. Bu, CUJ'larınızda yapılan değişikliklerin tutarlı bir şekilde kullanıldığı anlamına gelir.

Temel çizgi profilini oluşturma ve yükleme

Temel Profil modülü şablonu, temel profili oluşturmak için yeni bir çalıştırma yapılandırması ekler. Ürün aromaları kullanıyorsanız Android Studio, her aroma için ayrı temel profiller oluşturabilmeniz amacıyla birden fazla çalıştırma yapılandırması oluşturur.

Taban Profil Oluştur çalıştırma yapılandırması.
Şekil 2. Bu yapılandırmayı çalıştırdığınızda referans profili oluşturulur.

Referans Profili Oluştur çalıştırma yapılandırması tamamlandığında, oluşturulan referans profili, profil oluşturulan modüldeki src/variant/generated/baselineProfiles/baseline-prof.txt dosyasına kopyalanır. Varyant seçenekleri, sürüm derleme türü veya sürüm derleme türünü içeren bir derleme varyantıdır.

Oluşturulan temel profil ilk olarak build/outputs'te oluşturulur. Tam yol, profil oluşturulan uygulamanın varyantına veya sürümüne ve profil oluşturmak için Gradle tarafından yönetilen bir cihaz mı yoksa bağlı bir cihaz mı kullandığınıza bağlıdır. Kod tarafından kullanılan adları ve şablon tarafından oluşturulan derleme yapılandırmalarını kullanırsanız referans profili build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt dosyasında oluşturulur. Oluşturulan referans profilinin bu sürümüyle doğrudan etkileşime geçmeniz gerekmez. Bunun için hedef modüllere manuel olarak kopyalamanız gerekir (önerilmez).

AGP 8.1 ile yeni bir temel profil oluşturma

Referans Profil modülü şablonunu kullanamıyorsanız yeni bir Referans Profil oluşturmak için Macrobenchmark modülü şablonunu ve Referans Profil Gradle eklentisini kullanın. Android Studio Giraffe ve AGP 8.1'den itibaren bu araçları kullanmanızı öneririz.

Macrobenchmark modülü şablonunu ve Baseline Profile Gradle eklentisini kullanarak yeni bir temel profil oluşturmak için aşağıdaki adımları uygulayın:

  1. Gradle projenizde bir Macrobenchmark modülü oluşturun.
  2. BaselineProfileGenerator adlı yeni bir sınıf tanımlayın:
    class BaselineProfileGenerator {
        @get:Rule
        val baselineProfileRule = BaselineProfileRule()
    
        @Test
        fun startup() = baselineProfileRule.collect(
            packageName = "com.example.app",
            profileBlock = {
                startActivityAndWait()
            }
        )
    }

    Oluşturucu, uygulamanızın başlatılmasının ötesinde uygulamanızla etkileşimleri içerebilir. Bu sayede uygulamanızın çalışma zamanı performansını optimize edebilirsiniz. Örneğin, listeleri kaydırma, animasyon çalıştırma ve bir Activity içinde gezinme gibi işlemleri optimize edebilirsiniz. Kritik kullanıcı yolculuklarını iyileştirmek için @BaselineProfileRule kullanan testlerin diğer örneklerini inceleyin.

  3. Temel Profil Gradle eklentisini (libs.plugins.androidx.baselineprofile) ekleyin. Bu eklenti, temel profil oluşturmayı ve gelecekte bu profilleri yönetmeyi kolaylaştırır.

  4. Temel profil oluşturmak için terminalde :app:generateBaselineProfile veya :app:generateVariantBaselineProfile Gradle görevlerini çalıştırın.

    Oluşturucuyu, rootlanmış fiziksel bir cihazda, emülatörde veya Gradle tarafından yönetilen cihazda enstrümante test olarak çalıştırın. Gradle Managed Device kullanıyorsanız Temel Profil Oluşturucu için kök erişimine ihtiyacınız olduğundan aosp değerini systemImageSource olarak ayarlayın.

    Oluşturma görevinin sonunda, referans profil app/src/variant/generated/baselineProfiles alanına kopyalanır.

Şablon olmadan yeni bir temel profil oluşturma

Android Studio Referans Profil modülü şablonunu (tercih edilir) veya Makro Karşılaştırma şablonunu kullanarak bir Referans Profil oluşturmanızı öneririz. Ancak Referans Profil Gradle eklentisini tek başına da kullanabilirsiniz. Temel Profil Gradle eklentisi hakkında daha fazla bilgi edinmek için Temel Profil oluşturma işlemini yapılandırma başlıklı makaleyi inceleyin.

Temel Profil Gradle eklentisini doğrudan kullanarak Temel Profil oluşturmak için aşağıdaki adımları uygulayın:

  1. Yeni bir com.android.test modülü oluşturun (ör. :baseline-profile).
  2. :baseline-profile için build.gradle.kts dosyasını yapılandırın:

    1. androidx.baselineprofile eklentisini uygulayın.
    2. targetProjectPath değerinin :app modülüne işaret ettiğinden emin olun.
    3. İsteğe bağlı olarak Gradle tarafından yönetilen cihaz (GMD) ekleyin. Aşağıdaki örnekte pixel6Api31 olarak gösterilmiştir. Belirtilmemişse eklenti, taklit edilmiş veya fiziksel bir bağlı cihaz kullanır.
    4. Aşağıdaki örnekte gösterildiği gibi istediğiniz yapılandırmayı uygulayın.

    Kotlin

    plugins {
        id("com.android.test")
        id("androidx.baselineprofile")
    }
    
    android {
        defaultConfig {
            ...
        }
    
        // Point to the app module, the module that you're generating the Baseline Profile for.
        targetProjectPath = ":app"
        // Configure a GMD (optional).
        testOptions.managedDevices.devices {
            pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) {
                device = "Pixel 6"
                apiLevel = 31
                systemImageSource = "aosp"
            }
        }
    }
    
    dependencies { ... }
    
    // Baseline Profile Gradle plugin configuration. Everything is optional. This
    // example uses the GMD added earlier and disables connected devices.
    baselineProfile {
        // Specifies the GMDs to run the tests on. The default is none.
        managedDevices += "pixel6Api31"
        // Enables using connected devices to generate profiles. The default is
        // `true`. When using connected devices, they must be rooted or API 33 and
        // higher.
        useConnectedDevices = false
    }

    Groovy

    plugins {
        id 'com.android.test'
        id 'androidx.baselineprofile'
    }
    
    android {
        defaultConfig {
            ...
        }
    
        // Point to the app module, the module that you're generating the Baseline Profile for.
        targetProjectPath ':app'
        // Configure a GMD (optional).
        testOptions.managedDevices.devices {
            pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) {
                device 'Pixel 6'
                apiLevel 31
                systemImageSource 'aosp'
            }
        }
    }
    
    dependencies { ... }
    
    // Baseline Profile Gradle plugin configuration. Everything is optional. This
    // example uses the GMD added earlier and disables connected devices.
    baselineProfile {
        // Specifies the GMDs to run the tests on. The default is none.
        managedDevices ['pixel6Api31']
        // Enables using connected devices to generate profiles. The default is
        // `true`. When using connected devices, they must be rooted or API 33 and
        // higher.
        useConnectedDevices false
    }
  3. :baseline-profile test modülünde bir referans profil testi oluşturun. Aşağıdaki örnek, uygulamayı başlatıp boşta bekleyen bir testtir.

    Kotlin

    class BaselineProfileGenerator {
    
        @get:Rule
        val baselineRule = BaselineProfileRule()
    
        @Test
        fun startupBaselineProfile() {
            baselineRule.collect("com.myapp") {
                startActivityAndWait()
            }
        }
    }

    Java

    public class BaselineProfileGenerator {
    
        @Rule
        Public BaselineProfileRule baselineRule = new BaselineProfileRule();
    
        @Test
        Public void startupBaselineProfile() {
            baselineRule.collect(
                "com.myapp",
                (scope -> {
                    scope.startActivityAndWait();
                    Return Unit.INSTANCE;
                })
            )
        }
    }
  4. Uygulama modülündeki build.gradle.kts dosyasını (ör. :app) güncelleyin.

    1. androidx.baselineprofile eklentisini uygulayın.
    2. :baseline-profile modülüne baselineProfile bağımlılık ekleyin.

    Kotlin

    plugins {
        id("com.android.application")
        id("androidx.baselineprofile")
    }
    
    android {
        // There are no changes to the `android` block.
        ...
    }
    
    dependencies {
        ...
        // Add a `baselineProfile` dependency on the `:baseline-profile` module.
        baselineProfile(project(":baseline-profile"))
    }

    Groovy

    plugins {
        id 'com.android.application'
        id 'androidx.baselineprofile'
    }
    
    android {
        // No changes to the `android` block.
        ...
    }
    
    dependencies {
        ...
        // Add a `baselineProfile` dependency on the `:baseline-profile` module.
        baselineProfile ':baseline-profile'
    }
  5. :app:generateBaselineProfile veya :app:generateVariantBaselineProfile Gradle görevlerini çalıştırarak profili oluşturun.

  6. Oluşturma görevinin sonunda, referans profil app/src/variant/generated/baselineProfiles alanına kopyalanır.

AGP 7.3-7.4 ile yeni bir referans profili oluşturma

AGP 7.3-7.4 ile temel profil oluşturmak mümkündür ancak temel profil Gradle eklentisini ve en son özelliklerini kullanabilmek için en azından AGP 8.1'e yükseltmenizi önemle tavsiye ederiz.

AGP 7.3-7.4 ile temel profiller oluşturmanız gerekiyorsa aşağıdaki istisnalar dışında AGP 8.1 için adımlar ile aynı adımları uygulayın:

Oluşturulan kuralları manuel olarak uygulama

Temel Profil Oluşturucu, cihazda Kullanıcı Tarafından Okunabilir Biçim (HRF) metin dosyası oluşturur ve bu dosyayı ana makinenize kopyalar. Oluşturulan profili kodunuza uygulamak için aşağıdaki adımları uygulayın:

  1. HRF dosyasını, profili oluşturduğunuz modülün derleme klasöründe bulun: [module]/build/outputs/managed_device_android_test_additional_output/[device].

    Profiller, [class name]-[test method name]-baseline-prof.txt adlandırma kalıbına uyar. Bu kalıp şu şekildedir: BaselineProfileGenerator-startup-baseline-prof.txt.

  2. Oluşturulan profili src/main/ klasörüne kopyalayın ve dosyayı baseline-prof.txt olarak yeniden adlandırın.

  3. Cloud Profilleri'nin kullanılamadığı durumlarda yerel Temel Profil derlemesini etkinleştirmek için uygulamanızın build.gradle.kts dosyasına ProfileInstaller kitaplığına bağımlılık ekleyin. Temel profili yerel olarak yüklemenin tek yolu budur.

    dependencies {
         implementation("androidx.profileinstaller:profileinstaller:1.4.1")
    }
    
  4. Uygulanan HRF kuralları ikili biçimde derlenip APK'ya veya AAB'ye eklenirken uygulamanızın üretim sürümünü oluşturun. Ardından uygulamanızı her zamanki gibi dağıtın.

Referans profilini karşılaştırma

Referans profilinizi karşılaştırmak için StartupBenchmarks.kt veya StartupBencharks.java dosyasında tanımlanan karşılaştırmaları yürüten kenar boşluğu işleminden yeni bir Android Enstrümante Test Çalıştırma yapılandırması oluşturun. Karşılaştırma testi hakkında daha fazla bilgi edinmek için Macrobenchmark sınıfı oluşturma ve Macrobenchmark kitaplığıyla ölçümü otomatikleştirme başlıklı makalelere bakın.

Şekil 3. Android testlerini kenar boşluğu işleminden çalıştırın.

Bunu Android Studio'da çalıştırdığınızda, derleme çıkışı, Temel Profil'in sağladığı hız iyileştirmelerinin ayrıntılarını içerir:

StartupBenchmarks_startupCompilationBaselineProfiles
timeToInitialDisplayMs   min 161.8,   median 178.9,   max 194.6
StartupBenchmarks_startupCompilationNone
timeToInitialDisplayMs   min 184.7,   median 196.9,   max 202.9

Gerekli tüm kod yollarını yakalama

Uygulama başlatma sürelerini ölçmek için kullanılan iki temel metrik şunlardır:

İlk gösterime kalan süre (TTID)
Uygulama kullanıcı arayüzünün ilk karesinin görüntülenmesi için geçen süre.
Tam gösterime kalan süre (TTFD)
TTID artı ilk kare gösterildikten sonra eşzamansız olarak yüklenen içeriğin görüntülenmesi için geçen süre.

TTFD, ComponentActivity sınıfının reportFullyDrawn() yöntemi çağrıldıktan sonra raporlanır. reportFullyDrawn() hiç çağrılmazsa bunun yerine TTID raporlanır. reportFullyDrawn() işlevinin çağrılmasını, asenkron yükleme tamamlanana kadar geciktirmeniz gerekebilir. Örneğin, kullanıcı arayüzü RecyclerView veya tembel liste gibi dinamik bir liste içeriyorsa liste, ilk çizildikten ve dolayısıyla kullanıcı arayüzü tamamen çizilmiş olarak işaretlendikten sonra tamamlanan bir arka plan görevi tarafından doldurulabilir. Bu tür durumlarda, kullanıcı arayüzü tamamen çizilmiş duruma ulaştıktan sonra çalışan kod, referans profiline dahil edilmez.

Liste popülasyonunu temel profilinizin bir parçası olarak dahil etmek için getFullyDrawnReporter() kullanarak FullyDrawnReporter'ü alın ve uygulama kodunuza bir raporlayıcı ekleyin. Arka plan görevi listeyi doldurmayı tamamladıktan sonra bildirimde bulunan kullanıcıyı serbest bırakın. FullyDrawnReporter, tüm raporlayanlar serbest bırakılana kadar reportFullyDrawn() yöntemini çağırmaz. Bu sayede, referans profili listeyi doldurmak için gereken kod yollarını içerir. Bu işlem, uygulamanın kullanıcıya yönelik davranışını değiştirmez ancak temel profilin gerekli tüm kod yollarını içermesine olanak tanır.

Uygulamanız Jetpack Compose kullanıyorsa tamamen çizilmiş durumu belirtmek için aşağıdaki API'leri kullanın:

  • ReportDrawn, bileşiminizin hemen etkileşime hazır olduğunu gösterir.
  • ReportDrawnWhen, bileşeninizin etkileşime hazır olduğunu belirtmek için list.count > 0 gibi bir önerme alır.
  • ReportDrawnAfter, tamamlandığında bileşeninizin etkileşime hazır olduğunu belirten bir askıya alma yöntemi alır.