Membuat library Android

Library Android secara struktural sama dengan modul aplikasi Android. Library ini dapat mencakup semua yang diperlukan untuk mem-build aplikasi, termasuk kode sumber, file resource, dan manifes Android. Namun, library Android tidak dikompilasi ke dalam APK yang berjalan di perangkat, melainkan dikompilasi ke dalam file Android Archive (AAR) yang dapat Anda gunakan sebagai dependensi untuk modul aplikasi Android. Tidak seperti file JAR, file AAR menawarkan fungsi berikut untuk aplikasi Android:

  • File AAR dapat berisi resource Android dan file manifes, yang memungkinkan Anda membuat bundle dalam resource bersama seperti tata letak dan drawable selain class dan metode Java.
  • File AAR dapat berisi library C/C++ untuk digunakan oleh kode C/C++ modul aplikasi.

Modul library berguna dalam situasi berikut:

  • Saat Anda mem-build beberapa aplikasi yang menggunakan sejumlah komponen yang sama, misalnya aktivitas, layanan, atau tata letak UI.
  • Saat Anda mem-build aplikasi yang ada dalam beberapa variasi APK, misalnya versi gratis dan berbayar, dan Anda membutuhkan komponen inti yang sama dalam kedua versi tersebut.

Dalam kasus ini, cukup pindahkan file yang ingin digunakan kembali ke dalam modul library, lalu tambahkan library sebagai dependensi untuk setiap modul aplikasi. Halaman ini mengajarkan cara melakukan keduanya.

Membuat modul library

Untuk membuat modul library dalam project Anda, lakukan langkah berikut:

  1. Klik File > New > New Module.
  2. Di jendela Create New Module yang muncul, klik Android Library, lalu klik Next.

    Terdapat juga opsi untuk membuat Java Library, yang mem-build file JAR tradisional. Meskipun berguna untuk banyak project, terutama bila ingin membagikan kode dengan platform lain, file JAR tidak memungkinkan Anda menyertakan file manifes atau resource Android, yang sangat berguna untuk penggunaan kembali kode dalam project Android. Jadi, panduan ini berfokus pada pembuatan library Android.

  3. Beri nama library Anda dan pilih versi SDK minimum untuk kode dalam library, lalu klik Finish.

Setelah sinkronisasi project Gradle selesai, modul library muncul dalam panel Project di sebelah kiri. Jika Anda tidak melihat folder modul baru, pastikan folder tersebut menampilkan tampilan Android.

Mengonversi modul aplikasi menjadi modul library

Jika Anda sudah memiliki modul aplikasi yang memuat semua kode yang ingin digunakan kembali, Anda dapat mengubahnya menjadi modul library dengan cara berikut:

  1. Buka file build.gradle level modul.
  2. Hapus baris untuk applicationId. Hanya modul aplikasi Android yang dapat menentukan baris ini.
  3. Di bagian atas file, Anda akan melihat kode berikut:
    apply plugin: 'com.android.application'
    

    Ubah menjadi seperti berikut:

    apply plugin: 'com.android.library'
    
  4. Simpan file, lalu klik File > Sync Project with Gradle Files.

Selesai. Struktur keseluruhan modul tetap sama, tetapi sekarang beroperasi sebagai library Android dan build kini akan membuat file AAR, bukan APK.

Bila Anda ingin mem-build file AAR, pilih modul library dalam jendela Project, lalu klik Build > Build APK.

Menambahkan library sebagai dependensi

Untuk menggunakan kode library Android Anda dalam modul aplikasi lain, lakukan langkah berikut:

  1. Tambahkan library ke project melalui salah satu cara berikut (jika Anda membuat modul library dalam project yang sama, berarti library sudah ada di sana dan Anda dapat melewati langkah ini):
    • Tambahkan file AAR (atau JAR) yang telah di-build sebelumnya:
      1. Klik File > New > New Module.
      2. Klik Import .JAR/.AAR Package, lalu klik Next.
      3. Masukkan lokasi file AAR atau JAR yang dikompilasi, lalu klik Finish.
    • Android Studio membuat direktori modul, menyalin AAR ke dalam modul, dan membuat file build.gradle untuk AAR/JAR, dengan konten berikut:

            configurations.maybeCreate("default")
            artifacts.add("default", file('libraryName'))
            
    • Impor modul library dengan kode sumber ke project Anda (sumber library menjadi bagian dari project):
      1. Klik File > New > Import Module.
      2. Masukkan lokasi direktori modul library, lalu klik Finish.

      Modul library dengan kode sumber disalin ke project Anda, sehingga Anda benar-benar dapat mengedit kode library. Jika Anda ingin mengelola satu versi kode library, mungkin bukan ini yang Anda inginkan. Anda mungkin harus menambahkan file AAR yang telah dikompilasi seperti dijelaskan di atas.

  2. Pastikan library tersebut tercantum di bagian atas file settings.gradle Anda, seperti yang ditunjukkan di sini untuk library "my-library-module":
    include ':app', ':my-library-module'
    
  3. Buka file build.gradle modul aplikasi, lalu tambahkan baris baru ke blok dependencies seperti yang ditunjukkan dalam cuplikan berikut:
    dependencies {
        implementation project(":my-library-module")
    }
    
  4. Klik Sync Project with Gradle Files.

Dalam contoh di atas, konfigurasi implementation menambahkan library my-library-module sebagai dependensi build untuk seluruh modul aplikasi. Jika Anda menginginkan library untuk varian build tertentu saja, bukan implementation, gunakan buildVariantNameImplementation. Misalnya, jika Anda ingin menyertakan library yang berada dalam ragam produk "pro" saja, kodenya akan terlihat seperti berikut:

productFlavors {
    pro { ... }
}
dependencies {
    proImplementation project(":my-library-module")
}

Semua kode dan resource dalam library Android ini sekarang dapat diakses oleh modul aplikasi Anda, dan file AAR library akan dipaketkan ke dalam APK selama proses build.

Namun, jika Anda ingin membagikan file AAR secara terpisah, Anda dapat menemukannya di project-name/module-name/build/outputs/aar/ dan membuatnya kembali dengan mengklik Build > Make Project.

Catatan: Untuk mempelajari manajemen dependensi lebih lanjut, baca Menggunakan manajemen dependensi yang peka terhadap varian.

Memilih resource yang akan dijadikan publik

Semua resource dalam library secara default bersifat publik. Untuk menjadikan semua resource bersifat pribadi secara implisit, Anda harus mendefinisikan setidaknya satu atribut tertentu sebagai publik. Resource mencakup semua file dalam direktori res/ project Anda, misalnya gambar. Agar pengguna library tidak dapat mengakses resource yang hanya ditujukan untuk penggunaan internal, sebaiknya Anda menggunakan mekanisme penetapan pribadi otomatis ini dengan mendeklarasikan satu atau beberapa resource publik. Atau, Anda dapat menjadikan semua resource bersifat pribadi dengan menambahkan tag <public /> kosong. Tindakan ini tidak akan menandai apa pun sebagai publik, melainkan membuat semua resource lainnya sebagai pribadi.

Untuk mendeklarasikan resource publik, tambahkan deklarasi <public> ke file public.xml library Anda. Jika belum pernah menambahkan resource publik, Anda perlu membuat file public.xml dalam direktori res/values/ library Anda.

Kode contoh berikut membuat dua resource string publik dengan nama mylib_app_name dan mylib_public_string:

<resources>
    <public name="mylib_app_name" type="string"/>
    <public name="mylib_public_string" type="string"/>
</resources>

Anda harus menjadikan semua resource yang diinginkan bersifat publik agar tetap terlihat oleh developer yang menggunakan library Anda.

Menjadikan atribut bersifat pribadi secara implisit tidak hanya mencegah pengguna library mendapat saran penyelesaian kode dari resource library internal, tetapi juga memungkinkan Anda mengganti nama atau menghapus resource pribadi tanpa memutus klien library Anda. Resource pribadi difilter dari penyelesaian kode, dan Lint akan memperingatkan Anda ketika mencoba mereferensikan resource pribadi.

Saat mem-build library, plugin Android Gradle mendapatkan definisi resource publik dan mengekstraknya ke dalam file public.txt, yang kemudian dikemas dalam file AAR.

Pertimbangan pengembangan untuk modul library

Karena Anda mengembangkan modul library dan aplikasi dependen, harap pahami perilaku dan batasan berikut.

Setelah Anda menambahkan referensi untuk modul library ke modul aplikasi Android, Anda dapat menyetel prioritas relatifnya. Pada waktu build, library akan digabungkan dengan aplikasi satu per satu, mulai dari prioritas terendah hingga tertinggi.

  • Konflik penggabungan resource

    Alat build akan menggabungkan resource dari modul library bersama resource dari modul aplikasi dependen. Jika ID resource yang diberikan telah didefinisikan dalam kedua modul, resource dari aplikasi akan digunakan.

    Jika terjadi konflik di antara beberapa library AAR, resource dari library yang tercantum pertama kali dalam daftar dependensi (mendekati bagian atas blok dependencies) akan digunakan.

    Untuk menghindari konflik resource pada ID resource umum, pertimbangkan penggunaan awalan atau skema penamaan konsisten lainnya yang unik untuk modul (atau unik untuk semua modul project).

  • Dalam build multi-modul, dependensi JAR dianggap sebagai dependensi transitif

    Ketika Anda menambahkan dependensi JAR ke project library yang menghasilkan AAR, JAR akan diproses oleh modul library dan dikemas dengan AAR miliknya.

    Namun, jika project Anda menyertakan modul library yang dipakai oleh modul aplikasi, modul aplikasi tersebut akan memperlakukan dependensi JAR lokal library sebagai dependensi transitif. Dalam hal ini, JAR lokal diproses oleh modul aplikasi yang memakainya, bukan oleh modul library. Cara ini berguna untuk mempercepat build inkremental yang disebabkan karena perubahan pada kode library.

    Setiap konflik resource Java yang disebabkan oleh dependensi JAR lokal harus diselesaikan dalam modul aplikasi yang memakai library.

  • Modul library dapat bergantung pada library JAR eksternal

    Anda dapat mengembangkan modul library yang bergantung pada library eksternal. (misalnya, library eksternal Maps). Dalam hal ini, aplikasi dependen harus mem-build untuk target yang menyertakan library eksternal (misalnya, Add-on API Google). Perlu diketahui juga bahwa baik modul library maupun aplikasi dependen harus mendeklarasikan library eksternal dalam file manifesnya, tepatnya dalam elemen <uses-library>.

  • minSdkVersion modul aplikasi harus sama dengan atau lebih baru daripada versi yang ditentukan oleh library

    Library dikompilasi sebagai bagian dari modul aplikasi dependen sehingga API yang digunakan dalam modul library harus kompatibel dengan versi platform yang didukung oleh modul aplikasi.

  • Setiap modul library membuat class R-nya sendiri

    Jika Anda mem-build modul aplikasi dependen, modul library akan dikompilasi ke dalam file AAR, lalu ditambahkan ke modul aplikasi. Oleh karena itu, setiap library memiliki class R sendiri yang diberi nama sesuai dengan nama paket library. Class R yang dihasilkan dari modul utama dan modul library dibuat dalam semua paket yang diperlukan, termasuk paket modul utama dan paket library.

  • Modul library dapat menyertakan file konfigurasi ProGuard-nya sendiri

    Jika Anda memiliki project library yang digunakan untuk mem-build dan memublikasikan AAR, Anda dapat menambahkan file konfigurasi ProGuard ke konfigurasi build library dan plugin Android Gradle akan menerapkan aturan ProGuard yang telah ditentukan. Build Tools akan menyematkan file ini dalam file AAR yang dihasilkan untuk modul library. Saat Anda menambahkan library ini ke modul aplikasi, file ProGuard library akan ditambahkan ke file konfigurasi ProGuard (proguard.txt) untuk modul aplikasi tersebut.

    Dengan menyematkan file ProGuard dalam modul library, Anda memastikan bahwa modul aplikasi yang bergantung pada library tidak perlu mengupdate file ProGuard-nya secara manual untuk menggunakan library. Saat mem-build aplikasi Anda, sistem build Android Studio akan menggunakan perintah baik dari modul aplikasi maupun dari library. Jadi, Anda tidak perlu menjalankan penyingkat kode di library ini dalam langkah terpisah.

    Untuk menambahkan aturan ProGuard ke project library ini, Anda harus menentukan nama file dengan properti consumerProguardFiles, di dalam blok defaultConfig file build.gradle library Anda. Misalnya, cuplikan berikut menetapkan lib-proguard-rules.txt sebagai file konfigurasi ProGuard library:

    android {
        defaultConfig {
            consumerProguardFiles 'lib-proguard-rules.txt'
        }
        ...
    }
    

    Namun, jika modul library Anda adalah bagian dari build multi-modul yang dikompilasi ke dalam APK dan tidak menghasilkan AAR, sebaiknya Anda menjalankan penyingkatan kode hanya pada modul aplikasi yang memakai library itu. Untuk mempelajari aturan ProGuard dan penggunaannya lebih lanjut, baca Menyingkat, meng-obfuscate, dan mengoptimalkan aplikasi.

  • Menguji modul library sama dengan menguji aplikasi

    Perbedaan utamanya adalah library dan dependensinya otomatis disertakan sebagai dependensi dari APK pengujian. Hal ini berarti APK pengujian tidak hanya menyertakan kodenya sendiri, tetapi juga AAR library dan semua dependensinya. Karena tidak ada "aplikasi yang sedang diuji" yang terpisah, tugas androidTest hanya menginstal (dan meng-uninstal) APK pengujian.

    Saat menggabungkan beberapa file manifes, Gradle akan mengikuti urutan prioritas default dan menggabungkan manifes library ke dalam manifes utama APK pengujian.

Anatomi file AAR

Ekstensi file AAR adalah .aar, dan jenis artefak Mavennya juga harus aar. Filenya sendiri adalah file zip. Satu-satunya entri wajib adalah /AndroidManifest.xml.

Selain itu, file AAR dapat menyertakan satu atau beberapa entri opsional berikut:

  • /classes.jar
  • /res/
  • /R.txt
  • /public.txt
  • /assets/
  • /libs/name.jar
  • /jni/abi_name/name.so (dengan abi_name adalah salah satu ABI yang didukung Android)
  • /proguard.txt
  • /lint.jar
  • /api.jar
  • /prefab/ untuk mengekspor library native