Kitaplık yazarları için optimizasyon

Kitaplık yazarı olarak, uygulama geliştiricilerin son kullanıcılara yüksek kaliteli bir deneyim sunarken kitaplığınızı kolayca uygulamalarına entegre edebildiğinden emin olmanız gerekir. Kitaplığınızın ek kurulum olmadan Android optimizasyonuyla uyumlu olduğundan emin olmanız veya kitaplığın Android'de kullanıma uygun olmayabileceğini belgelemeniz gerekir.

Bu dokümanlar, yayınlanmış kitaplıkların geliştiricilerini hedef almakla birlikte büyük, modüler bir uygulamadaki dahili kitaplık modüllerinin geliştiricileri için de yararlı olabilir.

Uygulama geliştiriciyseniz ve Android uygulamanızı optimize etme hakkında bilgi edinmek istiyorsanız Uygulama optimizasyonunu etkinleştirme başlıklı makaleyi inceleyin. Hangi kitaplıkların kullanılmasının uygun olduğu hakkında bilgi edinmek için Kitaplıkları akıllıca seçin başlıklı makaleyi inceleyin.

Yansıtma yerine codegen kullanın

Mümkün olduğunda, yansıma yerine kod oluşturma (codegen) özelliğini kullanın. Kod oluşturma ve yansıma, programlama sırasında şablon koddan kaçınmak için kullanılan yaygın yaklaşımlardır ancak kod oluşturma, R8 gibi bir uygulama optimizasyon aracıyla daha uyumludur:

  • Kod oluşturma işleminde kod, derleme işlemi sırasında analiz edilir ve değiştirilir. Derleme zamanından sonra önemli bir değişiklik yapılmadığından, optimizatör nihai olarak hangi koda ihtiyaç duyulduğunu ve hangilerinin güvenli bir şekilde kaldırılabileceğini bilir.
  • Yansıtma ile kod, çalışma zamanında analiz edilir ve değiştirilir. Kod, yürütülene kadar gerçekten tamamlanmadığından optimizatör, hangi kodun güvenli bir şekilde kaldırılabileceğini bilemez. Bu işlem, çalışma zamanında yansıma yoluyla dinamik olarak kullanılan kodu kaldırır ve kullanıcılar için uygulama kilitlenmelerine neden olur.

Birçok modern kütüphane, yansıma yerine codegen kullanır. Room, Dagger2 ve diğer birçok platform tarafından kullanılan ortak bir giriş noktası için KSP'ye bakın.

Yansımanın kabul edildiği durumlar

Yansıma kullanmanız gerekiyorsa yalnızca aşağıdakilerden birine yansıtmanız gerekir:

  • Belirli hedeflenen türler (belirli arayüz uygulayıcılar veya alt sınıflar)
  • Belirli bir çalışma zamanı ek açıklamasını kullanan kod

Yansıtmayı bu şekilde kullanmak, çalışma zamanı maliyetini sınırlandırır ve hedeflenen tüketici tutma kuralları yazmanızı sağlar.

Bu belirli ve hedeflenmiş yansıtma biçimi, hem Android çerçevesinde (ör. etkinlikleri, görünümleri ve çizilebilir öğeleri şişirirken) hem de AndroidX kitaplıklarında (ör. WorkManager ListenableWorker'ları veya RoomDatabase'leri oluştururken) görebileceğiniz bir kalıptır. Buna karşılık, Gson'un açık uçlu yansıması Android uygulamalarında kullanıma uygun değildir.

Tüketici tutma kurallarını yazma

Kitaplıklar, uygulama saklama kurallarıyla aynı biçimi kullanan "tüketici" saklama kurallarını paketlemelidir. Bu kurallar, kitaplık yapılarına (AAR'lar veya JAR'lar) gruplandırılır ve kitaplık kullanıldığında Android uygulaması optimizasyonu sırasında otomatik olarak tüketilir.

AAR kitaplıkları

Bir AAR kitaplığı için tüketici kuralları eklemek üzere Android kitaplık modülünün derleme komut dosyasında consumerProguardFiles seçeneğini kullanın. Daha fazla bilgi için kitaplık modülü oluşturmayla ilgili yönergelerimize göz atın.

Kotlin

android {
    defaultConfig {
        consumerProguardFiles("consumer-proguard-rules.pro")
    }
    ...
}

Groovy

android {
    defaultConfig {
        consumerProguardFiles 'consumer-proguard-rules.pro'
    }
    ...
}

JAR kitaplıkları

Kuralları, JAR olarak dağıtılan Kotlin/Java kitaplığınızla birlikte paketlemek için kural dosyanızı herhangi bir dosya adıyla nihai JAR'ın META-INF/proguard/ dizinine yerleştirin. Örneğin, kodunuz <libraryroot>/src/main/kotlin içindeyse <libraryroot>/src/main/resources/META-INF/proguard/consumer-proguard-rules.pro konumuna bir tüketici kuralları dosyası koyun. Böylece kurallar, çıkış JAR'ınızda doğru konumda paketlenir.

Kuralların META-INF/proguard dizininde olup olmadığını kontrol ederek nihai JAR'ın kuralları doğru şekilde paketlediğini doğrulayın.

Farklı sıkıştırıcıları destekleme (gelişmiş)

Kuralları, belirli sıkıştırıcılara (R8 veya ProGuard) ve belirli sıkıştırıcı sürümlerine göre uyarlayabilirsiniz. Bu sayede kitaplığınız, yeni sıkıştırıcı sürümlerini kullanan projelerde optimum şekilde çalışırken mevcut kuralların eski sıkıştırıcı sürümlerine sahip projelerde kullanılmaya devam etmesine olanak tanır.

Hedeflenen sıkıştırma kurallarını belirtmek için bunları aşağıda açıklandığı gibi bir AAR veya JAR kitaplığının belirli konumlarına eklemeniz gerekir.

In an AAR library:
    consumer-proguard-rules.pro (legacy location)
    classes.jar
    └── META-INF
        └── com.android.tools (targeted shrink rules location)
            ├── r8-from-<X>-upto-<Y>/<R8-rules-file>
            └── proguard-from-<X>-upto-<Y>/<ProGuard-rules-file>

In a JAR library:
    META-INF
    ├── proguard/<ProGuard-rules-file> (legacy location)
    └── com.android.tools (targeted shrink rules location)
        ├── r8-from-<X>-upto-<Y>/<R8-rules-file>
        └── proguard-from-<X>-upto-<Y>/<ProGuard-rules-file>

Yani hedeflenen sıkıştırma kuralları, JAR dosyasının META-INF/com.android.tools dizininde veya AAR dosyasının classes.jar içindeki META-INF/com.android.tools dizininde depolanır.

Bu dizinin altında, dizinlerdeki kuralların hangi sıkıştırıcının hangi sürümleri için yazıldığını belirtmek üzere r8-from-<X>-upto-<Y> veya proguard-from-<X>-upto-<Y> biçiminde adlara sahip birden fazla dizin bulunabilir. -from-<X> ve -upto-<Y> bölümlerinin isteğe bağlı olduğunu, <Y> sürümünün özel olduğunu ve sürüm aralıklarının kesintisiz olması gerektiğini unutmayın.

Örneğin, r8-upto-8.0.0, r8-from-8.0.0-upto-8.2.0 ve r8-from-8.2.0 geçerli bir hedeflenen küçültme kuralı grubu oluşturur. r8-from-8.0.0-upto-8.2.0 dizinindeki kurallar, R8 tarafından 8.0.0 sürümünden 8.2.0 sürümüne kadar ancak 8.2.0 sürümünü dahil etmeden kullanılır.

Android Gradle eklentisi, bu bilgiler doğrultusunda eşleşen R8 dizinlerindeki kuralları seçer. Bir kitaplıkta hedeflenen sıkıştırma kuralları belirtilmezse Android Gradle eklentisi, kuralları eski konumlardan (AAR için proguard.txt veya JAR için META-INF/proguard/<ProGuard-rules-file>) seçer.