Membuat Pustaka Android

Pustaka Android secara struktural sama dengan modul aplikasi Android. Pustaka ini menyertakan apa saja yang dibutuhkan untuk membangun aplikasi, termasuk kode sumber, file sumber daya, dan manifes Android. Akan tetapi, sebagai ganti mengompilasinya menjadi satu APK yang dijalankan pada perangkat, pustaka Android dikompilasi menjadi satu file Android Archive (AAR) yang bisa Anda gunakan sebagai dependensi untuk modul aplikasi Android. Tidak seperti file JAR, file AAR bisa berisi sumber daya Android dan file manifes, yang memungkinkan Anda membundel dalam sumber daya bersama seperti layout dan sumber daya dapat digambar di samping kelas dan metode Java.

Modul pustaka berguna dalam situasi berikut:

  • Bila Anda membangun beberapa aplikasi yang menggunakan beberapa komponen yang sama, misalnya aktivitas, layanan, atau layout UI.
  • Bila Anda membangun aplikasi yang ada dalam beberapa variasi APK, misalnya versi gratis dan versi berbayar, maka Anda membutuhkan komponen inti yang sama dalam kedua versi.

Bisa saja, Anda tinggal memindah file yang ingin digunakan kembali ke dalam modul pustaka kemudian menambahkan pustaka sebagai dependensi untuk setiap modul aplikasi. Laman ini mengajarkan cara melakukan keduanya.

Membuat modul pustaka

Untuk membuat modul pustaka dalam proyek Anda, lakukan seperti berikut:

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

    Ada juga opsi untuk membuat Java Library, yang membangun file JAR biasa. Walaupun file JAR berguna untuk banyak proyek—khususnya bila Anda ingin berbagi kode dengan platform lain—file ini tidak memungkinkan Anda menyertakan sumber daya atau file manifes Android, yang sangat berguna untuk penggunaan kembali kode tersebut dalam proyek Android. Jadi panduan ini memfokuskan pada pembuatan pustaka Android.

  3. Beri nama pada pustaka Anda dan pilih versi SDK minimum untuk kode dalam pustaka, kemudian klik Finish.

Setelah sinkronisasi proyek Gradle selesai, modul pustaka akan muncul dalam panel Project di kiri. Jika Anda tidak melihat folder modul baru, pastikan menggunakan tampilan Android.

Mengonversi modul aplikasi menjadi modul pustaka

Jika modul aplikasi yang ada berisi semua kode yang ingin Anda gunakan kembali, Anda bisa mengubahnya menjadi modul pustaka seperti berikut:

  1. Buka file build.gradle untuk modul aplikasi yang sudah ada. Di bagian atas, Anda akan melihat yang berikut ini:
    apply plugin: 'com.android.application'
    
  2. Ubah penetapan plugin seperti yang ditampilkan di sini:

    apply plugin: 'com.android.library'
    
  3. Klik Sync Project with Gradle Files.

Demikian saja. Struktur keseluruhan modul tetap sama, namun sekarang beroperasi sebagai pustaka Android dan pembangunannya kini akan membuat file AAR sebagai ganti APK.

Menambahkan pustaka Anda sebagai dependensi

Untuk menggunakan kode pustaka Android Anda dalam modul aplikasi lain, lakukan seperti berikut:

  1. Tambahkan pustaka ke proyek Anda dengan salah satu dari dua cara (jika Anda telah membuat modul pustaka dalam proyek yang sama, berarti sudah ada pustaka dan Anda bisa lewati langkah ini):
    • Tambahkan file AAR (atau JAR) yang telah dikompilasi:
      1. Klik File > New Module.
      2. Klik Import .JAR/.AAR Package kemudian klik Next.
      3. Masukkan lokasi file AAR atau JAR kemudian klik Finish.
    • Impor modul pustaka ke proyek Anda:
      1. Klik File > New > Import Module.
      2. Masukkan lokasi direktori modul pustaka kemudian klik Finish.

      Modul pustaka akan disalin ke proyek Anda, sehingga Anda bisa mengedit kode pustaka. Jika Anda ingin memelihara satu versi kode pustaka, berarti mungkin bukan ini yang Anda inginkan dan sebagai gantinya Anda harus mengimpor file AAR yang telah dikompilasi seperti dijelaskan di atas.

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

Dalam contoh di atas, modul pustaka Android bernama my-library- module menjadi dependensi pembangunan untuk modul yang menjadi lokasi file build.gradle.

Semua kode dan sumber daya dalam pustaka Android kini dapat diakses oleh modul aplikasi Anda, dan file AAR pustaka akan dibundel ke dalam APK pada waktu pembangunan.

Akan tetapi, jika Anda ingin berbagi file AAR secara terpisah, Anda bisa menemukannya dalam project-name/module-name/build/outputs/aar/ dan Anda bisa menghasilkannya kembali dengan mengeklik Build > Make Project.

Memilih sumber daya yang akan dijadikan publik

Semua sumber daya dalam pustaka secara default bersifat publik. Untuk membuat semua sumber daya agar privat secara implisit, Anda harus mendefinisikan setidaknya satu atribut tertentu sebagai publik. Sumber daya menyertakan semua file dalam direktori res/ proyek Anda, misalnya gambar. Untuk mencegah pengguna pustaka Anda agar tidak mengakses sumber daya yang hanya dimaksudkan untuk penggunaan internal, Anda harus menggunakan mekanisme penetapan privat otomatis ini dengan mendeklarasikan satu atau beberapa sumber daya publik.

Untuk mendeklarasikan sumber daya publik, tambahkan deklarasi ke file public.xml pustaka Anda. Jika Anda belum menambahkan sumber daya publik, Anda perlu membuat file public.xml dalam direktori res/values/ pustaka Anda.

Kode contoh berikut ini membuat dua sumber daya 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 membuat semua sumber daya yang Anda inginkan agar tetap terlihat oleh developer menjadi publik dengan menggunakan pustaka Anda. Misalnya, walaupun sebagian besar sumber daya di pustaka appcompat v7 bersifat privat, atribut yang mengontrol widget Bilah Alat bersifat publik untuk mendukung desain material.

Secara implisit membuat atribut menjadi privat tidak hanya mencegah pengguna pustaka Anda agar tidak menemui usulan pelengkapan kode dari sumber daya pustaka internal namun juga memungkinkan Anda mengganti nama atau membuang sumber daya privat tanpa memutus klien pustaka Anda. Sumber daya privat difilter oleh pelengkapan kode dan editor tema, dan Lint akan memperingatkan Anda bila mencoba mereferensikan sumber daya privat.

Pertimbangan development

Karena Anda mengembangkan modul pustaka dan aplikasi dependen, ketahuilah perilaku dan batasan berikut.

Setelah Anda menambahkan referensi ke modul pustaka ke modul aplikasi Android, Anda bisa menyetel prioritas relatifnya. Pada waktu pembangunan, pustaka akan disatukan dengan aplikasi satu per satu, mulai dari prioritas paling rendah ke yang paling tinggi.

  • Konflik penggabungan sumber daya

    Alat pembangunan akan menggabungkan sumber daya dari modul pustaka bersama sumber daya dari modul aplikasi dependen. Jika ID sumber daya yang diberikan telah didefinisikan dalam kedua modul, maka sumber daya dari aplikasi akan digunakan.

    Jika terjadi konflik di antara sekian pustaka AAR, maka sumber daya dari pustaka yang tercantum pertama dalam daftar dependensi (ke arah atas blok dependencies) akan digunakan.

    Untuk menghindari konflik sumber daya bagi ID sumber daya umum, pertimbangkan menggunakan awalan atau skema penamaan konsisten lainnya yang unik untuk modul (atau unik untuk semua modul proyek).

  • Modul pustaka dapat menyertakan pustaka JAR

    Anda bisa mengembangkan modul pustaka yang dengan sendirinya menyertakan pustaka JAR; akan tetapi Anda perlu mengedit jalur pembangunan modul aplikasi dependen secara manual dan menambahkan jalur ke file JAR.

  • Modul pustaka bisa bergantung pada pustaka JAR eksternal

    Anda bisa mengembangkan modul pustaka yang bergantung pada pustaka eksternal. (misalnya, pustaka eksternal Peta). Dalam hal ini, aplikasi dependen harus membangun untuk target yang menyertakan pustaka eksternal (misalnya, Pengaya Google API). Perhatikan juga, modul pustaka maupun aplikasi dependen harus mendeklarasikan pustaka eksternal dalam file manifesnya, dalam elemen <uses- library>.

  • Modul pustaka tidak bisa menyertakan aset mentah

    Alat ini tidak mendukung penggunaan file aset mentah (disimpan dalam direktori assets/) di modul pustaka. Semua sumber daya aset yang digunakan oleh aplikasi harus disimpan dalam direktori assets/ pada modul aplikasi itu sendiri.

  • minSdkVersion modul aplikasi harus sama dengan atau lebih besar dari versi yang didefinisikan oleh pustaka

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

  • Setiap modul pustaka membuat kelas R sendiri

    Bila Anda membangun modul aplikasi dependen, modul pustaka akan dikompilasi ke dalam file AAR kemudian ditambahkan ke modul aplikasi. Karena itu, setiap pustaka memiliki kelas R sendiri, yang diberi nama sesuai dengan nama paket pustaka. Kelas R yang dihasilkan dari modul utama dan modul pustaka dibuat di semua paket yang dibutuhkan, termasuk paket modul utama dan paket pustaka.

  • Modul pustaka dapat menyertakan file konfigurasi ProGuard sendiri

    Anda bisa mengaktifkan penciutan kode pada pustaka dengan menambahkan file konfigurasi ProGuard ke pustaka Anda yang menyertakan direktif ProGuard-nya. Alat pembangunan akan menyematkan file ini dalam file AAR yang dihasilkan untuk modul pustaka. Bila Anda menambahkan pustaka ke modul aplikasi, file ProGuard pustaka akan ditambahkan ke file konfigurasi ProGuard (proguard.txt) modul aplikasi.

    Dengan menyematkan file ProGuard dalam modul pustaka, berarti Anda memastikan modul aplikasi yang bergantung pada pustaka Anda tidak harus memperbarui file ProGuard-nya secara manual untuk menggunakan pustaka Anda. Bila ProGuard dijalankan pada modul aplikasi Android, ia akan menggunakan direktif dari modul aplikasi dan pustaka sehingga Anda tidak perlu menjalankan ProGuard pada pustaka itu sendiri.

    Untuk menetapkan nama file konfigurasi pustaka Anda, tambahkan ini ke metode consumerProguardFiles, di dalam blok defaultConfig file build.gradle pustaka Anda. Misalnya, cuplikan berikut menyetel lib-proguard-rules.txt sebagai file konfigurasi ProGuard pustaka:

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

    Secara default, modul aplikasi menggunakan versi rilis pustaka, bahkan saat menggunakan tipe pembangunan versi debug modul aplikasi. Untuk menggunakan tipe pembangunan berbeda dari pustaka, Anda harus menambahkan dependensi ke blok dependencies file build.gradle aplikasi dan menyetel publishNonDefault ke true dalam file build.gradle pustaka. Misalnya, cuplikan kode berikut dalam file build.gradle aplikasi Anda akan menyebabkan aplikasi menggunakan tipe pembangunan versi debug pustaka bila modul aplikasi dibangun dalam mode debug dan menggunakan tipe pembangunan versi rilis pustaka bila modul aplikasi dibangun dalam mode rilis:

    dependencies {
        debugCompile project(path: ':library', configuration: 'debug')
        releaseCompile project(path: ':library', configuration: 'release')
    }
    

    Anda juga harus menambahkan baris berikut di dalam blok android file build.gradle pustaka untuk mengekspos konfigurasi non-rilis pustaka Anda ke proyek-proyek yang menggunakannya:

    android {
        ...
        publishNonDefault true
    }
    

    Akan tetapi, ingat bahwa menyetel publishNonDefault itu bisa meningkatkan waktu pembangunan.

    Untuk memastikan bahwa aturan ProGuard pustaka Anda tidak menerapkan efek samping penciutan yang tidak diinginkan pada modul aplikasi, maka hanya sertakan aturan yang menonaktifkan fitur ProGuard yang tidak akan bekerja pada pustaka Anda. Aturan yang berusaha membantu developer bisa mengalami konflik dengan kode yang ada dalam modul aplikasi atau pustaka lainnya, karena itu tidak boleh disertakan. Misalnya, file ProGuard pustaka Anda bisa menetapkan kode apa yang perlu dipertahankan selama penciutan modul aplikasi.

    Catatan: Jack toolchain menyediakan dukungan untuk beberapa opsi penciutan dan penyamaran dengan ProGuard.

Anatomi file AAR

Ekstensi file AAR adalah .aar, dan tipe artefak Maven harus berupa aar. Filenya sendiri adalah file zip yang berisi entri wajib berikut:

  • /AndroidManifest.xml
  • /classes.jar
  • /res/
  • /R.txt

Sebagai tambahan, file AAR dapat menyertakan satu atau beberapa entri opsional berikut:

  • /assets/
  • /libs/name.jar
  • /jni/abi_name/name.so (dalam hal ini abi_name adalah salah satu ABI yang didukung Android)
  • /proguard.txt
  • /lint.jar