Temel Profillere genel bakış

Temel Profil, dahil edilen kod yolları için yorumlama ve tam zamanında (JIT) derleme adımlarını atlayarak ilk başlatmadan itibaren kod yürütme hızını yaklaşık% 30 artırır.

Bir uygulamada veya kitaplıkta Baseline Profile göndererek Android Runtime (ART), Ahead-of-Time (AOT) derlemesi aracılığıyla belirtilen kod yollarını optimize edebilir. Böylece her yeni kullanıcı ve her uygulama güncellemesi için performans iyileştirmeleri sağlanır. Bu Profile Guided Optimization (PGO), uygulamaların başlatma işlemini optimize etmesine, etkileşimdeki takılmaları azaltmasına ve ilk başlatmadan itibaren kullanıcılar için genel çalışma zamanı performansını iyileştirmesine olanak tanır.

Bu performans iyileştirmeleri, kullanıcı elde tutma oranı, işlemler ve puanlar gibi iş metriklerinde doğrudan iyileşme sağlar. Josh, Lyft, TikTok ve Zomato'nun hikayelerinden performansın işletme metriklerini nasıl etkilediği hakkında daha fazla bilgi edinebilirsiniz.

Temel profillerin avantajları

Temel profiller, uygulamanın ilk çalıştırılmasından itibaren uygulama başlatma, ekranlar arasında gezinme veya içeriklerde gezinme gibi tüm kullanıcı etkileşimlerini daha sorunsuz hale getirir. Temel Profiller, bir uygulamanın hızını ve yanıt verme özelliğini artırarak daha fazla günlük etkin kullanıcı ve daha yüksek bir ortalama geri dönüş oranı sağlayabilir.

Temel Profiller, ilk başlatmadan itibaren uygulamanın çalışma zamanını iyileştiren ortak kullanıcı etkileşimleri sağlayarak optimizasyonun uygulama başlatmanın ötesine geçmesine yardımcı olur. Rehberli AOT derlemesi, kullanıcı cihazlarına bağlı değildir ve mobil cihaz yerine geliştirme makinesinde sürüm başına bir kez yapılabilir. Yayınları Baseline Profile ile birlikte göndererek uygulama optimizasyonlarını yalnızca Cloud Profiles'a güvenerek yapmaktan çok daha hızlı bir şekilde kullanıma sunabilirsiniz.

Temel Profil kullanılmadığında tüm uygulama kodu, yorumlandıktan sonra bellekte JIT derlenir veya cihaz boşta kaldığında arka planda bir odex dosyasına yazılır. Kullanıcılar, bir uygulamayı yükledikten veya güncelledikten sonra ilk kez çalıştırdıklarında yeni kod yolları optimize edilene kadar ideal olmayan bir deneyim yaşar. Birçok uygulama, optimizasyon sonrasında yaklaşık% 30'luk performans artışı ölçmektedir.

Başlangıç profilleri

Başlangıç profilleri, temel profillere benzer ancak cihaz üzerinde optimizasyon yerine derleme zamanında kullanılır. Başlangıç profili, başlangıç sürelerini iyileştirmek için DEX dosyasının düzenini optimize etmek amacıyla kullanılır. Başlangıç profilinde tanımlanan kod, birincil classes.dex dosyasına, diğer kod ise ayrı DEX dosyalarına yerleştirilir. Bu, uygulama başlatma sırasında sayfa hatalarının sayısını azaltarak başlatma sürelerini iyileştirir. Başlangıç profilleri ve DEX düzeni optimizasyonlarının uygulama başlatma sürelerini nasıl iyileştirebileceği hakkında daha fazla bilgi edinmek için DEX düzeni optimizasyonları ve başlangıç profilleri başlıklı makaleyi inceleyin.

Başlayın

Mevcut uygulamanızda performansı optimize etmeye başlamak için Temel Profil Oluşturma başlıklı makaleyi inceleyin.

Profil oluşturma ve yayın derlemeleri

Temel ve başlangıç profili dosyaları (örneğin, baseline-prof.txt ve startup-prof.txt) oluştururken gereken derleme yapılandırmaları ile bu profilleri kullanan nihai yayın APK'nızı oluştururken gereken derleme yapılandırmaları arasındaki farkı anlamak önemlidir.

Profil dosyaları oluştururken (örneğin, benchmark):

Oluşturulan profil kurallarının kodunuzun yöntem imzalarıyla doğru şekilde eşleştiğinden emin olmak için profil oluşturmada kullanılan derleme varyantında karartma ve optimizasyonu (R8) devre dışı bırakmanız gerekir. Bu varyant, karartma ve optimizasyonun etkinleştirildiği yayın derleme varyantınızdan farklı olmalıdır. Bunu, profil oluşturma derleme varyantı için isMinifyEnabled = false değerini ayarlayarak yapabilirsiniz. Baseline Profile Gradle eklentisini kullanmıyorsanız -dontobfuscate ve -dontoptimize öğelerinin de uygulandığından emin olmanız gerekir. Baseline Profile Gradle Plugin bu yapılandırmayı sizin için otomatik olarak işler.

Son sürüm APK'nızı oluştururken:

Sürüm derlemenizde her zaman isMinifyEnabled = true olmalıdır. Bu sayede karartma, küçültme ve optimizasyondan yararlanabilirsiniz. R8, kuralları karartılmamış profil dosyalarınızdan, yayın APK'nızdaki karartılmış ve optimize edilmiş kodla eşleşecek şekilde otomatik olarak yeniden yazar. DEX düzeni optimizasyonunun (Başlangıç Profilleri tarafından desteklenir) etkili olması için yayın uygulamanızın karartılmış olması ve tüm optimizasyonlar etkinleştirilmiş şekilde R8 kullanması gerekir.

Bağımlılık zinciri, kararlı ve geliştirme sürümü sürümlerini sağlar. Temel Profil oluşturup yüklemek için Android Gradle eklentisi, Macrobenchmark kitaplığı ve Profile Installer'ın aşağıdaki desteklenen sürümlerini veya daha yeni sürümlerini kullanın. Bu bağımlılıklar farklı zamanlarda gereklidir ve optimum temel profil oluşturmak için araç zinciri olarak birlikte çalışır.

  • Android Gradle eklentisi: com.android.tools.build:8.0.0
  • Macrobenchmark kitaplığı: androidx.benchmark:benchmark-macro-junit4:1.4.1
  • Profil yükleyici: androidx.profileinstaller:profileinstaller:1.4.1

Temel Profil oluşturmak ve yönetmek için AGP'nin en son sürümünü kullanmanızı öneririz. AGP'nin farklı sürümlerinde bulunan başlıca işlevler şunlardır:

AGP sürümü Özellikler
8.4 Gradle sarmalayıcı komut satırı aracı kullanılarak hata ayıklanamayan derlemelerin yerel uygulama yüklemeleri veya Android Studio, Baseline Profilleri'ni yükler. Bu nedenle, yerel sürüm derlemenizin performansı üretimle daha yakından eşleşir. Bu güncelleme, Temel Profillerin üretim performansını etkilemez.
8.3
  • Tam kaynak kümesi dizini desteği (kitaplık modülleri): Birden fazla temel profil kaynak dosyası bildirin ve src/free/generated/baselineProfiles/baseline-prof1.txt gibi varyant duyarlı dizinleri artık kitaplık modüllerinde ve uygulama modüllerinde kullanın.
  • Temel profiller şekeri alınmış sınıfları içerir.
8.2
  • Kuralların R8 ile yeniden yazılması: D8 ve R8, okunabilir Baseline ve Startup Profile kurallarını, uygulama performansını optimize etmek için ihtiyacınız olan tüm kuralları tam olarak yakalayacak şekilde dönüştürebilir. Bu sayede, sadeleştirilmemiş bir derlemeden profiller oluşturabilir ve bunları sadeleştirilmiş bir sürüm derlemesine uygulayabilirsiniz. Yöntemlerin temel profil kapsamını yaklaşık% 30, uygulama performansını ise yaklaşık %15 artırır.
  • Başlangıç Profilleri: DEX'teki kodun düzenini bildirmek için bu yeni tür temel profil oluşturun. Başlatma performansını yaklaşık %15 daha artırır. Büyük uygulamalarda bu oran çok daha yüksek olabilir.
8.0 Önerilen minimum sürüm: Tek bir Gradle göreviyle temel profiller oluşturmak için Baseline Profile Gradle eklentisini kullanın.
  • Tam kaynak grubu dizini desteği (uygulama modülleri): Birden fazla temel profil kaynak dosyası bildirin ve src/free/generated/baselineProfiles/baseline-prof1.txt gibi varyant duyarlı dizinler kullanın.
7.4 Desteklenen minimum sürüm: Uygulamalar, kitaplıklardan Baseline Profile'ları kullanabilir ve src/main/baseline-prof.txt dosyasında kendi Baseline Profile'larını sağlayabilir.
  • APK, uygulama paketinden oluşturulurken Baseline Profilleri doğru şekilde paketlenir (sorun #230361284).
  • Birden fazla .dex dosyası olan uygulamalarda, temel profiller birincil .dex dosyası için doğru şekilde paketlenir.
  • D8 ve R8, isMinifyEnabled değerinin false olarak ayarlandığı bir derlemeden başlangıç profilleri oluşturmayı destekler.

Profil oluşturma örneği

Aşağıda, önerilen Macrobenchmark kitaplığını kullanarak uygulama başlatma için temel profil oluşturmanın yanı sıra çeşitli gezinme ve kaydırma etkinlikleri oluşturmaya yönelik örnek bir sınıf verilmiştir:

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

Bu kodu tam bağlamda ve daha ayrıntılı olarak GitHub'daki performans örneklerimizde görebilirsiniz.

Dahil edilecek bilgiler:

Bir uygulamada Temel Profiller'i kullanırken uygulama başlatma kodunu ve ekranlar arasında gezinme veya kaydırma gibi yaygın kullanıcı etkileşimlerini ekleyebilirsiniz. Kayıt, giriş veya ödeme gibi akışların tamamını da toplayabilirsiniz. Kritik olarak değerlendirdiğiniz tüm kullanıcı yolculukları, çalışma zamanı performanslarını artırarak Temel Profiller'den yararlanabilir.

Performansı artırmak için farklı yaklaşımlar deniyorsanız denemenizin her iki kolu için de Baseline Profiles'ı eklemeyi düşünebilirsiniz. Bu işlemi yaparak tüm kullanıcılarınızın derlenmiş kodu tutarlı bir şekilde çalıştırmasını sağlayabilir ve sonuçlarınızı daha kolay yorumlayabilirsiniz.

Kitaplıklar, kendi temel profillerini sağlayabilir ve uygulama performansını artırmak için bunları yayınlarla birlikte gönderebilir. Örneğin, Jetpack Compose performansında temel profil kullanma bölümüne bakın.

Temel profillerin işleyiş şekli

Uygulamanızı veya kitaplığınızı geliştirirken oluşturma süresinin ya da gecikmenin önemli olduğu yaygın kullanıcı etkileşimlerini kapsayacak şekilde Temel Profiller tanımlamayı düşünebilirsiniz. İşleyiş şekli:

  1. Uygulamanız için insan tarafından okunabilir profil kuralları oluşturulur ve uygulamada ikili biçimde derlenir. Bu kuralları assets/dexopt/baseline.prof bölümünde bulabilirsiniz. Ardından, AAB'yi her zamanki gibi Google Play'e yükleyebilirsiniz.

  2. Google Play, profili işler ve APK ile birlikte doğrudan kullanıcılara gönderir. Yükleme sırasında ART, profildeki yöntemlerin AOT derlemesini gerçekleştirir. Bu da söz konusu yöntemlerin daha hızlı yürütülmesini sağlar. Profil, uygulama başlatma veya çerçeve oluşturma sırasında kullanılan yöntemleri içeriyorsa kullanıcı, daha hızlı başlatma süreleri ve daha az takılma deneyimleyebilir.

  3. Bu akış, zaman içinde uygulamanın gerçek kullanımına göre performansı hassaslaştırmak için Cloud Profiles toplama işlemiyle birlikte çalışır.

Şekil 1. Bu şemada, yüklemeden son kullanıcıya teslimata kadar olan Baseline Profile iş akışı ve bu iş akışının Cloud Profilleri ile ilişkisi gösterilmektedir.

Cloud Profilleri

Cloud Profiles, Google Play Store tarafından toplanan ve yükleme zamanı derlemesi için dağıtılan ek bir PGO biçimi sunar. Bu biçim, Baseline Profiles ile birlikte kullanılır.

Cloud Profilleri, uygulamayla gerçek dünyadaki kullanıcı etkileşimlerine dayalı olsa da güncellemelerden sonra dağıtılmaları birkaç saat ila birkaç gün sürer. Bu durum, kullanılabilirliklerini sınırlar. Profiller tam olarak dağıtılana kadar yeni veya güncellenen uygulamaların kullanıcıları için uygulama performansı en iyi düzeyde olmaz. Ayrıca, Cloud Profilleri yalnızca Android 9 (API düzeyi 28) veya daha yeni bir sürümü çalıştıran Android cihazları destekler ve yalnızca yeterince büyük bir kullanıcı tabanına sahip uygulamalarda iyi ölçeklenir.

Android sürümlerinde derleme davranışı

Android platform sürümleri, her biri karşılık gelen bir performans ödünleşmesiyle farklı uygulama derleme yaklaşımları kullanır. Temel profiller, tüm yüklemeler için bir profil sağlayarak önceki derleme yöntemlerini geliştirir.

Android sürümü Derleme yöntemi Optimizasyon yaklaşımı
5 ila 6 (API düzeyi 21 ila 23) Tam AOT Uygulamanın tamamı yükleme sırasında optimize edildiğinden uygulamayı kullanmak için uzun süre beklenmesi, RAM ve disk alanı kullanımının artması ve diskten kod yükleme süresinin uzaması gibi sorunlar yaşanır. Bu durum, soğuk başlatma sürelerini de uzatabilir.
7 - 8.1 (API düzeyi 24 - 27) Kısmi AOT (temel profil) Baseline Profilleri, uygulama modülü bu bağımlılığı tanımladığında ilk çalıştırmada androidx.profileinstaller tarafından yüklenir. ART, uygulama kullanılırken ek profil kuralları ekleyerek ve cihaz boşta kaldığında bunları derleyerek bu durumu daha da iyileştirebilir. Bu, disk alanını ve diskten kod yükleme süresini optimize ederek uygulamanın bekleme süresini kısaltır.
9 (API düzeyi 28) ve daha yeni sürümler Kısmi AOT (Temel + Cloud Profili) Play, uygulama yüklemeleri sırasında APK'yı ve varsa Cloud profillerini optimize etmek için Baseline Profiles'ı kullanır. Yükleme işleminden sonra ART profilleri Play'e yüklenir, toplanır ve ardından uygulamayı yükleyen veya güncelleyen diğer kullanıcılara Bulut Profilleri olarak sunulur.

Bilinen sorunlar

Aşağıda olası sorunlar ve çözümler ya da geçici çözümler için devam eden çalışmaların olduğu sorunlar yer almaktadır:

  • Temel profil oluşturma işlemi, OnePlus cihazlar da dahil olmak üzere bazı cihazlardaki izin ayarları nedeniyle başarısız olabilir. Bu sorunu çözmek için Geliştirici Seçenekleri ayarlarında İzin izlemeyi devre dışı bırak seçeneğini kapatın.

  • Temel Profil oluşturma, Gradle tarafından yönetilen Test Lab cihazları da dahil olmak üzere Firebase Test Lab cihazlarında desteklenmez (285187547 numaralı sorun).

  • Kitaplıklar için temel profilleri başarıyla sağlamak üzere en az Baseline Profile Gradle eklentisi 1.2.3 veya AGP 8.3'ü kullanın (313992099 numaralı sorun).

  • ./gradlew app:generateBaselineProfile komutuyla temel profiller oluşturursanız test modülündeki karşılaştırmalar da çalıştırılır ve sonuçlar atılır. Bu durumda, komutu -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile ile çalıştırarak yalnızca Baseline Profilleri oluşturabilirsiniz. Bu sorun, AGP 8.2'de düzeltilmiştir.

  • Tüm derleme türleri için temel profiller oluşturma komutu ( ./gradlew app:generateBaselineProfile) yalnızca yayın derleme türü için temel profiller oluşturur. Bu sorun, AGP 8.1'de düzeltilmiştir.

  • Google Play Store dışındaki uygulama dağıtım kanalları, yükleme sırasında Temel Profiller'in kullanılmasını desteklemeyebilir. Bu kanallar üzerinden yüklenen uygulamaların kullanıcıları, arka planda dexopt çalıştırılana kadar avantajları görmez. Bu işlem genellikle gece yapılır.

  • Play Store dahili uygulama paylaşımı temel profilleri desteklemez ancak dahili test kanalı destekler.

  • Huawei cihazlar gibi bazı cihazlardaki pil optimizasyonları, profil yüklemeyi engelleyebilir. Profillerinizin etkili bir şekilde yüklendiğinden emin olmak için karşılaştırma testine tabi tuttuğunuz cihazlarınızdaki pil optimizasyonlarını devre dışı bırakın.

Ek kaynaklar