Temel Profiller Oluşturma

Jetpack Macrobenchmark kitaplığını ve BaselineProfileRule kullanarak her uygulama sürümü için otomatik olarak profiller oluşturun. Temel profilleri kullanı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 temel profil oluşturmak için genel adımlar şunlardır:

  1. Baseline Profile 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 daha yeni bir sürümle yeni bir Baseline Profile oluşturun

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 çoğunu oluşturur. Şablon, uygulama başlatma süresini ölçmek için Baseline Profilleri oluşturup karşılaştırmaya yönelik 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 (Temel Profil Oluşturucu) şablonunu seçip yapılandırın:
    Şekil 1. Temel Profil Oluşturma Aracı modül şablonu.

    Şablondaki alanlar şunlardır:

    • Hedef uygulama: Temel Profil'in hangi uygulama için oluşturulduğunu tanımlar. Projenizde yalnızca tek bir uygulama modülü olduğunda 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 ve yalnızca temel uygulama başlatmayı test etmek için testler içerir. Bu işlevleri, CUJ'leri 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. Bunun aksine, en iyi performans için uygulama başlatmayla ilgili olmayan testlerin Başlangıç Profiline dahil edilmediğinden emin olun. Uygulama başlatma optimizasyonları, Başlangıç Profili adı verilen bir Temel Profil'in ö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 Profili 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.

Generate Baseline Profile (Temel Profil Oluştur) çalıştırma yapılandırması.
Şekil 2. Bu yapılandırmayı çalıştırmak, temel profil 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, 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 aslen build/outputs konumunda 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ında 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. Hedef modüllere manuel olarak kopyalamadığınız sürece (önerilmez) oluşturulan temel profilin bu sürümüyle doğrudan etkileşimde bulunmanız gerekmez.

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 makro karşılaştırma testi 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ın başlatılmasının ötesinde uygulamanızla etkileşimler içerebilir. Bu sayede uygulamanızın çalışma zamanı performansını (ör. listelerde gezinme, animasyon çalıştırma ve Activity içinde gezinme) optimize edebilirsiniz. Kritik kullanıcı yolculuklarını iyileştirmek için @BaselineProfileRule kullanılan diğer test örneklerine 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.

    Üreticiyi, rootlanmış bir fiziksel 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 Profile, app/src/variant/generated/baselineProfiles konumuna kopyalanır.

Şablonsuz yeni bir Baseline Profile oluşturma

Android Studio'nun 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şturma işleminizi yapılandırma başlıklı makaleyi inceleyin.

Baseline Profile Gradle eklentisini kullanarak doğrudan Baseline Profile 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 değerinin :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. Belirtilmemişse 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
    }

    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 Baseline Profile testi oluşturun. Aşağıdaki örnek, uygulamayı başlatan ve boşta kalmayı 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ı 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"))
    }

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

AGP 7.3-7.4 ile yeni bir Baseline Profili oluşturma

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

AGP 7.3-7.4 ile temel profiller oluşturmanız gerekiyorsa adımlar, AGP 8.1'deki adımlarla aynıdır. Ancak aşağıdaki istisnalar geçerlidir:

Oluşturulan kuralları manuel olarak uygulama

Temel Profil oluşturucu, cihazda İnsan Tarafından Okunabilir Biçim (HRF) metin dosyası oluşturur ve bunu 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ını kullanır. Bu kalıp şu şekilde görünür: BaselineProfileGenerator-startup-baseline-prof.txt.

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

  3. ProfileInstaller kitaplığına bağımlılık ekleyin. Bu kitaplık, uygulamanızın build.gradle.kts dosyasında yer alır. Bu sayede, Cloud Profilleri'nin kullanılamadığı durumlarda yerel Baseline Profile derlemesi etkinleştirilir. Bu, temel profili yerel olarak yan yüklemenin tek yoludur.

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

Temel profili karşılaştırma

Temel profilinizi karşılaştırmak için StartupBenchmarks.kt veya StartupBencharks.java 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ığıyla ölçümü otomatikleştirme başlıklı makalelere bakın.

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

Bu kodu Android Studio'da çalıştırdığınızda derleme çıktısı, temel profilin 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:

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

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 RecyclerView veya lazy list gibi dinamik bir liste varsa liste, ilk ç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 doldurma işlemini temel profilinize dahil etmek için FullyDrawnReporter değerini getFullyDrawnReporter() kullanarak alın ve uygulama kodunuza bir muhabir ekleyin. Arka plan görevi listeyi doldurmayı bitirdikten sonra muhabiri serbest bırakın. FullyDrawnReporter, tüm raporlar 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, uygulamanın kullanıcı açısından davranışını değiştirmez ancak Baseline Profile'ın gerekli tüm kod yollarını içermesini sağlar.

Uygulamanız Jetpack Compose kullanıyorsa tamamen çizilmiş durumu belirtmek için aşağıdaki API'leri 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 askıya alma yöntemi alır. Bu yöntem tamamlandığında composable'ınızın etkileşime hazır olduğunu belirtir.