Temel Profiller Oluşturma

Temel profiller, Jetpack Compose performansını en üst düzeye çıkarmak için gereklidir. Önemli kullanıcı yolculuklarınızı önceden derlemek, Compose kullanıcı arayüzünüzün sorunsuz şekilde oluşturulmasını sağlar.

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

Yeni bir temel profil 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.

Temel profil oluşturduktan sonra, hız iyileştirmelerini ölçmek için fiziksel bir cihaz kullanarak profili karşılaştırın.

AGP 8.2 veya sonraki bir sürümle yeni bir temel profil 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, Baseline Profilleri oluşturmak ve karşılaştırmak için yeni bir modül oluşturma işlemini otomatikleştirir. Şablonu çalıştırmak, tipik derleme yapılandırmasının, temel profil oluşturmanın ve doğrulama kodunun büyük bir kısmını oluşturur. Şablon, uygulama başlatmayı ölçmek için temel profiller oluşturup karşılaştırma testi yapacak kod oluşturur.

Baseline Profile modülünü ayarlama

Temel 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 Baseline Profile Generator şablonunu seçip yapılandırın:
    Şekil 1. Temel Profil Oluşturucu modül şablonu.
    Şablondaki alanlar şunlardır:
    • Hedef uygulama: Temel Profil'in oluşturulduğu uygulama. Projenizde yalnızca tek bir uygulama modülü varsa bu listede yalnızca bir öğe bulunur.
    • Modül adı: Oluşturulan temel profil modülünün adıdır.
    • Paket adı: Temel Profil modülü için istediğiniz paket adı.
    • Dil: Oluşturulan kodun Kotlin veya Java olmasını isteyip istemediğiniz.
    • Derleme yapılandırma dili: Derleme yapılandırma komut dosyalarınız için Kotlin Script (KTS) veya Groovy'yi kullanmak isteyip istemediğiniz.
    • Gradle tarafından yönetilen cihaz kullanma: Uygulamanızı test etmek için Gradle tarafından yönetilen cihazlar kullanıp kullanmadığınız.
  3. Bitir'i tıkladığınızda yeni modül oluşturulur. Kaynak kontrolü kullanıyorsanız yeni oluşturulan modül dosyalarını kaynak kontrolüne eklemeniz istenebilir.

Temel profil oluşturucuyu tanımlama

Yeni oluşturulan modül, hem temel profili oluşturmak hem de karşılaştırmak için testler içerir ve yalnızca temel uygulama başlatma test edilir. Bu iş akışlarını, kritik kullanıcı yolculuklarını ve gelişmiş başlangıç iş akışlarını içerecek şekilde genişletmenizi öneririz. Uygulama başlatmayla ilgili tüm testlerin rule bloğunda includeInStartupProfile değerinin true olarak ayarlandığından emin olun. Bununla birlikte, optimum performans için uygulama başlatmayla ilgili olmayan testlerin Başlangıç Profiline dahil edilmediğinden emin olun. Uygulama başlatma optimizasyonları, Temel Profil'in Başlatma Profili adlı özel bir bölümünü tanımlamak için kullanılır.

Bu CUJ'leri oluşturulan temel profil ve karşılaştırma kodu dışında soyutlayarak her ikisi için de kullanılabilir hale getirirseniz sürdürülebilirliği koruyabilirsiniz. Bu, CUJ'lerinizdeki değişikliklerin tutarlı bir şekilde kullanıldığı anlamına gelir.

Temel profil oluşturma ve yükleme

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

Temel profil oluşturma çalıştırma yapılandırması.
Şekil 2. Bu yapılandırmanın çalıştırılması, Baseline Profile'ı oluşturur.

Generate Baseline Profile (Temel Profil Oluştur) çalıştırma yapılandırması tamamlandığında, oluşturulan temel profili, profili oluşturulan modüldeki src/variant/generated/baselineProfiles/baseline-prof.txt dosyasına kopyalar. Varyant seçenekleri, yayınlanan derleme türü veya yayınlanan derleme türünü içeren bir derleme değişkenidir.

Oluşturulan temel profil aslen build/outputs içinde oluşturulur. Tam yol, profili oluşturulan uygulamanın varyantına veya sürümüne ve profili oluşturma için Gradle tarafından yönetilen bir cihaz mı yoksa bağlı bir cihaz mı kullandığınıza göre belirlenir. Şablon tarafından oluşturulan kod ve derleme yapılandırmaları tarafından kullanılan adları kullanırsanız temel profil, build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt dosyasında oluşturulur. Oluşturulan temel profilin bu sürümünü hedef modüllere manuel olarak kopyalamadığınız sürece (önerilmez) doğrudan kullanmanız gerekmeyebilir.

AGP 8.1 ile yeni bir Baseline Profile oluşturma

Baseline Profile modülü şablonunu kullanamıyorsanız yeni bir Baseline Profile oluşturmak için Macrobenchmark modülü şablonunu ve Baseline Profile Gradle eklentisini kullanın. Bu araçları Android Studio Giraffe ve AGP 8.1'den itibaren 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ızla etkileşimleri uygulama başlatma işleminin ötesine taşıyabilir. Bu sayede uygulamanızın çalışma zamanı performansını (ör. listelerde gezinme, animasyon çalıştırma ve Activity içinde gezinme) optimize edebilirsiniz. @BaselineProfileRule kullanarak kritik kullanıcı yolculuklarını iyileştiren testlerle ilgili diğer örneklere göz atın.

  3. Baseline Profile Gradle eklentisini ekleyin (libs.plugins.androidx.baselineprofile). Bu eklenti, Baseline Profilleri oluşturmayı ve gelecekte bunları korumayı 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, root erişimi olan fiziksel bir cihazda, emülatörde veya Gradle tarafından yönetilen cihazda enstrümanlı test olarak çalıştırın. Gradle tarafından yönetilen bir cihaz kullanıyorsanız aosp değerini systemImageSource olarak ayarlayın. Çünkü Baseline Profile oluşturucu için kök erişimi gerekir.

    Üretim görevinin sonunda, Baseline Profili app/src//generated/baselineProfiles konumuna kopyalanır.

Şablonsuz yeni bir Baseline Profile oluşturma

Android Studio Baseline Profile modül şablonunu (tercih edilen) veya Macrobenchmark şablonunu kullanarak bir Baseline Profile oluşturmanızı öneririz. Ancak Baseline Profile Gradle eklentisini tek başına da kullanabilirsiniz. Baseline Profile Gradle eklentisi hakkında daha fazla bilgi edinmek için Baseline Profile oluşturmayı yapılandırma başlıklı makaleyi inceleyin.

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

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

    1. androidx.baselineprofile eklentisini uygulayın.
    2. targetProjectPath işaretinin :app modülünü gösterdiğinden emin olun.
    3. İsteğe bağlı olarak Gradle tarafından yönetilen bir cihaz (GMD) ekleyin. Aşağıdaki örnekte pixel6Api31. Belirtilmezse eklenti, bağlı bir cihaz (emüle edilmiş veya fiziksel) 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
    }

    Modern

    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 Baseline Profile testi oluşturun. Aşağıdaki örnek, uygulama başlatma için temel profil oluşturan bir testtir.

        class BaselineProfileGenerator {
        @get:Rule
        val baselineProfileRule = BaselineProfileRule()
    
        @Test
        fun startup() = baselineProfileRule.collect(
            packageName = "com.example.app",
            profileBlock = {
                uiAutomator { startApp(PACKAGE_NAME) }
            }
        )
    }
    
  4. Uygulama modülündeki build.gradle.kts dosyasını güncelleyin (ör. :app).

    1. Eklentiyi uygulayın androidx.baselineprofile.
    2. baselineProfile bağımlılığını :baseline-profile modülüne 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"))
    }

    Modern

    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. Üretim görevinin sonunda, Baseline Profili app/src/variant/generated/baselineProfiles konumuna kopyalanır.

Temel Profili Karşılaştırma

Temel profilinizi karşılaştırmak için StartupBenchmarks.kt dosyasında tanımlanan karşılaştırmaları yürüten oluk işleminden yeni bir Android enstrümanlı 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ığı ile karşılaştırma temel profilleri başlıklı makaleleri inceleyin.

Şekil 3. Android testlerini, gutter işleminden çalıştırma.

Bu kodu Android Studio'da çalıştırdığınızda derleme çıktısı, Baseline Profile'ın sağladığı hız iyileştirmeleriyle ilgili ayrıntıları 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:

TTFD, reportFullyDrawn yöntemi ComponentActivity çağrıldığında bildirilir. reportFullyDrawn hiçbir zaman çağrılmazsa bunun yerine TTID raporlanır. Asenkron yükleme tamamlanana kadar reportFullyDrawn işlevinin çağrılmasını geciktirmeniz gerekebilir. Örneğin, kullanıcı arayüzünde dinamik bir tembel liste varsa liste, ilk kez çizildikten sonra tamamlanan bir arka plan göreviyle doldurulabilir. Bu nedenle, liste doldurulduktan sonra kullanıcı arayüzü tamamen çizilmiş olarak işaretlenir. Bu gibi durumlarda, kullanıcı arayüzü tamamen çizilmiş duruma ulaştıktan sonra çalışan kod, Temel Profil'e dahil edilmez.

Liste popülasyonunu temel profilinize dahil etmek için getFullyDrawnReporter kullanarak FullyDrawnReporter değerini alın ve uygulama kodunuzda buna bir muhabir ekleyin. Arka plan görevi, listeyi doldurmayı bitirdikten sonra muhabiri serbest bırakın. FullyDrawnReporter, tüm raporlayıcılar serbest bırakılana kadar reportFullyDrawn yöntemini çağırmaz. Bunu yaptığınızda, temel profil listeyi doldurmak için gereken kod yollarını içerir. Bu değişiklik, uygulamanın kullanıcı açısından davranışını değiştirmez ancak Temel Profil'in gerekli tüm kod yollarını içermesine olanak tanır.

Tamamen çizilmiş durumu belirtmek için aşağıdaki Compose API'lerini kullanın:

  • ReportDrawn, composable'ınızın hemen etkileşime hazır olduğunu gösterir.
  • ReportDrawnWhen, composable'ınızın etkileşime hazır olduğunu belirtmek için list.count > 0 gibi bir yüklem alır.
  • ReportDrawnAfter, tamamlandığında composable'ınızın etkileşime hazır olduğunu belirten bir askıya alma yöntemi kullanır.