Temel Profillere genel bakış

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

Uygulama veya kitaplıkta temel profil sunulduğunda Android Çalışma Zamanı (ART), önceden (AOT) derleme aracılığıyla belirtilen kod yollarını optimize ederek her yeni kullanıcı ve her uygulama güncellemesi için performans iyileştirmeleri sağlayabilir. Bu Profile Guided Optimization (PGO), uygulamaların ilk başlatmadan itibaren kullanıcılar için başlatmayı optimize etmesine, etkileşim takılmasını azaltmasına ve genel çalışma zamanı performansını iyileştirmesine olanak tanır.

Bu performans iyileştirmeleri, kullanıcıları elde tutma, işlemler ve puanlar gibi işletme metriklerinin doğrudan iyileşmesini sağlar. Performansın işletme metriklerini nasıl etkilediği hakkında daha fazla bilgiyi Josh, Lyft, TikTok ve Zomato'nun hikayelerinde bulabilirsiniz.

Temel Profiller'in avantajları

Temel Profiller; uygulama başlatma, ekranlar arasında gezinme veya içerikte gezinme gibi kritik kullanıcı etkileşimlerinde kodun önceden derlenmesini sağlayarak ilk çalıştırmadan itibaren daha sorunsuz hale getirir. Temel Profiller, uygulamanın hızını ve yanıt verme süresini artırarak günlük etkin kullanıcı sayısını ve ortalama geri gelen ziyaretçi oranını yükseltebilir.

Temel Profiller, ilk başlatmadan itibaren uygulama çalışma süresini iyileştiren yaygın 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. Sürümleri Baseline Profile ile yayınladığınızda, uygulama optimizasyonları yalnızca Cloud Profiles'a güvenmekten çok daha hızlı bir şekilde kullanılabilir hale gelir.

Baseline Profile kullanılmadığında tüm uygulama kodu, yorumlandıktan sonra bellekte JIT derlenir veya cihaz boştayken arka planda bir odex dosyasına yazılır. Kullanıcılar, bir uygulamayı yükledikten veya güncelledikten sonra, uygulamayı ilk kez çalıştırdıkları andan yeni kod yolları optimize edilene kadar ideal olmayan bir deneyim yaşarlar. Birçok uygulama, optimizasyondan sonra yaklaşık% 30 performans artışı ölçer.

Başlangıç profilleri

Başlangıç profilleri, Temel Profillere benzer ancak cihaz üzerinde optimizasyon yerine daha hızlı başlangıç süreleri için DEX düzenini optimize etmek amacıyla derleme zamanında kullanılır. Başlangıç profillerinin temel profillerden farkı hakkında daha fazla bilgi edinmek için Temel Profiller ile Başlangıç Profillerini Karşılaştırma başlıklı makaleyi inceleyin. DEX düzeni optimizasyonu hakkında daha fazla bilgi 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 Profiller Oluşturma başlıklı makaleyi inceleyin.

Profil oluşturma ve yayınlanan derlemeler

Baseline ve başlangıç profili dosyalarını (ör. baseline-prof.txt ve startup-prof.txt) oluştururken gereken derleme yapılandırmaları ile bu profilleri kullanan nihai sürüm APK'nızı oluştururken gereken derleme yapılandırmaları arasındaki farkı anlamak önemlidir.

Profil dosyaları (ör. benchmark) oluşturulurken:

Testle Temel Profil yakalarken uygulamanızın kodu karartılmamalıdır. Oluşturulan profil kurallarının kodunuzun yöntem imzalarıyla tam olarak eşleştiğinden emin olmak için profil oluşturma amacıyla kullanılan derleme değişkeninde kod karartma ve optimizasyonu (R8) devre dışı bırakmanız gerekir. Bu derleme değişkeni, kod karartma ve optimizasyonun etkinleştirildiği yayınlanan derleme değişkeninizden farklı olmalıdır. Bunu, profil oluşturma derleme değişkeni için isMinifyEnabled = false değerini ayarlayarak yapabilirsiniz. Baseline Profile Gradle eklentisini kullanmıyorsanız -dontobfuscate ve -dontoptimize'nin de uygulandığından emin olmanız gerekir. Baseline Profile Gradle eklentisi, bu yapılandırmayı sizin için otomatik olarak gerçekleştirir.

Oluşturulan metin profili dosyanızı (ör. baseline-prof.txt) açıp sınıf ve yöntem adlarının gizlenmediğini kontrol ederek profil oluşturma sırasında uygulamanızın gizlenmediğini doğrulayabilirsiniz.

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

Sürüm uygulamanızı oluştururken uygulamanızın kod karartma işleminden geçirilmesi gerekir. Yayınlanan derlemenizde kod karartma, sadeleştirme ve optimizasyondan yararlanmak için isMinifyEnabled = true olmalıdır. R8, kodları gizlenmemiş profil dosyalarınızdaki kuralları, sürüm APK'nızdaki gizlenmiş ve optimize edilmiş kodla eşleşecek şekilde otomatik olarak yeniden yazar. Derleme, kuralları doğru şekilde dönüştürerek gizlenmemiş metin dosyasından yararlanır.

Başlangıç profilleri tarafından yönlendirilen DEX düzeni optimizasyonunun çalışmasını istiyorsanız yayın uygulamanızın kodlarının gizlenmesi ve tüm optimizasyonlar etkinleştirilmiş şekilde R8 kullanılması gerekir.

Gelişmiş (Gradle olmayan) iş akışları:

Profillerinizi oluşturmak için gelişmiş, Gradle olmayan bir iş akışı (ör. Bazel, Buck veya özel CI otomasyon ardışık düzenleri) kullanıyorsanız aynı ilkeleri uygulamanız gerekir. Profil yakalanırken uygulamanızın kodu gizlenmemeli veya optimize edilmemelidir. Ancak yayın uygulamanızı oluştururken kod karartma yapmanız gerekir. R8, gizlenmemiş metin kuralları dosyasını işler ve kuralları, gizlenmiş sürüm uygulamasına uygulanacak şekilde doğru şekilde dönüştürür.

Bağımlılık zinciri, kararlı ve geliştirme aşamasındaki yayınlanan sürümleri sağlar. Temel profil oluşturmak ve 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 bir Temel Profil sağlamak 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.5.0
  • Profil Yükleyici: androidx.profileinstaller:profileinstaller:1.4.1

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

AGP sürümü Özellikler
9.1 Tam kaynak grubu dizini desteği (kitaplık modülleri): Varyantları algılayan dizinlere ek olarak, uygulama modüllerinin yanı sıra kitaplık modülleri için de src/free/generated/baselineProfiles/baseline-prof1.txt gibi rastgele bir ada sahip birden fazla Baseline Profile kaynak dosyası tanımlayabilirsiniz.
8.4 Gradle sarmalayıcı komut satırı aracını veya Android Studio'yu kullanarak hata ayıklanamayan derlemelerin yerel uygulama yüklemeleri, Temel Profilleri yükler. Böylece yerel yayınlanan derlemenizin performansı, üretimle daha uyumlu olur. Bu güncelleme, Temel Profiller'in üretim performansını etkilemez.
8.3
  • Kısmi kaynak grubu dizini desteği (kitaplık modülleri): Kitaplık modülleri için varyantları dikkate alan Baseline Profile dosyaları (ör. src/free/generated/baselineProfiles/baseline-prof.txt) tanımlayın.
  • Temel profiller, desugaring uygulanmış sınıflar içerir.
8.2
  • R8 kuralları yeniden yazma: D8 ve R8, uygulama performansını optimize etmek için ihtiyacınız olan tüm kuralları tam olarak yakalamak üzere insanlar tarafından okunabilen Baseline ve Startup Profile kurallarını dönüştürebilir. Bu sayede, sadeleştirilmemiş bir derlemeden profiller oluşturabilir ve bunları sadeleştirilmiş bir yayınlanan derlemeye 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 tür bir temel profil oluşturun. Başlatma performansını yaklaşık %15 daha artırır. Büyük uygulamalarda bu oran çok daha yüksektir.
8.0 Önerilen minimum sürüm: Tek bir Gradle göreviyle Baseline Profile 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ı tanımlayın ve src/free/generated/baselineProfiles/baseline-prof1.txt gibi varyanta 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.
  • Temel Profiller, bir uygulama paketinden APK oluşturulurken 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.

Varyant uyumlu profil kaynağı ayarları

Uygulamalar için Android Gradle eklentisi (AGP) 8.0 sürümünü ve kitaplıklar için AGP 8.3 sürümünü kullanarak Temel Profil kurallarını özel bir kaynak grubu dizinine yerleştirebilir, tek bir sabit yolun (ör. src/main/baseline-prof.txt) kısıtlamalarının ötesine geçebilir ve birden fazla dosyayı etkinleştirebilirsiniz.

Bu sayede, belirli derleme varyantlarına ve türlerine göre uyarlanmış farklı Baseline Profilleri tanımlayabilirsiniz (ör. src/variant/baselineProfiles/ gibi dizinleri kullanarak). Bu sayede, performans optimizasyonu kuralları her benzersiz uygulama veya kitaplık ikili dosyası için tam olarak uygulanır.

Profil oluşturma örneği

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

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

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

                // Find and click elements using the new DSL
                onElement { textAsString() == "COMPOSE LAZYLIST" }.click()
                onElement { viewIdResourceName == "myLazyColumn" }.also {
                    it.fling(Direction.DOWN)
                    it.fling(Direction.UP)
                }
                pressBack()
            }
        }
    }
}

Kullanıcı yolculuklarını otomatikleştirmek için UI Automator kitaplığını kullanma hakkında daha fazla bilgi edinmek isterseniz UI Automator ile otomatik testler yazma başlıklı makaleyi inceleyin.

Bu kodun tamamını ve daha ayrıntılı bilgiyi GitHub'daki performans örneklerimizde bulabilirsiniz.

Dahil edilecek bilgiler:

Bir uygulamada Baseline Profiles kullanırken uygulama başlatma kodunu ve ekranlar arasında gezinme veya kaydırma gibi yaygın kullanıcı etkileşimlerini ekleyebilirsiniz. Ayrıca kayıt, giriş veya ödeme gibi tüm akışları da toplayabilirsiniz. Kritik olduğunu düşündüğünüz tüm kullanıcı yolculukları, çalışma zamanı performanslarını iyileştirerek Temel Profiller'den yararlanabilir.

Performansı artırmak için farklı yaklaşımlar deniyorsanız denemenizin her iki koluna da Baseline Profiles'ı dahil etmeyi düşünebilirsiniz. Bunu yaparak tüm kullanıcılarınızın tutarlı bir şekilde derlenmiş kod ç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ı sürümlerle 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 Baseline Profiles tanımlamayı düşünün. Bunların nasıl çalıştığı aşağıda açıklanmıştır:

  1. Uygulamanız için insanlar tarafından okunabilen profil kuralları oluşturulur ve uygulamada ikili biçimde derlenir. Bunları assets/dexopt/baseline.prof dizininde bulabilirsiniz. Ardından, Android App Bundle'ı (AAB) 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 sayede bu yöntemler daha hızlı yürütülür. Profilde, uygulama başlatma veya kare oluşturma sırasında kullanılan yöntemler varsa kullanıcı daha hızlı başlatma süreleri ve daha az takılma yaşayabilir.

  3. Bu akış, uygulamanın zaman içindeki gerçek kullanımına göre performansı hassas bir şekilde ayarlamak 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 Profiles ile ilişkisi gösterilmektedir.

Temel profiller ile başlangıç profillerini karşılaştırma

Profil dosyalarını tanımlamak ve oluşturmak için Baseline Profile Gradle eklentisini kullanırsınız. Bu eklenti, derleme sürecine bağlanır ve AGP, bu okunabilir profil kurallarını ikili biçime derler.Bu biçim, APK veya AAB içinde baseline.prof olarak paketlenir ve 1,5 MB'tan küçük olması koşuluyla ART tarafından cihaz üzerinde derleme için etkili bir şekilde kullanılabilir.

Oluşturulan bu profil dosyaları genellikle startup-prof.txt ve baseline-prof.txt olarak adlandırılır. Özellikle başlangıç aşamasına odaklanıyorsanız içerikleri bazen benzer görünse de farklı amaçlara hizmet ederler ve performansı farklı aşamalarda etkilerler:

temel profil

Temel Profil dosyası, Android Çalışma Zamanı'nın (ART) sık kullanılan kod yollarını önceden derlemek için kullandığı kapsamlı bir kural grubu içerir. Bu sayede, uygulama performansı yalnızca başlatma sırasında değil, her zaman optimize edilir.

Temel profil dosyası genellikle başlangıç profilinizde bulunan kuralların bir üst kümesidir. Bu dosya, uygulama başlatma optimizasyonu için gereken tüm kuralları (baselineProfile Gradle görevi aracılığıyla oluşturulur) ve diğer kritik kullanıcı yolculukları için ek profilleri içerir. Örneğin, kaydırma ve farklı ekranlarda gezinme.

Bu ek, başlangıç dışı kurallar, includeInStartupProfile yapılandırma alanının değerinden bağımsız olarak oluşturulur.

Startup Profili

Başlangıç Profili dosyası, uygulamanızın başlangıç yolu için özel olarak optimize edilmiş kurallar içerir. Derleme sırasında D8, Java bayt kodunu DEX biçimine dönüştürür. R8 daha sonra bu dosyayı kullanarak DEX dosyalarınızın düzenini etkiler ve kritik başlangıç kodunun daha hızlı yürütülmesi için birincil DEX dosyasına yerleştirilmesini sağlar. Genellikle includeInStartupProfile değerini yalnızca uygulamanın ilk gösterimi için gerekli olan test senaryolarında true olarak ayarlamanız gerekir. Daha fazla bilgi için Başlangıç Profilleri Oluşturma başlıklı makaleyi inceleyin.

Cloud Profiles

Cloud Profilleri, Temel Profiller ile birlikte Google Play Store tarafından toplanan ve yükleme sırasında derleme için dağıtılan ek bir PGO biçimi sunar.

Cloud profilleri, uygulamanın gerçek kullanıcı etkileşimlerine göre oluşturulur. Ancak bir güncellemeden sonra dağıtılmaları birkaç saat ila birkaç gün sürebilir. Bu durum, profillerin kullanılabilirliğini sınırlar. Profiller tam olarak dağıtılana kadar uygulama performansı, yeni veya güncellenmiş uygulamaların kullanıcıları için ideal düzeyde olmaz. Ayrıca Cloud Profilleri yalnızca Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran Android cihazları destekler ve yalnızca yeterince büyük bir kullanıcı tabanına sahip uygulamalar için iyi ölçeklenir.

Android sürümlerinde derleme davranışı

Android platformu sürümleri, her biri farklı bir performans dengesine sahip farklı uygulama derleme yaklaşımları kullanır. Temel Profiller, tüm yüklemeler için bir profil sağlayarak önceki derleme yöntemlerini iyileş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 edilir. Bu da uygulamanın kullanılabilmesi için uzun bekleme sürelerine, RAM ve disk alanı kullanımının artmasına ve kodun diskten yüklenmesinin daha uzun sürmesine neden olarak sıfırdan başlatma sürelerini uzatabilir.
7 ila 8.1 (API düzeyi 24 ila 27) Kısmi AOT (Temel Profil) Temel Profiller, uygulama modülü bu bağımlılığı tanımladığında ilk çalıştırmada androidx.profileinstaller tarafından yüklenir. ART, uygulama kullanımı sırasında ek profil kuralları ekleyerek ve cihaz boştayken bunları derleyerek bu süreyi daha da kısaltabilir. Bu sayede disk alanı ve kodun diskten yüklenme süresi optimize edilir. Böylece uygulamanın bekleme süresi azalır.
9 (API düzeyi 28) ve sonraki sürümler Kısmi AOT (Temel + Bulut Profili) Play, uygulama yüklemeleri sırasında APK'yı ve varsa bulut profillerini optimize etmek için temel profilleri kullanır. Yükleme işleminden sonra ART profilleri Google Play'e yüklenir, birleştirilir ve ardından uygulamayı yükleyen veya güncelleyen diğer kullanıcılara bulut profilleri olarak sunulur.

Bilinen sorunlar

Olası sorunlar ve çözümleri veya geçici çözümler için devam eden gelişmelerin olduğu sorunlar aşağıda verilmiştir:

  • Baseline Profile 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.

  • Kitaplıklar için Baseline Profile'ları başarıyla sağlamak istiyorsanız en az Baseline Profile Gradle eklentisi 1.2.3 veya AGP 8.3 kullanın (sorun #313992099).

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

  • Tüm derleme türleri için temel profil oluşturma komutu (./gradlew app:generateBaselineProfile), yalnızca yayınlanan derleme türü için temel profil 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 (büyük olasılıkla gece boyunca) avantajları görmez.

  • Google Play Store dahili uygulama paylaşımı, Temel Profilleri desteklemez ancak dahili test kanalı destekler.

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

Ek kaynaklar

Sizin için önerilenler