Memublikasikan beberapa library Android sebagai satu dengan Library Gabungan

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.

  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 plugins dalam file build.gradle.kts tingkat 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 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.

Kotlin

 androidFusedLibrary { 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.