Dalam project dengan banyak modul, mendistribusikan Android Libraries kepada pengguna sambil mencoba mempertahankan struktur project yang jelas bisa menjadi tantangan. Dalam banyak kasus, lebih banyak library yang perlu dipublikasikan daripada yang dimaksudkan.
Plugin Fused Library yang dipaketkan dengan Android Gradle Plugin membantu mengemas beberapa modul Android Library ke dalam satu Android Library yang dapat dipublikasikan. Hal ini memungkinkan Anda memodularisasi kode sumber dan resource library dalam build sesuai keinginan, sekaligus menghindari pemaparan struktur project setelah didistribusikan.
Mendistribusikan sebagai satu library dapat memberikan manfaat berikut:
- Dependensi yang disederhanakan: menggantikan beberapa dependensi library dengan satu AAR, sehingga menyederhanakan penyiapan project dan pengelolaan versi untuk pengguna Anda
- Ukuran library yang lebih kecil: dapat meningkatkan penyingkatan kode, sehingga menghasilkan AAR yang lebih kecil
- Peningkatan keamanan: dapat menawarkan kontrol yang lebih baik atas detail implementasi internal library yang dipublikasikan
Membuat library gabungan
Untuk membuat library gabungan, Anda harus membuat modul Android baru, menambahkan dependensi, lalu memublikasikan library gabungan.
Menambahkan modul library gabungan baru
Untuk menggunakan plugin, Anda harus menambahkan modul Android baru ke project:
Dalam contoh ini, modul library gabungan akan disebut myFusedLibrary
.
- Aktifkan dukungan library gabungan dengan menambahkan
android.experimental.fusedLibrarySupport=true
ke filegradle.properties
. - Tambahkan
include(":myFusedLibrary")
ke filesettings.gradle.kts
. - Tambahkan
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }
di bagian[plugins]
dalam filegradle/libs.versions.toml
. - Tambahkan
alias(libs.plugins.android.fusedlibrary) apply false
di blok plugins dalam filebuild.gradle.kts
tingkat teratas. - Untuk membuat modul
myFusedLibrary
, buat direktori baru bernamamyFusedLibrary
(klik kanan 'My Application' > New > Directory). - Buat file
build.gradle.kts
di modulmyFusedLibrary
(klik kanan modulmyFusedLibrary
> New > File). - Tempelkan kode berikut ke dalam file
myFusedLibrary/build.gradle.kts
:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Groovy
plugins { id 'fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
Menambahkan dependensi
Fungsi inti library gabungan adalah untuk menggabungkan dependensi. Plugin
mendukung penambahan dependensi project lokal dan library eksternal.
Untuk menentukan dependensi yang akan dipaketkan, gunakan konfigurasi include
.
Dependensi transitif tidak dikemas.
Contoh:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Groovy
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
Memublikasikan library gabungan
Anda harus memahami cara memublikasikan library Android sebelum memublikasikan library gabungan. Memublikasikan library gabungan serupa dengan memublikasikan Library Android, tetapi ada beberapa perbedaan utama yang harus Anda pertimbangkan untuk memublikasikan library gabungan dengan benar:
- Plugin Maven Publish juga harus diterapkan ke modul apa pun yang menerapkan plugin Fused Library.
- Publikasi harus diwarisi dari
fusedLibraryComponent
karena menyediakan dependensi yang diperlukan untuk mengompilasi artefak library gabungan.
Berikut adalah contoh konfigurasi publikasi:
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"]) } } }
Groovy
plugins { id '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 } } }
Memublikasikan library gabungan untuk pengujian
Anda harus menguji dengan bergantung pada library gabungan yang dipublikasikan dari aplikasi Android atau library Android. Metode yang direkomendasikan adalah memublikasikan ke library gabungan dan dependensi projectnya ke repositori Maven lokal.
Untuk memublikasikan artefak library gabungan ke repositori lokal, tentukan konfigurasi yang mirip dengan berikut ini:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
Groovy
plugins { id 'fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
Mengupload library gabungan Anda
Untuk mendistribusikan library gabungan, lihat Mengupload library Anda.
Perilaku dan pengamanan
Menggabungkan Library Android memiliki kerumitan yang dapat membuat plugin sulit menentukan prioritas. Misalnya, dua library dengan classpath yang sama akan menyebabkan kegagalan build saat menggabungkan library. Penggabungan resource akan mempertimbangkan urutan dependensi yang ditentukan saat memilih resource dengan nama yang sama di library yang berbeda.
- Library gabungan hanya dapat dipublikasikan sebagai AAR artefak library Android agar dapat ditambahkan sebagai dependensi.
- Penggabungan library yang menggunakan data binding tidak didukung.
- Anda tidak dapat menggabungkan beberapa jenis build dan ragam produk dalam satu library gabungan. Buat library gabungan terpisah untuk varian yang berbeda.
Untuk menyeimbangkan jumlah konfigurasi yang diperlukan dan kemudahan penggunaan, plugin akan gagal membangun pada konflik ambigu atau menggunakan heuristik saat menggabungkan artefak. Detail cara menggabungkan artefak dapat ditemukan dalam tabel berikut:
Jenis | Perilaku |
---|---|
Class | Library dengan classpath yang sama akan menyebabkan kegagalan build saat menggabungkan library. |
Sumber Daya Android | Penggabungan resource akan mempertimbangkan urutan dependensi yang ditentukan saat memilih resource dengan nama yang sama di berbagai. |
Metadata AAR | Versi metadata AAR digabungkan dengan memprioritaskan nilai tertinggi dari setiap library dependensi. Ada DSL yang disediakan untuk mengganti nilai ini. KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
Resource Java | File resource Java di beberapa library dengan jalur yang identik tidak diizinkan dan akan menyebabkan kegagalan build. |
Masalah umum
Fused Library adalah plugin baru dan ada masalah umum yang sedang diupayakan untuk memenuhi semua kasus penggunaan.
- File JAR sumber tidak dapat dibuat
- Menambahkan dependensi file pada file .aar lainnya
- Tidak ada dukungan untuk menggabungkan artefak RenderScript dan Prefab
Memahami dependensi library gabungan
Library gabungan tidak memiliki sumber dan secara efektif menggunakan library Android
sebagai satu-satunya sumbernya, penting untuk memahami asal-usulnya. Untuk mencantumkan
dependensi yang digabungkan ke dalam artefak yang dihasilkan dan
dependensi yang diperlukan untuk mem-build artefak, jalankan tugas gradle :report
di
library gabungan. Tugas ini menghasilkan laporan JSON yang disimpan di
direktori build/reports
library gabungan.
Untuk informasi tambahan terkait dependensi plugin internal, jalankan tugas
gradle :dependencies
untuk melihat status konfigurasi plugin.