Bu dokümanda, sorunları teşhis etmeye ve sorunları gidermeye Temel Profilleriniz en fazla yararı sağlamak için doğru şekilde çalışıyor.
Derleme sorunları
Artık Android'de Temel Profiller örneğini kopyaladıysanız Temel Profil görevi sırasında test hatalarıyla karşılaşabilirsiniz. testlerin bir emülatörde çalıştırılamayacağını belirtir:
./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):
...
Hataların nedeni, Now in Android'de Gradle tarafından yönetilen bir cihaz kullanmasıdır. Temel Profil oluşturma. Hatalar beklenen bir durumdur çünkü genellikle emülatörde performans karşılaştırmaları çalıştırmamalısınız. Ancak proje yöneticisi olarak Temel Profiller oluşturduğunuzda performans metriklerini toplayarak Kolaylık sağlamak için emülatörlerde Baseline Profile toplama özelliği. Referans değeri kullanmak için emülatörlü profiller, derleme ve yükleme işlemini komut satırını kullanıp Temel Profiller kurallarını etkinleştirmek için bir bağımsız değişken ayarlayın:
installDemoRelease -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
Alternatif olarak, aşağıdaki işlemleri gerçekleştirmek için Android Studio'da özel bir çalıştırma yapılandırması oluşturabilirsiniz: öğesini seçerek emülatörlerde Temel Profilleri etkinleştirebilirsiniz. Çalıştır > Yapılandırmaları düzenleyin:
![Now'da Android'de Temel Profiller oluşturmak için bir özel çalıştırma yapılandırması ekleyin](https://developer.android.com/static/topic/performance/images/studio/run-config-nowinandroid-baselineprofiles.png?authuser=1&hl=tr)
Yükleme sorunları
Oluşturduğunuz APK veya AAB'nin, aşağıdakileri içeren bir derleme varyantına ait olduğundan emin olun:
Temel Profiller. Bunu kontrol etmenin en kolay yolu APK'yı
Derleme > APK'yı analiz edin bölümünden
APK'ye geliyor ve /assets/dexopt/baseline.prof
içinde profili arıyor
dosya:
![Android Studio'da APK Görüntüleyici'yi kullanarak Temel Profil olup olmadığını kontrol etme](https://developer.android.com/static/topic/performance/images/studio/baseline-profile-in-apk.png?authuser=1&hl=tr)
Temel Profillerin uygulamayı çalıştıran cihazda derlenmesi gerekir. Her ikisi için
uygulama mağazası yüklemeleri ve Google Ads'e yüklenen
PackageInstaller
, cihaz üzerinde derleme, uygulama kapsamında gerçekleşir.
yükleme işlemidir. Ancak, uygulama Android Studio'dan başka cihazdan yüklendiğinde veya
kullanıyorsanız Jetpack ProfileInstaller
kitaplığını indirip
sonraki video yayın sürecinde profilleri derlemek üzere
arka plan DEX optimizasyon süreci sona erecektir. Bu gibi durumlarda,
Temel Profiller kullanılıyor. Bunun için
Temel Profillerin derlemesini zorunlu kılma başlıklı makaleyi inceleyin. ProfileVerifier
aşağıdaki gösterildiği gibi profil kurulumunun ve derlemenin durumunu sorguladığınızda
aşağıdaki örneği inceleyin:
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 nedeni hakkında ipuçları sağlar:
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 veya AAB'de profil bulunamadı. Şunu kullandığınızdan emin olun: bu hatayı görüyorsanız Temel Profilleri içeren bir varyant oluştur ve APK bir profil içeriyorsa.
RESULT_CODE_NO_PROFILE
- Uygulama üzerinden yüklenirken bu uygulama için profil yüklenmedi
yardımcı olur. Bunun hata koduna uygulanmasının temel nedeni,
ProfileInstallerInitializer
devre dışı bırakıldığı için yükleyici çalıştırılamadı. Bu hata bildirildiğinde, uygulama APK'sı. Yerleştirilmiş bir profil bulunamadığında hata kodu döndürülürRESULT_CODE_ERROR_NO_PROFILE_EMBEDDED
. RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION
- APK veya AAB'de bir profil bulunur ve derleme için sıraya alınır. Bir
profil
ProfileInstaller
tarafından yüklendi, derlemek üzere sıraya alındı arka plan DEX optimizasyonu sistem tarafından çalıştırılacak. Profil etkin olarak kalabileceksiniz. Referans aralığınızı karşılaştırmaya çalışmayın Derleme tamamlanana kadar profiller. Şunları yapmanız gerekebilir: Temel Profillerin derlemesini zorunlu kılma başlıklı makaleyi inceleyin. Bu hata, uygulamasını çalıştıran cihazlara uygulama mağazasından veya paket yöneticisinden yüklendiğinde Android 9 (API 28) ve sonraki sürümler, çünkü derleme emin olun. RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING
- Eşleşmeyen bir profil yüklenmiş ve uygulama bu profille derlenmiştir.
Bu, Google Play Store veya paket yöneticisi üzerinden yüklemenin sonucudur.
Bu sonucun
RESULT_CODE_COMPILED_WITH_PROFILE
değerinden farklı olduğuna dikkat edin, çünkü eşleşmeyen profil, yalnızca hâlâ paylaşılan yöntemleri derler profil ile uygulama arasında. Profil, şundan küçüktür: ve Referans Değer metriğine dahil edilenden daha az yöntem derlenir. Profil'e dokunun. RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE
ProfileVerifier
, doğrulama sonucu önbellek dosyasına yazamıyor. Bu Bunun nedeni uygulama klasörü izinlerinde bir sorun olması veya cihazınızda yeterli boş disk alanı yok.RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION
- ProfileVerifier
is running on an unsupported API version of Android. ProfileVerifier
, yalnızca Android 9 (API düzeyi 28) ve sonraki sürümleri destekler. RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST
PackageManager.NameNotFoundException
Uygulama paketi içinPackageManager
. Bu durum nadiren yaşanır. Dene uygulamayı kaldırıp her şeyi yeniden yükleyin.RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ
- Önceki bir doğrulama sonucu önbellek dosyası mevcut, ancak okunamıyor. Bu olması nadiren gerekir. Uygulamayı kaldırıp her şeyi yeniden yüklemeyi deneyin.
Üretimde ProfileVerifier kullanma
Üretimde, ProfileVerifier
öğesini şunlarla birlikte kullanabilirsiniz:
Firebase için Google Analytics gibi analiz raporlama kitaplıkları
profil durumunu gösteren analiz etkinlikleri oluşturmalıdır. Örneğin,
aşağıdakileri içermeyen yeni bir uygulama sürümü yayınlandığında sizi hızlı bir şekilde uyarır:
Temel Profiller.
Temel Profillerin derlenmesini zorunlu kıl
Temel Profillerinizin derleme durumu
RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION
, hemen kullanmaya zorlayabilirsiniz
adb
kullanılarak yapılan derleme:
adb shell cmd package compile -r bg-dexopt PACKAGE_NAME
Derleme durumunu ProfileVerifier olmadan kontrol et
ProfileVerifier
kullanmıyorsanız derleme durumunu şuradan kontrol edebilirsiniz:
adb
olsa da ProfileVerifier
kadar derin analizler sunmaz:
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 şu değerlere sahiptir:
Derleme durumu | Anlamı |
---|---|
speed‑profile |
Derlenmiş bir profil mevcut ve kullanılıyor. |
verify |
Derlenmiş profil yok. |
verify
durumu, APK veya AAB'nin bir profil içermediği anlamına gelmez.
çünkü bir sonraki arka plan DEX optimizasyonu tarafından derlemek üzere sıraya alınabilir
görevi görebilir.
Neden değeri, profilin derlenmesini neyin tetiklediğini gösterir ve aşağıdaki değerlerden biri:
Neden | Anlamı |
---|---|
install‑dm
|
Temel Profil manuel olarak veya Google tarafından derlendi Uygulama yüklendiğinde oynayın. |
bg‑dexopt
|
Cihazınız boştayken bir profil derlendi. Bu bir Temel Profil veya bir temel profil toplanan verileri görebilirsiniz. |
cmdline
|
Derleme adb kullanılarak tetiklendi. Bu bir Temel Profil veya bir temel profil toplanan verileri görebilirsiniz. |
Performans sorunları
Bu bölümde, karşılaştırmayı doğru şekilde tanımlamaya ve karşılaştırma yapmaya yönelik Temel Profillerinizden en iyi şekilde yararlanabilirsiniz.
Başlangıç metriklerini doğru şekilde karşılaştırın
Başlangıç metrikleriniz şu koşulları karşılıyorsa Temel Profilleriniz daha etkili olacaktır: iyi tanımlanmıştır. İki temel metrik, ilk ekran görüntülenene kadar geçen süre (TTID) ve tam ekran süresi (TTFD).
TTID, uygulamanın ilk karesini çizdiği zamandır. Her şeyi kısa ve öz tutmak Çünkü bir şey görüntülemek kullanıcıya uygulamanın çalıştığını gösterir. Belirsiz bir ilerleme göstergesi de görüntüleyebilir ve uygulamanın her zaman duyarlıdır.
TTFD, uygulamayla etkileşimde bulunulabildikleri zamandır. Takip etmeniz gereken kullanıcının hayal kırıklığına uğratmamasını sağlamak için bunu mümkün olduğunca kısa tutun. Doğru sinyalleri kullanırsanız TTFD, sisteme TTFD yönünde çalıştırılan kodun bir bölümüdür. Sistemin bu kodu profile yerleştirme olasılığı daha yüksektir önemli.
Uygulamanızın duyarlı olmasını sağlamak için hem TTID hem de TTFD'yi mümkün olduğunca düşük tutun.
Sistem, TTID'yi algılayabilir, Logcat'te görüntüleyebilir ve TTID'yi
ne kadar önemli olduğunu gördük. Ancak, sistem TTFD'yi belirleyemez ve
tamamen çizilmiş etkileşimli bir reklama ulaştığında bunu bildirme sorumluluğu
durumu. Bu işlemi reportFullyDrawn()
numaralı telefonu arayarak veya
Jetpack Compose kullanıyorsanız ReportDrawn
. Birden fazla
uygulamanın tam olarak değerlendirilmesi için tamamlanması gereken arka plan görevleri
olursa, Geliştirme bölümünde açıklandığı gibi FullyDrawnReporter
aracını kullanabilirsiniz
başlatma zamanlaması doğruluğu.
Kitaplık profilleri ve özel profiller
Profillerin etkisini ölçtüğünüzde, artımlılık testleriniz için uygulamanızın profillerinin, kitaplıklar tarafından sağlanan profillerdeki avantajları (örneğin, Jetpack kitaplıkları. APK'nızı derlediğinizde Android Gradle eklentisine kitaplıklarındaki verileri ve özel profilinizi kontrol edin. Bu iyi genel performansı optimize etmeye yöneliktir ve sürüm derlemeleriniz için önerilir. Ancak bu, ek performans kazancının ne kadar yüksek olduğunu ölçmeyi zorlaştırır. özel profilinizden.
Özel kampanyanızın sağladığı ek optimizasyonu manuel olarak görmenin kolay bir yolu verileri kaldırmak ve karşılaştırma yapmaktır. Daha sonra bunu değiştirin ve tekrar kullanabilirsiniz. İkisini karşılaştırdığınızda, sadece kitaplık profillerinin yanı sıra kitaplık profilleri ile özel profilinizi de görürsünüz.
Profillerin otomatik olarak karşılaştırılabilir bir yolu,
yalnızca kitaplık profillerini içerir, özel profilinizi içermez. Karşılaştır
referans değerleri, hem
kitaplık profilleriniz ve özel profilleriniz olabilir. Aşağıdaki örnekte,
tıklayın. Yeni varyant ekle
müşteri modülünüze releaseWithoutCustomProfile
olarak adlandırdık. Bu modül,
genellikle uygulama modülünüz:
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")) } } }
Eski
android { ... buildTypes { ... // Release build with only library profiles. releaseWithoutCustomProfile { initWith(release) } ... } ... } ... dependencies { ... // Remove the baselineProfile dependency. // baselineProfile ':baselineprofile"' } baselineProfile { variants { release { from(project(":baselineprofile")) } } }
Önceki kod örneği, tüm etiketlerden baselineProfile
bağımlılığını
ve bunu, seçici olarak yalnızca release
varyantına uygular. Örneğin,
kitaplık profillerinin halen eklenmekte olduğunu
profil yapımcısı modülüne olan bağımlılık kaldırılır. Ancak bu modül
Yalnızca özel profilinizi oluşturmaktan sorumlu olur. Android Gradle
eklentisi tüm varyantlar için çalışmaya devam etmektedir ve
kitaplık profillerine göz atın.
Ayrıca yeni varyantı profil oluşturma modülüne eklemeniz gerekir. Burada
Örneğin, yapımcı modülünün adı :baselineprofile
.
Kotlin
android { ... buildTypes { ... // Release build with only library profiles. create("releaseWithoutCustomProfile") {} ... } ... }
Eski
android { ... buildTypes { ... // Release build with only library profiles. releaseWithoutCustomProfile {} ... } ... }
Karşılaştırmayı Android Studio'dan çalıştırdığınızda,
Yalnızca kitaplıkla performansı ölçebileceğiniz releaseWithoutCustomProfile
varyant
profilleri kullanın veya kitaplıkla performansı ölçmek için bir release
varyantı seçin
ve özel profiller.
G/Ç bağlantılı uygulama başlatmadan kaçının
Uygulamanız başlatma sırasında çok sayıda G/Ç araması veya ağ araması yapıyorsa hem uygulama başlatma süresini hem de startup'ınızın doğruluğunu olumsuz yönde etkileyebilir. her şeyi öğrenebilirsiniz. Bu tür yoğun aramalar, belirsiz süre alabilir. ve aynı karşılaştırmanın yinelemeleri arasında bile değişebilen değişkenlik gösterebilir. G/Ç çağrıları genellikle ağ aramalarından daha iyidir, cihazdaki ve cihazın dışındaki faktörlerden etkilenir. Kullanılmasın çağrılarına karşılık gelir. Bunlardan birinin veya diğerinin kullanılmasının kaçınılmaz olduğu durumlarda I/O'yu kullanın.
Uygulama mimarinizin, ağ olmadan uygulama başlatma desteği veya Yalnızca startup karşılaştırması yaparken kullanmak için bile I/O çağrılarına izin verilir. Bu sayede ekip Karşılaştırmalarınızın farklı yinelemeleri arasındaki olası en düşük değişkenliği.
Uygulamanızda Hilt kullanılıyorsa sahte G/Ç bağlantısı sağlayabilirsiniz Microbenchmark ve Hilt'te karşılaştırma yaparken kullanabileceğiniz uygulamalardır.
Tüm önemli kullanıcı yolculuklarını kapsama
Hesabınızdaki tüm önemli kullanıcı yolculuklarını doğru bir şekilde ele almanız Temel Profil oluşturma. Kapsama dahil olmayan kullanıcı yolculukları Temel Profiller tarafından iyileştirildi. En etkili temel profiller şunları içerir: kullanıcı yolculuklarının yanı sıra performans açısından hassas uygulama içi kullanıcılar en iyi uygulamaları paylaşacağız.