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:
- Temel Profil modülünü ayarlayın.
- Temel Profiller oluşturmaya yardımcı olan JUnit testini tanımlayın.
- Optimize etmek istediğiniz Kritik Kullanıcı Yolculuklarını (CUJ'ler) ekleyin.
- 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:
- Dosya > Yeni > Yeni Modül'ü seçin.
- Şablonlar panelinde Temel Profil Oluşturucu şablonunu seçin ve yapılandırın:
Ş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.
- 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.
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:
- Gradle projenizde bir Makrobenchmark modülü oluşturun.
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.Baseline Profile Gradle eklentisini (
libs.plugins.androidx.baselineprofile
) ekleyin. Eklenti, Temel Profiller oluşturmayı ve gelecekte bunları korumayı kolaylaştırır.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ğerinisystemImageSource
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:
- Yeni bir
com.android.test
modülü oluşturun (ör.:baseline-profile
). :baseline-profile
içinbuild.gradle.kts
dosyasını yapılandırın:androidx.baselineprofile
eklentisini uygulayın.targetProjectPath
öğesinin:app
modülüne işaret ettiğinden emin olun.- İ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. - 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 }
: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; }) ) } }
Uygulama modülünde
build.gradle.kts
dosyasını güncelleyin (örneğin,:app
).androidx.baselineprofile
eklentisini uygulayın.:baseline-profile
modülüne birbaselineProfile
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"' }
:app:generateBaselineProfile
veya:app:generateVariantBaselineProfile
Gradle görevlerini çalıştırarak profili oluşturun.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:
- Baseline Profile Gradle eklentisini eklemeyin.
- Temel Profil oluşturmak için
./gradlew [emulator name][flavor][build type]AndroidTest
Gradle görevini yürütün. Örneğin,./gradlew :benchmark:pixel6Api31BenchmarkAndroidTest
. - Oluşturulan Temel Profil kurallarını kodunuza manuel olarak uygulamanız gerekir.
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:
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
.Oluşturulan profili
src/main/
konumuna kopyalayıp dosyanın adınıbaseline-prof.txt
olarak değiştirin.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") }
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.
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çinlist.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.
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken görüntülenir
- Makrobenchmark metriklerini yakalama
- Makrobenchmark yazma
- JankStats kitaplığı