Membuat library Android

Library Android secara struktural sama dengan modul aplikasi Android. Library ini 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 Kotlin atau Java.
  • File AAR dapat berisi library C/C++ untuk digunakan oleh kode C/C++ modul aplikasi.

Modul library berguna dalam situasi berikut:

  • Saat mem-build beberapa aplikasi yang menggunakan beberapa komponen yang sama, misalnya aktivitas, layanan, atau tata letak UI.
  • Saat mem-build aplikasi yang ada dalam beberapa variasi APK, seperti versi gratis dan berbayar, yang memiliki komponen inti bersama

Dalam kasus ini, pindahkan file yang ingin digunakan kembali ke dalam modul library, lalu tambahkan library sebagai dependensi untuk setiap modul aplikasi.

Halaman ini menjelaskan cara membuat dan menggunakan modul library Android. Untuk panduan cara memublikasikan library, lihat Memublikasikan library

Membuat modul library

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

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

    Terdapat juga opsi untuk membuat library Kotlin atau Java, yang mem-build file JAR tradisional. Meskipun berguna untuk banyak project, terutama jika 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. 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 akan muncul dalam panel Project. Jika Anda tidak melihat folder modul baru, pastikan panel menampilkan tampilan Android.

Mengonversi modul aplikasi menjadi modul library

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

  1. Buka file build.gradle level modul, jika Anda menggunakan Groovy, atau file build.gradle.kts, jika menggunakan skrip Kotlin.
  2. Hapus baris untuk applicationId. Hanya modul aplikasi Android yang dapat menentukan baris ini.
  3. Temukan blok `plugins` di bagian atas file yang terlihat seperti ini:

    Groovy

      plugins {
          id 'com.android.application'
      }
      

    Kotlin

      plugins {
          id("com.android.application")
      }
      

    Ubah menjadi seperti berikut:

    Groovy

      plugins {
          id 'com.android.library'
      }
      

    Kotlin

      plugins {
          id("com.android.library")
      }
      
  4. Simpan file, lalu klik File > Sync Project with Gradle Files.

Struktur modul tetap sama, tetapi sekarang beroperasi sebagai library Android. Build ini membuat file AAR, bukan APK.

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

Menambahkan dependensi dengan dialog Project Structure

Anda dapat menggunakan dialog Project Structure untuk menambahkan dependensi ke project Anda. Bagian berikut menjelaskan cara menggunakan dialog untuk menambahkan dependensi.

Menggunakan library Anda dari dalam project yang sama

Untuk menggunakan kode library Android baru dalam modul aplikasi atau library lain dalam project yang sama, tambahkan dependensi level project:

  1. Buka File > Project Structure > Dependencies.
  2. Pilih modul yang ingin Anda tambahkan library.
  3. Pada tab Declared Dependencies, klik , lalu pilih Module Dependency dari menu.

  4. Di dialog Add Module Dependency, pilih modul library Anda.

    Menambahkan dependensi modul di Dialog Project Structure

  5. Pilih konfigurasi yang memerlukan dependensi ini atau pilih implementation jika berlaku untuk semua konfigurasi, lalu klik OK.

Android Studio mengedit file build.gradle atau build.gradle.kts modul Anda untuk menambahkan dependensi, dalam bentuk berikut:

Groovy

  implementation project(path: ":example-library")

Kotlin

  implementation(project(":example-library"))

Menggunakan library Anda dalam project lain

Cara yang disarankan untuk berbagi dependensi (JAR dan AAR) adalah dengan repositori Maven, yang dihosting di layanan seperti Maven Central atau dengan struktur direktori di disk lokal Anda. Untuk informasi selengkapnya tentang penggunaan repositori Maven, lihat Repositori jarak jauh.

Saat library Android dipublikasikan ke repositori Maven, metadata disertakan sehingga dependensi library disertakan dalam build yang menggunakannya. Hal ini memungkinkan penghapusan duplikat library secara otomatis jika digunakan di beberapa tempat.

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

  1. Buka File > Project Structure > Dependencies.
  2. Di tab Declared Dependencies, klik , lalu pilih Library Dependency di menu.

  3. Di dialog Add Library Dependency, gunakan kotak penelusuran guna menemukan library untuk ditambahkan. Formulir ini menelusuri repositori yang ditentukan dalam blok dependencyResolutionManagement { repositories {...}} dalam file settings.gradle atau settings.gradle.kts.

    Menambahkan dependensi library di Dialog Project Structure

  4. Pilih konfigurasi yang memerlukan dependensi ini atau pilih implementation jika berlaku untuk semua konfigurasi, lalu klik OK.

Periksa file build.gradle atau build.gradle.kts aplikasi untuk memastikan bahwa deklarasi yang serupa dengan berikut ini muncul (bergantung pada konfigurasi build yang Anda pilih):

Groovy

  implementation 'com.example:examplelibrary:1.0.0'

Kotlin

  implementation("com.example:examplelibrary:1.0.0")

Menambahkan AAR atau JAR sebagai dependensi

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

  1. Buka File > Project Structure > Dependencies.
  2. Pada tab Declared Dependencies, klik , lalu pilih Jar Dependency di menu.

  3. Di dialog Add Jar/Aar Dependency, masukkan jalur ke file AAR atau JAR, lalu pilih konfigurasi tempat dependensi tersebut berlaku. Jika library harus tersedia untuk semua konfigurasi, pilih konfigurasi implementation.

    Menambahkan dependensi AAR di Dialog Project Structure

    Periksa file build.gradle atau build.gradle.kts aplikasi untuk memastikan bahwa deklarasi yang serupa dengan berikut ini muncul (bergantung pada konfigurasi build yang Anda pilih):

    Groovy

      implementation files('my_path/my_lib.aar')
    

    Kotlin

      implementation(files("my_path/my_lib.aar"))
    

Untuk mengimpor dependensi pada build Gradle yang berjalan di luar Android Studio, tambahkan jalur ke dependensi dalam file build.gradle atau build.gradle.kts aplikasi Anda. Contoh:

Groovy

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
}

Kotlin

dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
}

Untuk informasi selengkapnya tentang menambahkan dependensi Gradle, lihat Menambahkan dependensi build.

Mendeklarasikan resource publik

Resource mencakup semua file dalam direktori res/ project Anda, misalnya gambar. 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.

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>

Agar pengguna library tidak dapat mengakses resource yang hanya ditujukan untuk penggunaan internal, gunakan 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 menandai apa pun sebagai publik dan menjadikan semua resource bersifat pribadi.

Semua resource yang ingin tetap terlihat oleh developer yang menggunakan library Anda harus dijadikan bersifat publik.

Menjadikan atribut bersifat pribadi secara implisit membuat pengguna library tidak menerima saran penyelesaian kode dari resource library internal dan memungkinkan pengguna mengganti nama atau menghapus resource pribadi tanpa memutus klien library Anda. Resource pribadi difilter dari penyelesaian kode, dan alat 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.

  • Library digabungkan dalam urutan prioritas.

    Setelah 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.

  • Hindari 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 (paling dekat bagian atas blok dependencies) akan digunakan.

    Untuk menghindari konflik resource, gunakan class R non-transitif. Jika tidak memungkinkan, 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. Hal ini dapat mempercepat build inkremental yang disebabkan oleh perubahan pada kode library.

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

  • Modul library dapat bergantung pada library JAR eksternal.

    Anda dapat mengembangkan modul library yang bergantung pada library eksternal. Dalam hal ini, modul dependen harus mem-build untuk target yang menyertakan library eksternal.

    Perlu diketahui 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 memiliki project library yang digunakan untuk mem-build dan memublikasikan AAR, Anda dapat menambahkan file konfigurasi ProGuard ke konfigurasi build library. Jika Anda melakukannya, plugin Android Gradle akan menerapkan aturan ProGuard yang telah ditentukan. Alat build 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 membantu memastikan bahwa modul aplikasi yang bergantung pada library tidak perlu mengubah 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 Anda, tentukan nama file dengan properti consumerProguardFiles di dalam blok defaultConfig dari file build.gradle atau build.gradle.kts library Anda.

    Misalnya, cuplikan berikut menetapkan lib-proguard-rules.txt sebagai file konfigurasi ProGuard library:

    Groovy

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

    Kotlin

    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, jalankan penyingkatan kode hanya pada modul aplikasi yang menggunakan library tersebut. Untuk mempelajari aturan ProGuard dan penggunaannya lebih lanjut, baca Menyingkat, meng-obfuscate, dan mengoptimalkan aplikasi.

  • Pengujian modul library hampir sama dengan pengujian 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 terpisah yang sedang diuji, 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 aar. Filenya sendiri adalah file ZIP. Satu-satunya entri wajib adalah /AndroidManifest.xml.

File AAR juga dapat menyertakan satu atau beberapa entri opsional berikut: