Temel Profillere genel bakış

Temel profiller, dahil edilen kod yolları için yorumlama ve tam zamanında (JIT) derleme adımlarından kaçınarak kod yürütme hızını ilk çalıştırmaya kıyasla yaklaşık% 30 artırır.

Android Runtime (ART), bir uygulamada veya kitaplıkta Temel Profil göndererek önceden derleme (AOT) 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 Profil Kılavuzlu Optimizasyon (PGO), uygulamaların başlangıcı optimize etmesine, etkileşimdeki takılmaları azaltmasına ve ilk başlatmadan itibaren kullanıcılar için genel çalışma zamanı performansını artırmasına olanak tanır.

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

Taban Profillerin Avantajları

Referans profilleri, uygulamanın ilk kez çalıştırıldığı andan itibaren tüm kullanıcı etkileşimlerini (ör. uygulamanın başlatılması, ekranlar arasında gezinme veya içerikte gezinme) daha sorunsuz hale getirir. Referans profilleri, bir uygulamanın hızını ve duyarlılığını artırarak günlük etkin kullanıcı sayısını ve ortalama yeniden ziyaret oranını artırabilir.

Referans profilleri, uygulamanın ilk çalıştırıldığı andan itibaren uygulama çalışma süresini iyileştiren yaygın kullanıcı etkileşimleri sağlayarak optimizasyona uygulama başlatılmasının ötesinde rehberlik eder. Rehberli AOT derlemesi, kullanıcı cihazlarına bağlı değildir ve mobil cihaz yerine geliştirme makinesi üzerinde sürüm başına bir kez yapılabilir. Temel Profil ile sürümleri göndererek uygulama optimizasyonları, yalnızca Bulut Profilleri'ne güvenmekten çok daha hızlı bir şekilde kullanılabilir hale gelir.

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

Başlangıç profilleri

Başlangıç profilleri, temel profillere benzer ancak cihaz üzerinde optimizasyon için değil, derleme zamanında kullanılır. Başlangıç profilleri, DEX dosyasının düzenini optimize ederek başlatma sürelerini kısaltmak için 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şlatılırken sayfa hatası sayısını azaltarak başlatma sürelerini iyileştirir. Başlangıç profillerinin ve DEX düzen optimizasyonlarının uygulama başlatma sürelerini nasıl iyileştirebileceği hakkında daha fazla bilgi edinmek için DEX düzen optimizasyonları ve başlangıç profilleri başlıklı makaleyi inceleyin.

Başlayın

Mevcut uygulamanızdaki performansı optimize etmeye başlamak için Referans Profilleri Oluşturma başlıklı makaleyi inceleyin.

Bağımlılık zinciri, kararlı ve geliştirme sürümleri sağlar. Temel profil oluşturmak ve yüklemek için Android Gradle eklentisi, Macrobenchmark kitaplığı ve Profil Yükleyici'nin aşağıdaki desteklenen sürümlerini veya daha yeni sürümlerini kullanın. Bu bağımlılıklar farklı zamanlarda gereklidir ve en uygun referans profilini etkinleştirmek için bir araç zinciri olarak birlikte çalışır.

  • Android Gradle eklentisi: com.android.tools.build:8.0.0
  • Makro karşılaştırma kitaplığı: androidx.benchmark:benchmark-macro-junit4:1.3.3
  • Profil Yükleyici: androidx.profileinstaller:profileinstaller:1.4.1

Referans profilleri oluşturmak ve yönetmek için AGP'nin en son sürümünü kullanmanızı öneririz. AGP'nin farklı sürümleriyle birlikte sunulan temel işlevler şunlardır:

AGP sürümü Özellikler
8.4 Gradle sarmalayıcı komut satırı aracı veya Android Studio'nun temel profillerini kullanarak hata ayıklama yapılamayan derlemelerin yerel uygulama yüklemeleri. Böylece yerel sürüm derlemenizin performansı üretime daha yakın olur. Bu güncelleme, referans profillerin üretim performansını etkilemez.
8.3
  • Tam kaynak kümesi dizini desteği (kitaplık modülleri): Birden fazla temel profil kaynak dosyası tanımlayın ve artık uygulama modüllerinin yanı sıra kitaplık modülleri için de src/free/generated/baselineProfiles/baseline-prof1.txt gibi varyant bilinçli dizinleri kullanın.
  • Temel profiller, şeker içermeyen sınıfları içerir.
8.2
  • Kuralların R8 ile yeniden yazılması: D8 ve R8, uygulama performansını optimize etmek için ihtiyaç duyduğunuz tüm kuralları tam olarak yakalamak amacıyla, kullanıcı tarafından okunabilen temel ve başlangıç profili kurallarını dönüştürebilir. Yöntemlerin Temel Profil kapsamını yaklaşık% 30, uygulama performansını ise yaklaşık %15 artırır.
  • Başlangıç Profilleri: Bu yeni referans profili türünü oluşturarak DEX'deki kod düzenini bildirebilirsiniz. Başlatma performansını yaklaşık %15 oranında daha artırır veya büyük uygulamalarda bu oran çok daha yüksek olabilir.
8.0 Önerilen minimum sürüm: Tek bir Gradle göreviyle temel profil oluşturmak için temel profil Gradle eklentisini kullanın.
  • Tam kaynak kümesi dizini desteği (uygulama modülleri): Birden fazla temel profil kaynak dosyası tanımlayın ve src/free/generated/baselineProfiles/baseline-prof1.txt gibi varyant bilinçli dizinler kullanın.
7.4 Desteklenen minimum sürüm: Uygulamalar, kitaplıklardan Temel Profiller kullanabilir ve src/main/baseline-prof.txt dosyasında kendi Temel Profillerini sağlayabilir.
  • APK, uygulama paketinden oluşturulurken temel profiller doğru şekilde paketlenir (sorun #230361284).
  • Birden fazla .dex dosyası olan uygulamalarda, temel profiller birincil .dex dosyası için doğru şekilde paketlenir.

Profil oluşturma örneği

Aşağıda, uygulama başlatma için bir referans profili oluşturmanın yanı sıra önerilen Macrobenchmark kitaplığını kullanarak çeşitli gezinme ve kaydırma etkinlikleri oluşturmak için kullanılabilecek ö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, GitHub'daki performans örneklerimiz kapsamında tam bağlamında ve daha ayrıntılı olarak görebilirsiniz.

Dahil edilecek bilgiler:

Bir uygulamada referans profilleri kullanırken uygulama başlatma kodu 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 olduğunu düşündüğünüz tüm kullanıcı yolculukları, çalışma zamanı performansını iyileştirerek temel profillerden yararlanabilir.

Performansı artırmak için farklı yaklaşımları denemeye çalışıyorsanız denemenizin her iki kolu için de referans profilleri ekleyebilirsiniz. Bu sayede, tüm kullanıcılarınızın sürekli olarak derlenmiş kod çalıştırmasını sağlayarak sonuçlarınızın yorumlanmasını kolaylaştırabilirsiniz.

Kitaplıklar, uygulama performansını iyileştirmek için kendi referans profillerini sağlayabilir ve bunları sürümlerle birlikte gönderebilir. Örneğin, Jetpack Compose performansında referans 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 veya gecikmenin önemli olduğu yaygın kullanıcı etkileşimlerini kapsayacak şekilde referans profilleri tanımlayabilirsiniz. İşleyiş şekli:

  1. Kullanıcı tarafından okunabilen profil kuralları, uygulamanız için oluşturulur ve uygulamada ikili biçimde derlenir. Bu kuralları assets/dexopt/baseline.prof içinde 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. ART, yükleme sırasında profildeki yöntemleri AOT derleyerek bu yöntemlerin daha hızlı yürütülmesini sağlar. Profilde, uygulama başlatılırken 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 performansta ince ayar yapmak için Cloud Profiles toplama özelliğiyle birlikte çalışır.

Şekil 1. Bu şema, yükleme işleminden son kullanıcıya yayınlama işlemine kadar olan temel profil iş akışını ve bu iş akışının Cloud Profilleriyle olan ilişkisini gösterir.

Cloud Profilleri

Cloud Profilleri, Temel Profiller ile birlikte ek bir PGO biçimi sunar. Bu biçim, Google Play Store tarafından toplanır ve yükleme süresi derlemesi için dağıtılır.

Cloud profilleri, kullanıcıların uygulamayla gerçek dünyadaki etkileşimlerine dayanır. Ancak bir güncellemenin dağıtılması birkaç saat ile birkaç gün arasında sürebilir. Bu da profillerin kullanılabilirliğini sınırlandırır. Profiller tam olarak dağıtılana kadar yeni veya güncellenmiş uygulamaların kullanıcıları için uygulama performansı en uygun düzeyde olmaz. Ayrıca Cloud Profiller 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ı olan uygulamalarda iyi ölçeklenir.

Android sürümleri arasındaki derleme davranışı

Android Platform sürümleri, her biri karşılık gelen bir performans dengesi olan 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 uygulamayı kullanmaya başlamak için uzun bekleme sürelerine, RAM ve disk alanı kullanımının artmasına ve diskten kod yükleme süresinin uzamasına neden olur. Bu da soğuk başlatma sürelerinin uzamasına neden olabilir.
7 ila 8.1 (API düzeyi 24 ila 27) Kısmi AOT (Referans Profil) Temel profiller, uygulama modülü bu bağımlılığı tanımladığında ilk çalıştırma sırasında androidx.profileinstaller tarafından yüklenir. ART, uygulama kullanılırken ek profil kuralları ekleyerek ve cihaz boştayken bunları derleyerek bu durumu daha da iyileştirebilir. Bu, disk alanından kod yükleme süresi için optimize edilir ve böylece uygulamanın bekleme süresi azaltılır.
9 (API düzeyi 28) ve sonraki sürümler Kısmi AOT (Referans Değer + Bulut Profili) Play, APK ve Cloud profillerini (varsa) optimize etmek için uygulama yükleme sırasında referans profilleri kullanır. Yükleme işleminden sonra ART profilleri Play'e yüklenir, birleştirilir ve ardından uygulamayı yükleyen veya güncelleyen diğer kullanıcılara Bulut Profili olarak sağlanır.

Bilinen sorunlar

Aşağıda, olası sorunlar ve çözümler ya da geçici çözümler için devam eden geliştirmeler olan sorunlar verilmiştir:

  • OnePlus cihazlar da dahil olmak üzere bazı cihazlardaki izin ayarları nedeniyle temel profil oluşturma işlemi başarısız olabilir. Bu sorunu önlemek 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 (sorun #285187547).

  • Kitaplıklar için Temel Profilleri başarıyla sağlamak amacıyla en azından Temel Profil Gradle eklentisi 1.2.3 veya AGP 8.3'ü kullanın (sorun #313992099).

  • ./gradlew app:generateBaselineProfile komutuyla referans profilleri 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 temel profilleri 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 sürüm 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 profillerin kullanılmasını desteklemeyebilir. Bu kanallar üzerinden yüklenen uygulamaların kullanıcıları, arka planda dexopt çalıştırılana kadar (muhtemelen gece boyunca) avantajlardan yararlanamaz.

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

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

Ek kaynaklar