CategoriesAndroidModularProgramming

Mengenal konsep Modular pada Android

Sebagian besar dari kita pasti seringkali bikin Aplikasi Android yang Monolith. Monolith berarti kita membuat semua code di aplikasi menggunakan 1 Module yaitu Module app. lalu apa masalahnya jika kita hanya membuatnya di 1 module saja ? seharusnya memang tidak ada masalah dan Aplikasi pasti masih bisa di run dengan lancar. masalah terjadi jika suatu aplikasi sudah besar dan memiliki banyak fitur, pasti agak membingungkan semua ditaruh di hanya pada 1 module saja, kita perlu membaginya menjadi beberapa module berdasarkan fitur. ini juga akan mempermudah jika kita ingin mengcopy fitur yang ada ke aplikasi lain tanpa harus mengatur ulang nama package pada tiap file.

sekarang kita coba mempraktekkan cara membuat aplikasi modular.

untuk menambahkan module baru, klik menu File > New > New Module

akan muncul Window Create New Module.
pada template klik Android Library, lalu isi form sesuai kebutuhan. untuk Package Name tidak harus sama dengan package name aplikasi utama, karena ini hanya package name bukan application id jadi tidak berpengaruh pada perilisan aplikasi di PlayStore.
oh iya kenapa disini kita pilih Android Library bukannya kita mau bikin module ? sebenarnya Library dan Module itu konsepnya sama, Library adalah salah satu contoh Module.

jika sudah klik Finish, maka akan muncul satu folder di root project dengan nama yang kita tentukan sebelumnya.

disini module kita masih kosong, tidak ada Activity maupun resources didalamnya. maka kita perlu menambahkan nya sendiri jika kita ingin module kita memuat Activity atau Fragment, kita juga tidak bisa mengambil Resources values maupun drawable diluar module kita.

tapi kita masih bisa terhubung dengan class diluar module kita dengan menghubungkan module kita ke module lain yang kita butuhkan classnya. cara menghubungkannya adalah dengan menginstall module nya ke build.gradle module yang kita tuju dengan code sebagai berikut :

implementation project(path : ":namamodule")

sesuaikan dengan nama module kalian.
kita hanya bisa menghubungkan satu arah antar module, kita tidak bisa menghubungkan dua arah karena bisa menyebabkan error pada gradle karena akan ada task gradle yang berulang.
jadi disini hanya ada peran module sebagai consumer atau penyedia fungsi, tidak bisa berperan ganda sebagai consumer dan penyedia fungsi.

lalu bagaimana caranya kita Intent ke Activity yang ada di module lain ? caranya adalah sebagai berikut :

val intent : Intent?
try {
     intent = Intent(this,Class.forName("com.saifur.mylibrary.CobaActivity"))
     startActivity(intent)
} catch (e : ClassNotFoundException) {
     e.printStackTrace()
}

sesuaikan package dan nama classnya, sebelumnya kita wajib menginstall modulenya atau jika tidak maka classnya tidak akan terdeteksi dan akan ada error ClassNotFoundException.

Lalu bagaimana implementasinya jika kita ingin menggunakan Fragment dari module lain ? caranya adalah sebagai berikut :

try {
     val fragment = Class.forName(className).newInstance() as Fragment
     supportFragmentManager.commit {
        replace(R.id.frame_layout, fragment)
     }
} catch (e: ClassNotFoundException) {
     e.printStackTrace()
}

kita tinggal mem parse class nya ke Fragment.

Sekarang bagaimana cara memasang module ke aplikasi lain ?
ada 3 cara memasangnya yaitu dengan meng-copas folder modulenya, mengcompile module nya ke file *.aar, dan install melalui dependency manager.

Kita akan membahas cara install dengan copas folder.
kita hanya perlu meng copy paste kan folder yang berisikan module ke aplikasi yang mau kita install.
paste kan di folder root projectnya. disini saya mencontohkan module katalog

buka projectnya, lalu edit file settings.gradle. tambahkan kode sebagai berikut di bagian bawah.

include ':katalog'

sesuaikan dengan nama module kalian. lalu re-sync gradle pada project.

maka module nya akan muncul di sini.

setelah itu install modulenya di build.gradle (app) seperti cara di atas

implementation project(path:":katalog")

re-sync gradle dan jika tidak ada error berarti module sudah terpasang di aplikasi anda.

sekarang bagaimana caranya menginstall module dengan file *.aar ?

kita menuju tab Gradle pada bagian kanan Android Studio. maka akan muncul daftar task gradle.

Jika tidak muncul lakukan langkah sebagai berikut :

pergi ke Setting / Preferences Android Studio lalu pergi ke bagian Experimental. lalu uncheck “Do not build Gradle task list during Gradle sync”

re-sync gradle dan task nya pasti akan muncul.

kembali ke topik, untuk mengcompile module ke *.aar double klik task assemble pada Tasks > build > assemble

tunggu sampai proses berhasil dijalankan, jika build berhasil file hasil compile ada di folder {module mu}/build/outputs/aar. akan ada 2 versi aar yaitu versi debug dan release, gunakan versi releasenya saja.

cara pasangnya adalah dengan meng copy paste file *.aar nya ke dalam folder app/libs di aplikasi yang dituju. lalu pada build.gradle (app) beri implementation untuk memasang file aar dari folder libs.

implementation fileTree(include: ['*.aar'], dir: 'libs')

lalu re-sync gradle nya.

apakah proses pemasangan module sudah selesai ? masih belum, ada satu langkah lagi yaitu pastikan library yang terinstall di module terinstall juga di aplikasi yang dituju atau kalau tidak aplikasi akan crash karena library yang diminta tidak ada.

ini terjadi karena saat kita mengcompile library ke aar, library-library yang terinstall di module tidak ikut tercompile. berbeda dengan meng copas folder tidak mengharuskan menginstall library di aplikasi yang dituju karena library yang terinstall di module ikut tercopas bersamaan dengan module.

kurang lebih seperti itu penjelasan saya tentang modular di Android.

konsep modular ini sudah dipakai di banyak startup di dalam maupun luar negeri, jadi kita sebagai Android Developer sangat perlu mempelajarinya karena hal ini membuat kodingan kita lebih testable, clean, dan readable.

Published by Ahmad Saifur Ridlo

Android Developer at Algostudio.net

Leave a Reply

Your email address will not be published. Required fields are marked *