Çok sayıda modül içeren projelerde, net bir proje yapısını korumaya çalışırken Android kitaplıklarını kullanıcılarınıza dağıtmak zor olabilir. Çoğu durumda, amaçlanandan çok daha fazla kitaplığın yayınlanması gerekir.
Android Gradle eklentisiyle birlikte sunulan Fused Library eklentisi, birden fazla Android kitaplığı modülünü tek bir yayınlanabilir Android kitaplığında paketlemeye yardımcı olur. Bu sayede, kitaplığınızın kaynak kodunu ve kaynaklarını derlemenizde uygun gördüğünüz şekilde modüler hale getirebilir, aynı zamanda projenizin yapısının dağıtıldıktan sonra açığa çıkmasını önleyebilirsiniz.
Tek bir kitaplık olarak dağıtmanın aşağıdaki avantajları olabilir:
- Basitleştirilmiş bağımlılıklar: Birden fazla kitaplık bağımlılığını tek bir AAR ile değiştirerek kullanıcılarınız için proje kurulumunu ve sürüm yönetimini kolaylaştırır.
- Daha küçük kitaplık boyutu: Kod daraltma işlemini iyileştirerek daha küçük AAR'ler elde edilmesini sağlayabilir.
- Daha iyi güvenlik: Yayınlanan kitaplıkların dahili uygulama ayrıntıları üzerinde daha iyi kontrol sağlayabilir.
Birleştirilmiş kitaplık oluşturma
Birleştirilmiş kitaplık oluşturmak için yeni bir Android modülü oluşturmanız, bağımlılıklar eklemeniz ve ardından birleştirilmiş kitaplığı yayınlamanız gerekir.
Ön koşullar
Fused Library eklentisini kullanmak için AGP 9.0 veya sonraki bir sürümü kullanın. Fused Library eklentisinin önceki sürümlerinde farklı davranışlar ve sorunlar vardı. Bunlar AGP 9.0'da düzeltildi.
Yeni bir birleştirilmiş kitaplık modülü ekleme
Eklentiyi kullanmak için projenize yeni bir Android modülü eklemeniz gerekir:
Bu örnekte, birleştirilmiş kitaplık modülü myFusedLibrary olarak adlandırılacaktır.
include(":myFusedLibrary")dosyasınısettings.gradle.ktsdosyasına ekleyin.gradle/libs.versions.tomldosyasındaki[plugins]bölümünün altınaandroid-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }ekleyin.- Üst düzey
build.gradle.ktsdosyasındaki eklentiler bloğunaalias(libs.plugins.android.fusedlibrary) apply falseekleyin. myFusedLibrarymodülünü oluşturmak içinmyFusedLibraryadında yeni bir dizin oluşturun ("My Application"ı sağ tıklayın > New > Directory).myFusedLibrarymodülünde birbuild.gradle.ktsdosyası oluşturun (myFusedLibrarymodülünü sağ tıklayın > Yeni > Dosya).myFusedLibrary/build.gradle.ktsdosyasına aşağıdakileri yapıştırın:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Modern
plugins { id 'com.android.fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
Bağımlılık ekleme
Birleştirilmiş kitaplığın temel işlevi, bağımlılıkları bir araya getirmektir. Eklenti, yerel proje bağımlılıkları ve harici kitaplıklar eklemeyi destekler.
Paketlenecek bağımlılıkları belirtmek için include yapılandırmasını kullanın.
Geçişli bağımlılıklar paketlenmez.
Örneğin:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Modern
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
Birleştirilmiş kitaplığınızı yayınlama
Birleştirilmiş kitaplık yayınlamadan önce Android kitaplığı yayınlama hakkında bilgi edinmeniz gerekir. Birleştirilmiş kitaplık yayınlamak, Android kitaplığı yayınlamaya benzer ancak birleştirilmiş kitaplığı doğru şekilde yayınlamak için dikkate almanız gereken bazı önemli farklar vardır:
- Maven Publish eklentisi, Fused Library eklentisinin uygulandığı tüm modüllere de uygulanmalıdır.
- Yayının
fusedLibraryComponentöğesinden devralması gerekir. Bu, birleştirilmiş kitaplık yapısını derlemek için gereken bağımlılıkları sağlar.
Yayın yapılandırmasına bir örnek:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { … } dependencies { … } publishing { publications { register<MavenPublication>("release") { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" from(components["fusedLibraryComponent"]) } } }
Modern
plugins { id 'com.android.fused-library' id 'maven-publish' } androidFusedLibrary { … } dependencies { … } publishing { publications { release(MavenPublication) { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" afterEvaluate { from components.fusedLibraryComponent } } }
Birleştirilmiş kitaplığınızı test için yayınlama
Bir Android uygulamasından veya Android kitaplığından yayınlanmış bir birleştirilmiş kitaplığa bağlı olarak test yapmanız gerekir. Önerilen yöntem, birleştirilmiş kitaplığı ve proje bağımlılıklarını yerel bir Maven deposunda yayınlamaktır.
Birleştirilmiş kitaplık yapılarını yerel bir depoda yayınlamak için aşağıdakine benzer bir yapılandırma tanımlayın:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
Modern
plugins { id 'com.android.fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
Birleştirilmiş kitaplığınızı yükleme
Birleştirilmiş kitaplığınızı dağıtmak için Kitaplığınızı yükleme bölümüne bakın.
Davranış ve güvenlik önlemleri
Android kitaplıklarını birleştirmenin, eklentinin öncelikler hakkında mantık yürütmesini zorlaştırabilecek karmaşık yönleri vardır. Örneğin, aynı sınıf yoluna sahip iki kitaplık, kitaplık birleştirilirken derleme hatasına neden olur. Kaynak birleştirme, farklı kitaplıklarda aynı ada sahip bir kaynak seçerken belirtilen bağımlılıkların sırasını dikkate alır.
- Birleştirilmiş kitaplıklar, bağımlılık olarak eklenebilmek için yalnızca Android kitaplık yapısı AAR olarak yayınlanabilir.
- Veri bağlama kullanan kitaplıkların birleştirilmesi desteklenmez.
- Tek bir birleştirilmiş kitaplıkta birden fazla derleme türünü ve ürün türünü birleştiremezsiniz. Farklı varyantlar için ayrı birleştirilmiş kitaplıklar oluşturun.
Eklenti, gereken yapılandırma miktarını ve kullanım kolaylığını dengelemek için belirsiz çakışmalarda derlemeyi başarısız kılar veya yapıları birleştirirken buluşsal yöntemler kullanır. Yapıların nasıl birleştirildiğine dair ayrıntıları aşağıdaki tabloda bulabilirsiniz:
| Tür | Davranış |
|---|---|
| Sınıflar | Aynı sınıf yoluna sahip kitaplıklar, kitaplık birleştirilirken derleme hatasına neden olur. |
| Android Kaynakları | Kaynak birleştirme, farklı kaynaklarda aynı ada sahip bir kaynak seçerken belirtilen bağımlılıkların sırasını dikkate alır. |
| AAR Meta Verileri | AAR meta veri sürümleri, her bağımlılık kitaplığındaki en yüksek değere öncelik verilerek birleştirilir. Bu değerleri geçersiz kılmak için bir DSL sağlanır. Kotlin androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
| Java Kaynakları | Birden fazla kitaplıkta aynı yollara sahip Java kaynak dosyalarına izin verilmez ve bu durum derleme hatasına neden olur. |
Bilinen sorunlar
Fused Library yeni bir eklentidir ve tüm kullanım alanlarını karşılamak için üzerinde çalışılan bilinen sorunlar vardır. Karşılaştığınız sorunlar için hata bildiriminde bulunabilirsiniz.
- Sorun #454305444: "proguard.txt" olarak adlandırılmayan tüketici proguard kuralları içeren kitaplıklar, derleme hatasına neden olur. AGP 9.1 ve sonraki sürümlerde düzeltildi.
- 374982739 numaralı sorun: Diğer .aar dosyalarına dosya bağımlılıkları ekleme
- 231433225 numaralı sorun: RenderScript ve Prefab yapılarını birleştirme desteği yok
Birleştirilmiş kitaplığın bağımlılıklarını anlama
Birleştirilmiş kitaplığın kaynağı yoktur ve tek kaynağı olarak Android kitaplıklarını kullanır. Bu nedenle, hangi öğenin nereden geldiğini anlamak önemlidir. Sonuç olarak ortaya çıkan yapıyla birleştirilen bağımlılıkları ve yapıyı derlemek için gereken bağımlılıkları listelemek üzere birleştirilmiş kitaplıkta gradle :report görevini çalıştırın. Görev, birleştirilmiş kitaplığın build/reports dizinine kaydedilen bir JSON raporu oluşturur.
Dahili eklenti bağımlılıkları hakkında daha fazla bilgi edinmek için gradle :dependencies görevini çalıştırarak eklenti yapılandırmalarının durumunu görüntüleyin.