Memublikasikan beberapa library Android sebagai satu dengan Library Gabungan

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

Plugin Library Gabungan yang dipaketkan dengan Plugin Android Gradle membantu mengemas beberapa modul Library Android menjadi 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 satu library dapat memiliki manfaat berikut:

  • Dependensi yang disederhanakan: mengganti beberapa dependensi library dengan satu AAR, sehingga menyederhanakan penyiapan project dan pengelolaan versi untuk pengguna
  • Mengurangi ukuran library: dapat meningkatkan penyingkatan kode, sehingga menghasilkan AAR yang lebih kecil
  • Keamanan yang ditingkatkan: 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.

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.

  1. Aktifkan dukungan library gabungan dengan menambahkan android.experimental.fusedLibrarySupport=true ke file gradle.properties.
  2. Tambahkan include(":myFusedLibrary") ke file settings.gradle.kts.
  3. Tambahkan android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } di bagian [plugins] dalam file gradle/libs.versions.toml.
  4. Tambahkan alias(libs.plugins.android.fusedlibrary) apply false di blok plugin dalam file build.gradle.kts level teratas.
  5. Untuk membuat modul myFusedLibrary, buat direktori baru bernama myFusedLibrary (klik kanan 'My Application' > New > Directory).
  6. Buat file build.gradle.kts di modul myFusedLibrary (klik kanan modul myFusedLibrary > New > File).
  7. 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 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 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 telah menerapkan plugin Library Gabungan.
  • Publikasi harus mewarisi dari fusedLibraryComponent karena hal 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 '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 bergantung 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:

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

Untuk mendistribusikan library gabungan, lihat Mengupload library.

Perilaku dan pengamanan

Menggabungkan Library Android memiliki kerumitan yang dapat menyulitkan plugin untuk memahami 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 membuat build gagal karena konflik yang ambigu atau menggunakan heuristik saat menggabungkan artefak. Detail cara artefak digabungkan dapat ditemukan di 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 tempat 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.

  • File lint.jar tidak disertakan dalam AAR gabungan
  • 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. Oleh karena itu, 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 yang digabungkan. 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.