Kitaplık yazarı olarak, uygulama geliştiricilerin son kullanıcılara yüksek kaliteli bir deneyim sunarken kitaplığınızı uygulamalarına kolayca 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 sayesinde kod, çalışma zamanında analiz edilir ve değiştirilir. Kod, yürütülene kadar gerçekten tamamlanmadığından optimizasyon aracı, 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 ve kullanıcıların uygulamalarının kilitlenmesine neden olan kodu büyük olasılıkla kaldırır.
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ı 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
içine 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.
AAR kitaplığı derlemesini optimize etme (gelişmiş)
Kitaplık derleme sırasında yapılabilecek optimizasyonlar çok sınırlı olduğundan, genellikle kitaplık derlemeyi doğrudan optimize etmemelisiniz. R8, yalnızca bir kitaplık uygulamanın bir parçası olarak dahil edildiğinde, kitaplığın tüm yöntemlerinin nasıl kullanıldığını ve hangi parametrelerin iletildiğini bilebilir. Kitaplık geliştiricisi olarak, kitaplığı optimize etmeden önce optimizasyonun birden fazla aşamasını değerlendirmeniz ve hem kitaplık hem de uygulama oluşturma zamanında davranışı korumanız gerekir.
Yine de kitaplığınızı derleme sırasında optimize etmek istiyorsanız bu işlem Android Gradle Eklentisi tarafından desteklenir.
Kotlin
android { buildTypes { release { isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } configureEach { consumerProguardFiles("consumer-rules.pro") } } }
Groovy
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } configureEach { consumerProguardFiles "consumer-rules.pro" } } }
proguardFiles
'ün davranışının consumerProguardFiles
'ten çok farklı olduğunu unutmayın:
proguardFiles
, kitaplık oluşturma sırasında kitaplığınızın hangi bölümünün tutulacağını tanımlamak için genelliklegetDefaultProguardFile("proguard-android-optimize.txt")
ile birlikte derleme zamanında kullanılır. Bu, en azından herkese açık API'nizdir.consumerProguardFiles
ise kitaplığınıza dahil edilir ve daha sonra kitaplığınızı kullanan bir uygulamanın derlenmesi sırasında hangi optimizasyonların yapılacağını etkiler.
Örneğin, kitaplığınız dahili sınıflar oluşturmak için yansıma kullanıyorsa tutma kurallarını hem proguardFiles
hem de consumerProguardFiles
içinde tanımlamanız gerekebilir.
Kitaplığınızın derlemesinde -repackageclasses
kullanıyorsanız sınıfları kitaplığınızın paketinin içinde bir alt pakete yeniden paketleyin. Örneğin, -repackageclasses 'internal'
yerine -repackageclasses 'com.example.mylibrary.internal'
kullanı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.