Temel Profiller Oluşturma

Jetpack Makrobenchmark kitaplığı ve BaselineProfileRule kullanarak her uygulama sürümü için otomatik olarak profil oluşturun. Temel Profilleri kullanırken derleme iyileştirmeleriyle birlikte gelen com.android.tools.build:gradle:8.0.0 veya üstünü kullanmanızı öneririz.

Yeni bir Temel Profil oluşturmak için genel adımlar aşağıda verilmiştir:

  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 Profili oluşturduktan sonra hız artışlarını ölçmek için fiziksel bir cihaz kullanarak profili karşılaştırın.

AGP 8.2 veya sonraki sürüme sahip yeni bir Temel Profil oluşturma

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

Android Studio Temel Profil Oluşturucu modül şablonu, Temel Profiller oluşturmak ve karşılaştırmak için yeni bir modülün oluşturulmasını otomatik hale getirir. Şablon çalıştırıldığında, tipik derleme yapılandırmasının, Temel Profil oluşturma ve doğrulama kodunun çoğu oluşturulur. Şablon, uygulamanın başlatılmasını ölçmek amacıyla Temel Profilleri oluşturmak ve karşılaştırmak için kod oluşturur.

Temel Profil modülünü ayarlama

Temel Profil modülü şablonunu çalıştırmak için şu adımları uygulayın:

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

    Şablondaki alanlar aşağıdaki gibidir:

    • Hedef uygulama: Temel Profilin hangi uygulama için oluşturulduğunu tanımlar. Projenizde tek bir uygulama modülü varsa bu listede yalnızca bir öğe bulunur.
    • Modül adı: Oluşturulmakta olan Temel 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ırması dili: Derleme yapılandırma komut dosyalarınız için Kotlin Komut Dosyası (KTS) veya Groovy kullanma arasında seçim yapın.
    • 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.
  3. Bitir'i tıkladığınızda 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, Temel Profil'i oluşturup bunu karşılaştırmak ve yalnızca temel uygulama başlatmayı test etmek için yapılan testler içerir. Bunları, CUJ'leri ve gelişmiş başlangıç iş akışlarını içerecek şekilde genişletmenizi öneririz. Uygulama başlatmayla ilgili tüm testlerin includeInStartupProfile öğesinin true değerine ayarlandığı bir rule bloğunda yer aldığından emin olun. Buna karşılık, en iyi 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şlangıç Profili adı verilen ö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 kodunun dışında soyutlayarak her ikisi için de kullanılabilmesini sağlamak sürdürülebilirliğe yardımcı olur. 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şitleri kullanıyorsanız Android Studio birden fazla çalıştırma yapılandırması oluşturur. Böylece her aroma için ayrı Temel Profiller oluşturabilirsiniz.

Temel Profil çalıştırma yapılandırması oluştur.
Şekil 2. Bu yapılandırma çalıştırıldığında Temel Profil oluşturulur.

Generate Baseline Profile (Temel Profil Oluştur) çalıştırma yapılandırması tamamlandığında, oluşturulan Temel Profili, profil oluşturulmakta olan 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 derleme varyantıdır.

Oluşturulan Temel Profil ilk olarak build/outputs dilinde oluşturulmuştur. Tam yol, profili oluşturulan uygulamanın varyantı veya çeşidine ve profil çıkarma için Gradle tarafından yönetilen bir cihaz mı yoksa bağlı bir cihaz mı kullandığınıza göre belirlenir. Kod tarafından kullanılan adları ve şablon tarafından oluşturulan derleme yapılandırmalarını kullanırsanız build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt dosyasında Temel Profil oluşturulur. Söz konusu sürümü hedef modüllere manuel olarak kopyalamadığınız sürece, oluşturulan Temel Profil'in bu sürümüyle büyük olasılıkla doğrudan etkileşimde bulunmanız gerekmez (önerilmez).

AGP 8.1 ile yeni bir Temel Profil oluşturma

Temel Profil modül şablonunu kullanamıyorsanız yeni bir Temel Profil oluşturmak için Makrobenchmark modül şablonunu ve Baseline Profile Gradle eklentisini kullanın. Bu araçları Android Studio Zürafa ve AGP 8.1'den başlayarak kullanmanızı öneririz.

Makrobenchmark modül şablonunu ve Baseline Profile Gradle eklentisini kullanarak yeni bir Temel Profil oluşturmak için şu adımları uygulayın:

  1. Gradle projenizde bir Makrobenchmark 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şturma aracı, uygulama başlatıldıktan sonra uygulamanızla gerçekleştirilen etkileşimleri içerebilir. Bu şekilde uygulamanızın çalışma zamanı performansını optimize edebilirsiniz (ör. kaydırma listeleri, animasyonlar çalıştırma ve Activity içinde gezinme). Kritik kullanıcı yolculuklarını iyileştirmek için @BaselineProfileRule kullanan testlere dair diğer örneklere göz atın.

  3. Baseline Profile Gradle eklentisini (libs.plugins.androidx.baselineprofile) ekleyin. Eklenti, Temel Profiller 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şturucu, rootlanmış bir fiziksel cihaz, emülatör veya Gradle Yönetilen Cihaz üzerinde donanımlı bir test olarak çalıştırın. Gradle Yönetilen Cihazı kullanıyorsanız Temel Profil oluşturma aracı için root erişimine ihtiyacınız olduğundan aosp değerini systemImageSource olarak ayarlayın.

    Oluşturma görevinin sonunda, Temel Profil app/src/variant/generated/baselineProfiles hedefine kopyalanır.

Şablon olmadan yeni bir Temel Profil oluşturma

Android Studio Temel Profil modül şablonunu (tercih edilen) veya Makrobenchmark şablonunu kullanarak bir Temel Profil oluşturmanızı öneririz. Ancak Baseline Profile Gradle eklentisini tek başına da kullanabilirsiniz. Baseline Profile Gradle eklentisi hakkında daha fazla bilgi için Temel Profil oluşturma işleminizi yapılandırma bölümüne bakın.

Baseline Profile Gradle eklentisini kullanarak Temel Profil şu şekilde oluşturulur:

  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 öğesinin :app modülüne işaret ettiğinden emin olun.
    3. İsteğe bağlı olarak, Gradle tarafından yönetilen bir cihaz (GMD) ekleyin. Aşağıdaki örnekte özelliğin değeri pixel6Api31'dır. Belirtilmezse eklenti, emülasyonlu veya fiziksel bağlı bir 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
    }
    

    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 Temel Profil testi oluşturun. Aşağıdaki örnek, uygulamayı başlatan ve boşta kalma süresini 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ünde build.gradle.kts dosyasını güncelleyin (örneğin, :app).

    1. androidx.baselineprofile eklentisini uygulayın.
    2. :baseline-profile modülüne bir baselineProfile bağımlılığı 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. Oluşturma görevinin sonunda, Temel Profil app/src/variant/generated/baselineProfiles hedefine kopyalanır.

AGP 7.3-7.4 ile yeni bir Temel Profil oluşturun

AGP 7.3-7.4 arası Temel Profiller oluşturmak mümkündür, ancak Baseline Profile Gradle eklentisini ve en yeni özelliklerini kullanabilmek için en azından AGP 8.1 sürümüne geçmenizi önemle tavsiye ederiz.

AGP 7.3-7.4 arası Temel Profiller oluşturmanız gerekiyorsa adımlar, aşağıdaki istisnalar dışında, AGP 8.1'e yönelik adımlarla aynıdır:

Oluşturulan kuralları manuel olarak uygula

Temel Profil oluşturma aracı, cihazda bir İnsan Okunabilir Biçim (HRF) metin dosyası oluşturur ve bunu ana makinenize kopyalar. Oluşturulan profili kodunuza uygulamak için şu adımları izleyin:

  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ı izler. Bu kalıp şuna benzer: BaselineProfileGenerator-startup-baseline-prof.txt.

  2. Oluşturulan profili src/main/ konumuna kopyalayıp dosyanın adını baseline-prof.txt olarak değiştirin.

  3. Cloud Profiller'in kullanılamadığı durumlarda yerel Temel Profil derlemesini etkinleştirmek için uygulamanızın build.gradle.kts dosyasındaki ProfileInstaller kitaplığına bağımlılık ekleyin. Bu, Temel Profili yerel olarak başka cihazdan yüklemenin tek yoludur.

    dependencies {
         implementation("androidx.profileinstaller:profileinstaller:1.3.1")
    }
    
  4. Uygulanan HRF kuralları ikili biçimde derlenip APK'ya 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.

Referans 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ırması yapılandırması oluşturun. Karşılaştırma testi hakkında daha fazla bilgi edinmek için Makrobenchmark sınıfı oluşturma ve Makrobenchmark kitaplığıyla ölçümü otomatikleştirme bölümlerine bakın.

Şekil 3. Android Testleri'ni oluk işleminden çalıştırın.

Bunu Android Studio'da çalıştırdığınızda derleme çıktısı, 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ı yakalayın

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

İlk ekran görüntülenene kadar geçen süre (TTID)
Uygulamanın kullanıcı arayüzünün ilk karesinin görüntülenmesi için geçen süre.
Tam görüntüleme süresi (TTFD)
TTID ile birlikte, ilk kare gösterildikten sonra eşzamansız olarak yüklenen içeriğin gösterilme süresi de buna dahildir.

TTFD, ComponentActivity'ün reportFullyDrawn() yöntemi çağrıldıktan sonra bildirilir. reportFullyDrawn() hiç çağrılmazsa bunun yerine TTID bildirilir. reportFullyDrawn() çağrılmasını eşzamansız yükleme tamamlanana kadar ertelemeniz gerekebilir. Örneğin, kullanıcı arayüzünde RecyclerView veya geç liste gibi bir dinamik liste varsa liste, 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 gibi durumlarda, kullanıcı arayüzü tam olarak çizilmiş duruma ulaştıktan sonra çalışan kod, Temel Profil'e dahil edilmez.

Liste nüfusunu Temel Profilinizin bir parçası olarak dahil etmek için getFullyDrawnReporter() kullanarak FullyDrawnReporter öğesini alın ve uygulama kodunuza bir muhabir ekleyin. Arka plan görevi listeyi doldurmayı tamamladıktan sonra rapor oluşturucuyu bırakın. FullyDrawnReporter, tüm bildirenler serbest bırakılıncaya kadar reportFullyDrawn() yöntemini çağırmaz. Bunu yaptığınızda Temel Profil, listeyi doldurmak için gereken kod yollarını içerir. Bu, kullanıcı için uygulamanın davranışını değiştirmez ancak Temel Profilin gerekli tüm kod yollarını içermesini sağlar.

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

  • ReportDrawn, composable'ın etkileşim için hemen 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 etkileşime hazır olduğunu gösteren bir askıya alma yöntemi kullanır.