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ırlar 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, kitaplık derlemeyi genellikle 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.
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ı R8 sürümlerini destekleme (gelişmiş)
Kuralları, R8'in belirli sürümlerini hedefleyecek şekilde uyarlayabilirsiniz. Bu sayede kitaplığınız, daha yeni R8 sürümlerini kullanan projelerde optimum şekilde çalışırken mevcut kuralların eski R8 sürümlerine sahip projelerde kullanılmaya devam etmesine olanak tanır.
Hedeflenen R8 kurallarını belirtmek için bunları bir AAR'ın classes.jar
içindeki META-INF/com.android.tools
dizinine veya JAR'ın META-INF/com.android.tools
dizinine eklemeniz gerekir.
In an AAR library:
proguard.txt (legacy location, the file name must be "proguard.txt")
classes.jar
└── META-INF
└── com.android.tools (location of targeted R8 rules)
├── r8-from-<X>-upto-<Y>/<R8-rule-files>
└── ... (more directories with the same name format)
In a JAR library:
META-INF
├── proguard/<ProGuard-rule-files> (legacy location)
└── com.android.tools (location of targeted R8 rules)
├── r8-from-<X>-upto-<Y>/<R8-rule-files>
└── ... (more directories with the same name format)
META-INF/com.android.tools
dizininde, kuralların hangi R8 sürümleri için yazıldığını belirten r8-from-<X>-upto-<Y>
biçiminde adlara sahip birden fazla alt dizin olabilir. Her alt dizinde, R8 kurallarını içeren bir veya daha fazla dosya (herhangi bir dosya adı ve uzantısı ile) 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 genellikle kesintisiz olduğunu ancak örtüşebileceğini unutmayın.
Örneğin, r8
, r8-upto-8.0.0
, r8-from-8.0.0-upto-8.2.0
ve r8-from-8.2.0
, hedeflenen bir R8 kuralları grubunu temsil eden dizin adlarıdır.
r8
dizinindeki kurallar tüm R8 sürümleri tarafından kullanılabilir. 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ılabilir.
Android Gradle eklentisi, mevcut R8 sürümü tarafından kullanılabilecek tüm kuralları seçmek için bu bilgileri kullanır. Bir kitaplıkta hedeflenen R8 kuralları belirtilmezse Android Gradle eklentisi, kuralları eski konumlardan (AAR için proguard.txt
veya JAR için META-INF/proguard/<ProGuard-rule-files>
) seçer.