Temel Profillere genel bakış

Temel Profiller, dahil edilen kod yolları için yorumlama ve tam zamanında (JIT) derleme adımlarından kaçınarak ilk başlatmadan itibaren kod yürütme hızını 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 uygulama başlatma, ekranlar arasında gezinme veya içerikte gezinme gibi tüm kullanıcı etkileşimlerini daha sorunsuz hale getirir. Temel Profiller, bir uygulamanın hızını ve yanıt verme hızını artırarak günlük etkin kullanıcı sayısını ve ortalama geri gelen ziyaret oranını artırabilir.

Referans profilleri, ilk başlatmadan itibaren uygulama çalışma süresini iyileştiren yaygın kullanıcı etkileşimleri sağlayarak optimizasyona uygulama başlangıcından daha fazla yön verir. 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önderdiğinizde, uygulama optimizasyonları yalnızca Bulut Profilleri'ne güvenmekten çok daha hızlı bir şekilde kullanıma sunulur.

Temel Profil kullanılmadığında, tüm uygulama kodları yorumlandıktan sonra bellekte JIT tarafından 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ından yeni kod yolları optimize edilene kadar ideal 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 karşılaşılan 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 Profili 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 aşağıdaki desteklenen veya Android Gradle eklentisi, Macrobenchmark kitaplığı ve Profil Yükleyici'nin daha yüksek 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 grup dizin desteği (kitaplık modülleri): Birden fazla Temel Profil kaynak dosyası bildirin ve artık kitaplık modüllerinin yanı sıra uygulama modülleri için de src/free/generated/baselineProfiles/baseline-prof1.txt gibi varyantlara duyarlı dizinler 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: DEX'teki kod düzenini bildirmek için bu yeni Temel Profil türünü oluşturur. Başlatma performansını yaklaşık %15 oranında daha artırır veya büyük uygulamalarda bu oran çok daha yüksektir.
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.
  • Temel Profiller, bir uygulama paketinden APK oluştururken doğru şekilde paketlenmiştir (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 Temel Profilleri kullanırken uygulama başlangıç 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ı 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 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 veya gecikmenin önemli olduğu yaygın kullanıcı etkileşimlerini kapsamak için Temel Profilleri tanımlamayı düşünebilirsiniz. İş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 Google Play Store tarafından toplanan ve yükleme zamanı derlemesi için dağıtılan ek bir PGO formu sunar.

Cloud Profilleri, uygulamayla gerçek dünyadaki kullanıcı etkileşimlerine dayalı olarak belirlense de bir güncellemenin dağıtılmasından sonra birkaç saat ila birkaç gün sürer. Bu da kullanılabilirliklerini 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 uygulamalar için iyi ölçeklenir.

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

Android Platform sürümleri farklı uygulama derleme yaklaşımları kullanır. Bu yaklaşımların performans dengesi önemlidir. 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üresini ve disk alanını optimize ederek uygulamanın bekleme süresini azaltı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 Cloud Profili olarak sağlanır.

Bilinen sorunlar

Aşağıda, olası sorunlar ve çözümler ya da geçici çözümler için geliştirmelerin devam ettiği 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 çözmek için Geliştirici Seçenekleri ayarlarında İzin izlemeyi devre dışı bırak seçeneğini devre dışı bırakın.

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

  • Kitaplıklara Temel Profilleri başarıyla sağlamak için en az Temel Profil Gradle eklentisi 1.2.3 veya AGP 8.3 sürümünü kullanın (sorun numarası: 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. Böyle bir 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ı bu özelliği destekler.

  • Huawei cihazlar gibi bazı cihazlardaki pil optimizasyonları, profil yüklenmesini etkileyebilir. 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