Memublikasikan beberapa library Android sebagai satu dengan Library Gabungan

Dalam project dengan banyak modul, mendistribusikan Library Android kepada pengguna sambil mencoba mempertahankan struktur project yang jelas dapat menjadi tantangan. Dalam banyak kasus, ada lebih banyak library yang perlu dipublikasikan daripada yang diinginkan.

Plugin Library Gabungan yang dipaketkan dengan Plugin Android Gradle membantu memaketkan beberapa modul Library Android ke dalam satu Library Android yang dapat dipublikasikan. Hal ini memungkinkan Anda memodularisasi kode sumber dan resource library dalam build sesuai keinginan, sekaligus menghindari eksposur struktur project setelah didistribusikan.

Mendistribusikan sebagai library tunggal dapat memberikan manfaat berikut:

  • Dependensi yang disederhanakan: mengganti 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
  • Keamanan yang lebih baik: dapat menawarkan kontrol yang lebih baik atas detail implementasi internal library yang dipublikasikan

Membuat library gabungan

Untuk mem-build library gabungan, Anda harus membuat modul Android baru, menambahkan dependensi, lalu memublikasikan library gabungan.

Prasyarat

Untuk menggunakan plugin Library Gabungan, gunakan AGP 9.0 atau yang lebih tinggi. Versi plugin Library Gabungan sebelumnya memiliki perilaku dan masalah yang berbeda, yang telah diperbaiki di AGP 9.0.

Menambahkan modul library gabungan baru

Untuk menggunakan plugin, Anda harus menambahkan modul Android baru ke project:

Dalam contoh ini, modul library gabungan akan diberi nama myFusedLibrary.

  1. Tambahkan include(":myFusedLibrary") ke file settings.gradle.kts.
  2. Tambahkan android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } di bagian [plugins] dalam file gradle/libs.versions.toml.
  3. Tambahkan alias(libs.plugins.android.fusedlibrary) apply false di blok plugin dalam file build.gradle.kts level teratas.
  4. Untuk membuat modul myFusedLibrary, buat direktori baru bernama myFusedLibrary (klik kanan 'My Application' > New > Directory).
  5. Buat file build.gradle.kts di modul myFusedLibrary (klik kanan modul myFusedLibrary > New > File).
  6. Tempelkan kode berikut ke 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 'com.android.fused-library'
}

androidFusedLibrary {
    namespace 'com.example.myFusedLibrary'
    minSdk 21
}

dependencies {

}

Menambahkan dependensi

Fungsi inti library gabungan adalah untuk memaketkan dependensi. Plugin ini mendukung penambahan dependensi project lokal dan library eksternal. Untuk menentukan dependensi yang akan dipaketkan, gunakan konfigurasi include. Dependensi transitif tidak dipaketkan.

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

Anda harus memahami cara memublikasikan library Android sebelum memublikasikan library gabungan. Memublikasikan library gabungan mirip 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 Library Gabungan.
  • Publikasi harus diwarisi dari fusedLibraryComponent karena ini 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 '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
        }
    }
}

Memublikasikan library gabungan untuk pengujian

Anda harus menguji dependensi pada library gabungan yang dipublikasikan dari aplikasi Android atau library Android. Metode yang direkomendasikan adalah memublikasikan ke library gabungan dan dependensi project-nya 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 'com.android.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 menyulitkan plugin untuk 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 artefak library Android AAR 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 berbagai varian.

Untuk menyeimbangkan jumlah konfigurasi yang diperlukan dan kemudahan penggunaan, plugin akan menggagalkan build pada konflik yang ambigu atau menggunakan heuristik saat menggabungkan artefak. Detail tentang cara artefak digabungkan 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 dependensi yang berbeda.
Metadata AAR Versi metadata AAR digabungkan dengan memprioritaskan nilai tertinggi dari setiap library dependensi. Ada DSL yang disediakan untuk mengganti nilai ini.

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Resource Java File resource Java di beberapa library dengan jalur yang sama tidak diizinkan dan akan menyebabkan kegagalan build.

Masalah umum

Library Gabungan adalah plugin baru dan ada masalah umum yang sedang ditangani untuk memenuhi semua kasus penggunaan. Anda dapat melaporkan bug untuk masalah apa pun yang Anda temukan.

  • Masalah #454305444: Library yang berisi aturan proguard konsumen yang tidak bernama 'proguard.txt' akan menyebabkan kegagalan build. Diperbaiki di AGP 9.1 dan yang lebih tinggi.
  • Masalah #374982739: Menambahkan dependensi file pada file .aar lainnya
  • Masalah #231433225: 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 sumber, sehingga penting untuk memahami apa yang berasal dari mana. Untuk mencantumkan dependensi yang digabungkan ke dalam artefak yang dihasilkan dan dependensi yang diperlukan untuk mem-build artefak, jalankan tugas gradle :report pada 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.