Temel Profillerde Hata Ayıklama

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:

Now in Android'de temel profiller oluşturmak için özel bir çalıştırma yapılandırması ekleme
Şekil 1. Now in Android'de temel profiller oluşturmak için özel bir çalıştırma yapılandırması ekleyin.

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:

  1. Android Studio'da Build > Analyze APK'yı (Derle > APK'yı Analiz Et) seçin.
  2. AAB veya APK'nızı açın.
  3. baseline.prof dosyasının mevcut olduğunu doğrulayın:

    • AAB'yi inceliyorsanız profil /BUNDLE-METADATA/com.android.tools.build.profiles/baseline.prof konumundadır.
    • Bir APK'yı inceliyorsanız profil /assets/dexopt/baseline.prof konumundadı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.

      Android Studio'daki APK Analizcisi'ni kullanarak temel profil olup olmadığını kontrol etme
      Şekil 2. Android Studio'daki APK Analizcisi'ni kullanarak bir temel profil olup olmadığını kontrol edin.

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, ProfileInstallerInitializer devre 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 kodu RESULT_CODE_ERROR_NO_PROFILE_EMBEDDED olur.
RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION
APK veya AAB'de bir profil bulunur ve derleme için sıraya alınır. ProfileInstaller tarafı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_PROFILE değ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_FILE
ProfileVerifier doğ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
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
Uygulama paketi için PackageManager sorgulanırken PackageManager.NameNotFoundException istisnası 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.

  1. AAB arşivinizi açın ve r8.json dosyasını bulun.
  2. Oluşturulan DEX dosyalarının listelendiği dexFiles dizisini dosyada arayın.
  3. dexFilesAnahtar/değer çiftini içeren bir nesne"startup": true arayı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:

  1. Android Studio'da Build > Analyze APK'yı kullanarak AAB veya APK'nızı açın.
  2. İlk DEX dosyasına gidin. Örneğin, classes.dex.
  3. 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.