Temel Profillerde Hata Ayıklama

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
Şekil 1. Temel değer oluşturmak için bir özel çalıştırma yapılandırması ekleyin Artık Android'de Profiller.
ziyaret edin.

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
Şekil 2. APK Görüntüleyici'yi kullanarak Temel Profil olup olmadığını şurada kontrol edin: Android Studio.

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ür RESULT_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
ProfileVerifieris 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çin PackageManager. 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.