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.

Bir uygulamada veya kitaplıkta Temel Profil gönderdiğinizde Android Çalışma Zamanı (ART), belirtilen kod yollarını Önceden (AOT) derlemesi aracılığıyla optimize ederek her yeni kullanıcı ve her uygulama güncellemesi için performans iyileştirmeleri sağlayabilir. Bu Profil Rehberli Optimizasyon (PGO) özelliği, uygulamaların ilk lansmandan itibaren başlangıcı optimize etmesini, etkileşim olumsuzluğunu azaltmasını ve genel çalışma zamanı performansını iyileştirmesini sağlar.

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

Taban Profillerin Avantajları

Temel Profiller, uygulama başlatma, ekranlar arasında gezinme veya içerikte gezinme gibi tüm kullanıcı etkileşimlerini ilk kez çalıştırdıkları andan itibaren 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'luk performans artışını ölçmektedir.

Başlangıç profilleri

Başlangıç profilleri, Temel Profillere benzer ancak aralarındaki fark, cihaz üzerinde optimizasyon yerine derleme sırasında kullanılmalarıdı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 gerekir ve optimum bir Temel Profil sağlamak için birlikte bir araç zinciri olarak ç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ü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ıklardaki Temel Profilleri 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ı içeren uygulamalarda Temel Profiller, birincil .dex dosyası için doğru şekilde paketlenmiştir.

Profil oluşturma örneği

Aşağıda, uygulama başlatma işlemi için Temel Profil oluşturmaya yönelik bir örnek sınıf ve önerilen Macrobenchmark kitaplığını kullanarak çeşitli gezinme ve kaydırma etkinlikleri 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 örneklerimizin bir parçası olarak tam bağlamda ve daha ayrıntılı bir şekilde 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. Kayıt, giriş veya ödeme gibi akışların tamamını da toplayabilirsiniz. Kritik olarak kabul ettiğiniz tüm kullanıcı yolculukları, çalışma zamanı performansları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 kendi Temel Profillerini sağlayabilir ve uygulama performansını iyileştirmek için 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öntemlerin AOT derlenmesini gerçekleştirir, böylece bu yöntemler daha hızlı yürütülür. 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ış, Cloud Profiller toplamasıyla birlikte çalışarak uygulamanın zaman içindeki gerçek kullanımına göre performansta ince ayar yapar.

Şekil 1. Bu şema, yükleme ile son kullanıcı teslimi arasındaki Temel Profil iş akışını ve bu iş akışının Cloud Profilleri ile ilişkisini göstermektedir.

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, 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 tamamen dağıtılana kadar uygulama performansı yeni veya güncellenmiş uygulamaların kullanıcıları için optimum olmaz. Ayrıca Cloud Profiles yalnızca Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran Android cihazları destekler ve yalnızca yeterince geniş bir kullanıcı tabanına sahip olan uygulamalar için iyi ölçeklendirilir.

Android sürümlerindeki 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 durum, uygulamayı kullanmak için uzun bekleme süreleri, RAM ve disk alanı kullanımında artış, diskten kod yükleme süresinin uzamasına neden olarak baştan başlatma sürelerini artırabilir.
7'den 8.1'e kadar (API düzeyi 24'ten 27'ye) Kısmi AOT (Temel 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ını ve diskten kod yükleme süresini optimize ederek uygulamanın bekleme süresini kısaltır.
9 (API düzeyi 28) ve sonraki sürümler Kısmi AOT (Referans Değer + Bulut Profili) Play, APK'yı ve Cloud profillerini (varsa) optimize etmek için uygulama yüklemeleri sırasında Temel 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 gidermek 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ı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 Temel Profiller oluşturursanız test modülündeki karşılaştırmalar da çalışır ve sonuçlar silinir. 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 (./gradlew app:generateBaselineProfile) için Temel Profiller oluşturma komutu, sürüm derleme türü için yalnızca 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 Profillerin kullanımını desteklemeyebilir. Bu kanallar üzerinden yüklenen uygulamaların kullanıcıları, muhtemelen bir gecede arka planda kaldırma işlemi çalışana kadar avantajları görmezler.

  • 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ü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