Bu belgede, sorunları teşhis etmenize ve Baseline Profillerinizin en iyi şekilde çalışarak en fazla faydayı sağlamasına yardımcı olacak en iyi uygulamalar ve sorun giderme adımları yer almaktadır.
Derleme sorunları
Now in Android örnek uygulamasında Baseline Profiles örneğini kopyaladıysanız Baseline Profile görevi sırasında testlerin emülatörde çalıştırılamadığını belirten test hatalarıyla karşılaşabilirsiniz:
./gradlew assembleDemoRelease
Starting a Gradle Daemon (subsequent builds will be faster)
Calculating task graph as no configuration cache is available for tasks: assembleDemoRelease
Type-safe project accessors is an incubating feature.
> Task :benchmarks:pixel6Api33DemoNonMinifiedReleaseAndroidTest
Starting 14 tests on pixel6Api33
com.google.samples.apps.nowinandroid.foryou.ScrollForYouFeedBenchmark > scrollFeedCompilationNone[pixel6Api33] FAILED
java.lang.AssertionError: ERRORS (not suppressed): EMULATOR
WARNINGS (suppressed):
...
Bu hatalar, Now in Android'in Baseline Profile oluşturma için Gradle tarafından yönetilen bir cihaz kullanmasından kaynaklanır. Genellikle bir emülatörde performans karşılaştırmaları çalıştırmamanız gerektiğinden hatalar beklenir. Ancak temel profiller oluştururken performans metrikleri toplamadığınız için kolaylık sağlaması açısından emülatörlerde temel profil toplama işlemi gerçekleştirebilirsiniz. Temel profilleri bir emülatörle kullanmak için derleme ve yükleme işlemlerini komut satırından gerçekleştirin ve temel profil kurallarını etkinleştirmek için bir bağımsız değişken ayarlayın:
installDemoRelease -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
Alternatif olarak, Run > Edit Configurations'ı (Çalıştır > Yapılandırmaları Düzenle) seçerek Android Studio'da emülatörlerde temel profil oluşturmayı etkinleştirmek için özel bir çalıştırma yapılandırması oluşturabilirsiniz:
Profil yüklemesini ve uygulamasını doğrulama
İncelediğiniz APK veya Android App Bundle'ın (AAB) Baseline Profiles içeren bir derleme varyantından olup olmadığını kontrol etmek için aşağıdakileri yapın:
- Android Studio'da Build > Analyze APK'yı (Derle > APK'yı Analiz Et) seçin.
- AAB veya APK'nızı açın.
baseline.profdosyasının mevcut olduğunu doğrulayın:- AAB'yi inceliyorsanız profil
/BUNDLE-METADATA/com.android.tools.build.profiles/baseline.profkonumundadır. Bir APK'yı inceliyorsanız profil
/assets/dexopt/baseline.profkonumundadır.Bu dosyanın varlığı, doğru bir derleme yapılandırmasının ilk işaretidir. Bu dosya eksikse Android Çalışma Zamanı, yükleme sırasında önceden derleme talimatı almaz.
Şekil 2. Android Studio'daki APK Analizcisi'ni kullanarak bir temel profil olup olmadığını kontrol edin.
- AAB'yi inceliyorsanız profil
Temel Profil'lerin, uygulamayı çalıştıran cihazda derlenmesi gerekir. Android Studio veya Gradle sarmalayıcı komut satırı aracını kullanarak hata ayıklanamayan derlemeleri yüklediğinizde cihaz üzerinde derleme işlemi otomatik olarak gerçekleşir. Uygulamayı Google Play Store'dan yüklerseniz temel profiller, yükleme sırasında değil, arka planda cihaz güncellemeleri sırasında derlenir. Uygulama diğer araçlar kullanılarak yüklendiğinde, Jetpack ProfileInstaller kitaplığı, bir sonraki arka plan DEX optimizasyonu işlemi sırasında profilleri derleme için sıraya almaktan sorumludur.
Bu gibi durumlarda, Baseline Profile'larınızın kullanıldığından emin olmak istiyorsanız Baseline Profile'ların derlenmesini zorunlu kılmanız gerekebilir.
ProfileVerifier, aşağıdaki örnekte gösterildiği gibi profil yükleme ve derleme durumunu sorgulamanıza olanak tanır:
Kotlin
private const val TAG = "MainActivity" class MainActivity : ComponentActivity() { ... override fun onResume() { super.onResume() lifecycleScope.launch { logCompilationStatus() } } private suspend fun logCompilationStatus() { withContext(Dispatchers.IO) { val status = ProfileVerifier.getCompilationStatusAsync().await() when (status.profileInstallResultCode) { RESULT_CODE_NO_PROFILE -> Log.d(TAG, "ProfileInstaller: Baseline Profile not found") RESULT_CODE_COMPILED_WITH_PROFILE -> Log.d(TAG, "ProfileInstaller: Compiled with profile") RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION -> Log.d(TAG, "ProfileInstaller: Enqueued for compilation") RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING -> Log.d(TAG, "ProfileInstaller: App was installed through Play store") RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST -> Log.d(TAG, "ProfileInstaller: PackageName not found") RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ -> Log.d(TAG, "ProfileInstaller: Cache file exists but cannot be read") RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE -> Log.d(TAG, "ProfileInstaller: Can't write cache file") RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION -> Log.d(TAG, "ProfileInstaller: Enqueued for compilation") else -> Log.d(TAG, "ProfileInstaller: Profile not compiled or enqueued") } } }
Java
public class MainActivity extends ComponentActivity { private static final String TAG = "MainActivity"; @Override protected void onResume() { super.onResume(); logCompilationStatus(); } private void logCompilationStatus() { ListeningExecutorService service = MoreExecutors.listeningDecorator( Executors.newSingleThreadExecutor()); ListenableFuture<ProfileVerifier.CompilationStatus> future = ProfileVerifier.getCompilationStatusAsync(); Futures.addCallback(future, new FutureCallback<>() { @Override public void onSuccess(CompilationStatus result) { int resultCode = result.getProfileInstallResultCode(); if (resultCode == RESULT_CODE_NO_PROFILE) { Log.d(TAG, "ProfileInstaller: Baseline Profile not found"); } else if (resultCode == RESULT_CODE_COMPILED_WITH_PROFILE) { Log.d(TAG, "ProfileInstaller: Compiled with profile"); } else if (resultCode == RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) { Log.d(TAG, "ProfileInstaller: Enqueued for compilation"); } else if (resultCode == RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING) { Log.d(TAG, "ProfileInstaller: App was installed through Play store"); } else if (resultCode == RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST) { Log.d(TAG, "ProfileInstaller: PackageName not found"); } else if (resultCode == RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ) { Log.d(TAG, "ProfileInstaller: Cache file exists but cannot be read"); } else if (resultCode == RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE) { Log.d(TAG, "ProfileInstaller: Can't write cache file"); } else if (resultCode == RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION) { Log.d(TAG, "ProfileInstaller: Enqueued for compilation"); } else { Log.d(TAG, "ProfileInstaller: Profile not compiled or enqueued"); } } @Override public void onFailure(Throwable t) { Log.d(TAG, "ProfileInstaller: Error getting installation status: " + t.getMessage()); } }, service); } }
Aşağıdaki sonuç kodları, bazı sorunların nedenine dair ipuçları verir:
RESULT_CODE_COMPILED_WITH_PROFILE- Profil yüklenir, derlenir ve uygulama her çalıştırıldığında kullanılır. Bu, görmek istediğiniz sonuçtur.
RESULT_CODE_ERROR_NO_PROFILE_EMBEDDED- Çalıştırılan APK'da profil bulunmuyor. Bu hatayı görürseniz Baseline Profilleri içeren bir derleme varyantı kullandığınızdan ve APK'nın bir profil içerdiğinden emin olun.
RESULT_CODE_NO_PROFILE- Uygulama, uygulama mağazası veya paket yöneticisi üzerinden yüklenirken bu uygulama için profil yüklenmedi. Bu hata kodunun temel nedeni,
ProfileInstallerInitializerdevre dışı bırakıldığından profil yükleyicinin çalıştırılmamasıdır. Bu hata bildirildiğinde uygulama APK'sında yerleştirilmiş bir profilin hâlâ bulunduğunu unutmayın. Yerleştirilmiş bir profil bulunamadığında döndürülen hata koduRESULT_CODE_ERROR_NO_PROFILE_EMBEDDEDolur. RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION- APK veya AAB'de bir profil bulunur ve derleme için sıraya alınır.
ProfileInstallertarafından bir profil yüklendiğinde, sistem tarafından arka planda DEX optimizasyonu bir sonraki çalıştırılışında derleme için sıraya alınır. Derleme tamamlanana kadar profil etkin olmaz. Derleme tamamlanana kadar temel profillerinizi karşılaştırmaya çalışmayın. Temel Profil'in zorunlu derlenmesi gerekebilir. Bu hata, Android 9 (API 28) ve sonraki sürümlerin yüklü olduğu cihazlarda uygulama Play Store'dan veya paket yöneticisinden yüklendiğinde oluşmaz. Bunun nedeni, derlemenin yükleme sırasında yapılmasıdır. RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING- Eşleşmeyen bir profil yüklenir ve uygulama bu profille derlenir.
Bu, Google Play Store veya paket yöneticisi üzerinden yapılan yüklemenin sonucudur.
Bu sonucun
RESULT_CODE_COMPILED_WITH_PROFILEdeğerinden farklı olduğunu unutmayın. Çünkü eşleşmeyen profil, yalnızca profil ile uygulama arasında hâlâ paylaşılan yöntemleri derler. Profil, beklenenden daha küçüktür ve Temel Profil'de yer alan yöntemlerden daha azı derlenir. RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILEProfileVerifierdoğrulama sonucu önbellek dosyasını yazamıyor. Bu durum, uygulama klasörü izinlerinde bir sorun olduğunda veya cihazda yeterli boş disk alanı olmadığında meydana gelebilir.RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION- ProfileVerifier
is running on an unsupported API version of Android. ProfileVerifieryalnızca Android 9 (API düzeyi 28) ve sonraki sürümleri destekler. RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST- Uygulama paketi için
PackageManagersorgulanırkenPackageManager.NameNotFoundExceptionistisnası oluşturulur. Bu durum nadiren yaşanır. Uygulamayı kaldırıp her şeyi yeniden yüklemeyi deneyin. RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ- Önceki doğrulama sonucu önbellek dosyası var ancak okunamıyor. Bu durum nadiren görülür. Uygulamayı kaldırıp her şeyi yeniden yüklemeyi deneyin.
Üretimde ProfileVerifier kullanma
Üretimde, profil durumunu belirten analiz etkinlikleri oluşturmak için ProfileVerifier ile birlikte Firebase için Google Analytics gibi analiz raporlama kitaplıklarını kullanabilirsiniz. Örneğin, bu özellik, temel profilleri içermeyen yeni bir uygulama sürümü yayınlandığında sizi hızlıca uyarır.
Temel profillerin derlenmesini zorunlu kılma
Temel profillerinizin derleme durumu RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION ise adb kullanarak derlemeyi hemen zorlayabilirsiniz:
adb shell cmd package compile -r bg-dexopt PACKAGE_NAME
ProfileVerifier olmadan temel profil derleme durumunu kontrol etme
ProfileVerifier kullanmıyorsanız derleme durumunu adb ile kontrol edebilirsiniz. Ancak bu araç, ProfileVerifier kadar ayrıntılı bilgiler vermez:
adb shell dumpsys package dexopt | grep -A 2 PACKAGE_NAME
adb kullanıldığında aşağıdakine benzer bir sonuç elde edilir:
[com.google.samples.apps.nowinandroid.demo]
path: /data/app/~~dzJiGMKvp22vi2SsvfjkrQ==/com.google.samples.apps.nowinandroid.demo-7FR1sdJ8ZTy7eCLwAnn0Vg==/base.apk
arm64: [status=speed-profile] [reason=bg-dexopt] [primary-abi]
[location is /data/app/~~dzJiGMKvp22vi2SsvfjkrQ==/com.google.samples.apps.nowinandroid.demo-7FR1sdJ8ZTy7eCLwAnn0Vg==/oat/arm64/base.odex]
Durum değeri, profil derleme durumunu gösterir ve aşağıdaki değerlerden biridir:
| Derleme durumu | Anlamı |
|---|---|
speed‑profile |
Derlenmiş bir profil vardır ve kullanılmaktadır. |
verify |
Derlenmiş profil yok. |
verify durumu, APK veya AAB'nin profil içermediği anlamına gelmez. Çünkü bu öğeler, bir sonraki arka plan DEX optimizasyonu göreviyle derleme için sıraya alınabilir.
Nedeni değeri, profilin derlenmesini tetikleyen durumu gösterir ve aşağıdaki değerlerden biridir:
| Neden | Anlamı |
|---|---|
install‑dm
|
Temel profil, uygulama yüklendiğinde manuel olarak veya Google Play tarafından derlenmiştir. |
bg‑dexopt
|
Cihazınız boştayken bir profil derlendi. Bu, Baseline Profile veya uygulama kullanımı sırasında toplanan bir profil olabilir. |
cmdline
|
Derleme, adb kullanılarak tetiklendi. Bu, Baseline Profile veya uygulama kullanımı sırasında toplanan bir profil olabilir. |
Startup Profili uygulamasını DEX ve r8.json ile doğrulama
Başlangıç profili kuralları, R8 tarafından derleme sırasında DEX dosyalarınızdaki sınıfların düzenini optimize etmek için kullanılır. Bu derleme zamanı optimizasyonu, Baseline Profilleri'nin (baseline.prof) kullanım şeklinden farklıdır. Baseline Profilleri, cihaz üzerinde derleme işleminin ART tarafından gerçekleştirilmesi için APK veya AAB'ye paketlenir. Başlangıç Profili kuralları, derleme sürecinde uygulandığından APK veya AAB'nizde incelenecek ayrı bir startup.prof dosyası yoktur. Başlangıç profillerinin etkisi bunun yerine DEX dosyası düzeninde görünür.
r8.json ile DEX düzenini inceleyin (AGP 8.8 veya sonraki sürümler için önerilir)
Android Gradle Eklentisi'nin (AGP) 8.8 veya sonraki sürümlerini kullanan projelerde, oluşturulan r8.json dosyasını inceleyerek başlangıç profilinin uygulanıp uygulanmadığını doğrulayabilirsiniz. Bu dosya, AAB'niz içinde paketlenir.
- AAB arşivinizi açın ve
r8.jsondosyasını bulun. - Oluşturulan DEX dosyalarının listelendiği
dexFilesdizisini dosyada arayın. dexFilesAnahtar/değer çiftini içeren bir nesne"startup": truearayın. Bu, Startup Profile kurallarının söz konusu DEX dosyasının düzenini optimize etmek için uygulandığını açıkça gösterir."dexFiles": [ { "checksum": "...", "startup": true // This flag confirms profile application to this DEX file }, // ... other DEX files ]
Tüm AGP sürümleri için DEX düzenlemesini inceleme
8.8'den eski bir AGP sürümü kullanıyorsanız DEX dosyalarını incelemek, başlangıç profilinizin doğru şekilde uygulandığını doğrulamanın temel yoludur. AGP 8.8 veya sonraki sürümlerini kullanıyorsanız ve DEX düzenini manuel olarak kontrol etmek istiyorsanız da bu yöntemi kullanabilirsiniz. Örneğin, beklenen performans iyileşmelerini görmüyorsanız. DEX düzenlemesini incelemek için aşağıdakileri yapın:
- Android Studio'da Build > Analyze APK'yı kullanarak AAB veya APK'nızı açın.
- İlk DEX dosyasına gidin. Örneğin,
classes.dex. - Bu DEX dosyasının içeriğini inceleyin. Başlangıç profili dosyanızda (
startup-prof.txt) tanımlanan kritik sınıfların ve yöntemlerin bu birincil DEX dosyasında bulunduğunu doğrulayabilmeniz gerekir. Başarılı bir uygulama, bu başlangıç için kritik bileşenlerin daha hızlı yüklenmesi için önceliklendirildiği anlamına gelir.
Performans sorunları
Bu bölümde, Temel Profillerinizi doğru şekilde tanımlayıp karşılaştırmanıza ve böylece bu profillerden en iyi şekilde yararlanmanıza yardımcı olacak bazı en iyi uygulamalar gösterilmektedir.
Başlangıç metriklerini doğru şekilde karşılaştırma
Başlangıç metrikleriniz iyi tanımlanmışsa temel profilleriniz daha etkili olur. İki temel metrik ilk gösterime kadar geçen süre (TTID) ve tam gösterime kadar geçen süre (TTFD)'dir.
TTID, uygulamanın ilk karesini çizdiği zamandır. Bir şeyin gösterilmesi, uygulamayı çalıştıran kullanıcının bunu görmesini sağladığından bu süreyi olabildiğince kısa tutmak önemlidir. Uygulamanın yanıt verdiğini göstermek için belirsiz bir ilerleme durumu göstergesi bile görüntüleyebilirsiniz.
TTFD, uygulamayla etkileşime girilebildiği zamandır. Kullanıcıların hayal kırıklığına uğramaması için bu süreyi mümkün olduğunca kısa tutmak önemlidir. TTFD'yi doğru şekilde işaretlerseniz sisteme, TTFD'ye giderken çalıştırılan kodun uygulama başlatma sürecinin bir parçası olduğunu bildirmiş olursunuz. Sonuç olarak sistem, bu kodu profile yerleştirme olasılığı daha yüksek.
Uygulamanızın hızlı yanıt verdiğini hissettirmek için hem TTID hem de TTFD'yi mümkün olduğunca düşük tutun.
Sistem, TTID'yi algılayabilir, Logcat'te gösterebilir ve başlangıç karşılaştırmalarının bir parçası olarak raporlayabilir. Ancak sistem TTFD'yi belirleyemez ve tam olarak çizilmiş etkileşimli duruma ulaştığında bunu bildirmek uygulamanın sorumluluğundadır. Bunu, reportFullyDrawn()'ı çağırarak veya Jetpack Compose kullanıyorsanız ReportDrawn'ı çağırarak yapabilirsiniz. Uygulamanın tamamen çizilmiş olarak kabul edilmesi için tamamlanması gereken birden fazla arka plan göreviniz varsa FullyDrawnReporter öğesini Başlangıç zamanlaması doğruluğunu artırma bölümünde açıklandığı şekilde kullanabilirsiniz.
Kitaplık profilleri ve özel profiller
Profillerin etkisini karşılaştırırken uygulamanızın profillerinin avantajlarını Jetpack kitaplıkları gibi kitaplıkların katkıda bulunduğu profillerden ayırmak zor olabilir. APK'nızı oluşturduğunuzda Android Gradle eklentisi, kitaplık bağımlılıklarındaki tüm profillerin yanı sıra özel profilinizi de ekler. Bu, genel performansı optimize etmek için iyidir ve yayın derlemeleriniz için önerilir. Ancak bu durum, özel profilinizden ne kadar ek performans kazancı elde ettiğinizi ölçmeyi zorlaştırır.
Özel profilinizin sağladığı ek optimizasyonu manuel olarak görmenin hızlı bir yolu, profili kaldırıp karşılaştırmalarınızı çalıştırmaktır. Ardından, bu bileşeni değiştirip karşılaştırma testlerinizi tekrar çalıştırın. İkisini karşılaştırdığınızda yalnızca kitaplık profilleri ve kitaplık profilleri ile özel profiliniz tarafından sağlanan optimizasyonları görürsünüz.
Profilleri karşılaştırmanın otomatikleştirilebilen bir yolu, yalnızca kitaplık profillerini içeren ancak özel profilinizi içermeyen yeni bir derleme varyantı oluşturmaktır. Bu varyanttaki karşılaştırmaları, hem kitaplık profillerini hem de özel profillerinizi içeren yayın varyantıyla karşılaştırın. Aşağıdaki örnekte, yalnızca kitaplık profillerini içeren varyantın nasıl ayarlanacağı gösterilmektedir. Profil tüketici modülünüze (genellikle uygulama modülünüz) releaseWithoutCustomProfile adlı yeni bir varyant ekleyin:
Kotlin
android { ... buildTypes { ... // Release build with only library profiles. create("releaseWithoutCustomProfile") { initWith(release) } ... } ... } ... dependencies { ... // Remove the baselineProfile dependency. // baselineProfile(project(":baselineprofile")) } baselineProfile { variants { create("release") { from(project(":baselineprofile")) } } }
Groovy
android { ... buildTypes { ... // Release build with only library profiles. releaseWithoutCustomProfile { initWith(release) } ... } ... } ... dependencies { ... // Remove the baselineProfile dependency. // baselineProfile ':baselineprofile"' } baselineProfile { variants { release { from(project(":baselineprofile")) } } }
Yukarıdaki kod örneği, baselineProfile bağımlılığını tüm varyantlardan kaldırır ve yalnızca release varyantına uygular. Kitaplık profillerinin, profil üretici modülüne olan bağımlılık kaldırıldığında hâlâ ekleniyor olması sezgisel olarak beklenmeyebilir. Ancak bu modül yalnızca özel profilinizi oluşturmaktan sorumludur. Android Gradle eklentisi, tüm varyantlar için çalışmaya devam eder ve kitaplık profillerini dahil etmekten sorumludur.
Ayrıca, yeni varyantı profil oluşturucu modülüne de eklemeniz gerekir. Bu örnekte, yapımcı modülünün adı :baselineprofile'dır.
Kotlin
android { ... buildTypes { ... // Release build with only library profiles. create("releaseWithoutCustomProfile") {} ... } ... }
Groovy
android { ... buildTypes { ... // Release build with only library profiles. releaseWithoutCustomProfile {} ... } ... }
Karşılaştırmayı Android Studio'dan çalıştırdığınızda, performansı yalnızca kitaplık profilleriyle ölçmek için bir releaseWithoutCustomProfile varyantı veya performansı kitaplık ve özel profillerle ölçmek için bir release varyantı seçin.
G/Ç'ye bağlı uygulama başlatma işleminden kaçının
Uygulamanız başlangıç sırasında çok sayıda G/Ç çağrısı veya ağ çağrısı yapıyorsa hem uygulamanın başlangıç süresini hem de başlangıç karşılaştırmanızın doğruluğunu olumsuz etkileyebilir. Bu ağır yük çağrıları, zaman içinde ve hatta aynı karşılaştırmanın yinelemeleri arasında değişebilen, belirsiz bir süre alabilir. Giriş/çıkış çağrıları genellikle ağ çağrılarından daha iyidir. Bunun nedeni, ağ çağrılarının cihazın dışındaki ve cihazın kendisindeki faktörlerden etkilenebilmesidir. Başlangıç sırasında ağ aramalarından kaçının. Birini veya diğerini kullanmanın kaçınılmaz olduğu durumlarda giriş/çıkış kullanın.
Uygulama mimarinizin, yalnızca başlatma karşılaştırması yaparken kullanmak için olsa bile ağ veya G/Ç çağrıları olmadan uygulama başlatmayı desteklemesini öneririz. Bu, karşılaştırma ölçümlerinizin farklı yinelemeleri arasında mümkün olan en düşük değişkenliğin olmasını sağlar.
Uygulamanızda Hilt kullanılıyorsa Microbenchmark ve Hilt'te karşılaştırma yaparken sahte I/O'ya bağlı uygulamalar sağlayabilirsiniz.
Tüm önemli kullanıcı yolculuklarını kapsama
Temel profil oluşturma sürecinde tüm önemli kullanıcı yolculuklarını doğru şekilde ele almanız önemlidir. Kapsam dışı kalan kullanıcı yolculukları, temel profillerle iyileştirilmez. En etkili temel profiller, tüm yaygın başlangıç kullanıcı yolculuklarının yanı sıra performans açısından hassas uygulama içi kullanıcı yolculuklarını (ör. listelerde gezinme) içerir.
A/B testi derleme zamanı profil değişiklikleri
Başlangıç ve temel profiller derleme zamanı optimizasyonu olduğundan, Google Play Store'u kullanarak farklı APK'ları doğrudan A/B test etmek genellikle üretim sürümlerinde desteklenmez. Üretime benzer bir ortamda etkiyi değerlendirmek için aşağıdaki yaklaşımları göz önünde bulundurun:
Dönem dışı yayın: Dönem dışı bir yayını, kullanıcı tabanınızın yalnızca profil değişikliğini içeren küçük bir yüzdesine yükleyin. Bu sayede, performans farkıyla ilgili gerçek dünya metrikleri toplayabilirsiniz.
Yerel karşılaştırma: Uygulamanızı, profil uygulanmış ve uygulanmamış şekilde yerel olarak karşılaştırın. Ancak yerel karşılaştırmanın, üretim cihazlarında bulunan ART'den Cloud Profiles'ın etkilerini içermediği için profillerle ilgili en iyi senaryoyu gösterdiğini unutmayın.