Panduan ini mencakup praktik terbaik dan arsitektur yang direkomendasikan untuk membuat aplikasi yang tangguh dan berkualitas tinggi.
Pengalaman pengguna aplikasi seluler
Aplikasi Android standar memuat beberapa komponen aplikasi, termasuk aktivitas, fragmen, layanan, penyedia konten, dan penerima siaran. Anda mendeklarasikan sebagian besar komponen aplikasi ini di manifes aplikasi. Android OS kemudian menggunakan file ini untuk menentukan cara mengintegrasikan aplikasi Anda ke dalam keseluruhan pengalaman pengguna di perangkat. Mengingat bahwa aplikasi Android standar mungkin berisi beberapa komponen dan bahwa pengguna sering berinteraksi dengan beberapa aplikasi dalam periode waktu yang singkat, aplikasi perlu beradaptasi dengan berbagai jenis alur kerja dan tugas yang dikelola pengguna.
Perlu diingat bahwa ada keterbatasan resource pada perangkat seluler, jadi sistem operasi mungkin perlu menghentikan beberapa proses aplikasi sewaktu-waktu agar proses aplikasi lain dapat berjalan.
Mengingat kondisi lingkungan ini, komponen aplikasi Anda dapat diluncurkan secara terpisah dan tidak berurutan. Selain itu, sistem operasi atau pengguna dapat menghancurkan proses ini kapan saja. Karena peristiwa ini tidak berada di bawah kendali Anda, sebaiknya Anda tidak menyimpan atau mempertahankan data atau status aplikasi apa pun di komponen aplikasi Anda, dan komponen aplikasi tidak boleh saling bergantung.
Prinsip arsitektur umum
Jika Anda tidak disarankan menggunakan komponen aplikasi untuk menyimpan data dan status aplikasi, bagaimana sebaiknya Anda mendesain aplikasi?
Seiring bertambahnya ukuran aplikasi Android, penting untuk menentukan arsitektur yang memungkinkan aplikasi melakukan penskalaan, meningkatkan keandalan aplikasi, dan membuat aplikasi lebih mudah diuji.
Arsitektur aplikasi menentukan batas antara bagian aplikasi dan tanggung jawab yang harus dimiliki setiap bagian. Untuk memenuhi kebutuhan yang disebutkan di atas, Anda harus mendesain arsitektur aplikasi untuk mengikuti beberapa prinsip khusus.
Pemisahan fokus
Prinsip paling penting yang perlu diikuti adalah pemisahan
fokus.
Menulis semua kode Anda dalam sebuah
Activity
atau
Fragment
adalah sebuah kesalahan umum. Class berbasis UI ini hanya boleh
memuat logika yang menangani UI dan interaksi sistem operasi. Dengan menjaga
class tersebut seramping mungkin, Anda dapat menghindari banyak masalah yang terkait dengan
siklus proses komponen, dan meningkatkan kemampuan pengujian class ini.
Perlu diingat bahwa Anda bukanlah pemilik implementasi Activity
dan Fragment
.
Sebaliknya, keduanya hanyalah class perekat yang merepresentasikan kontrak antara
Android OS dan aplikasi Anda. OS dapat menghancurkan class tersebut sewaktu-waktu berdasarkan interaksi
pengguna atau karena kondisi sistem seperti kekurangan memori. Untuk memberikan
pengalaman pengguna yang memuaskan dan pengalaman pemeliharaan aplikasi yang lebih mudah dikelola, sebaiknya minimalkan dependensi Anda terhadap class tersebut.
Menjalankan UI dari model data
Prinsip penting lainnya adalah sebaiknya Anda menjalankan UI dari model data, terutama model persisten. Model data mewakili data aplikasi dan tidak bergantung pada elemen UI dan komponen lainnya dalam aplikasi Anda. Artinya, modul tersebut tidak terkait dengan UI dan siklus proses komponen aplikasi, tetapi akan tetap dihancurkan saat OS memutuskan untuk menghapus proses aplikasi dari memori.
Model persisten ideal karena alasan berikut:
Pengguna Anda tidak kehilangan data jika OS Android menghancurkan aplikasi untuk mengosongkan resource.
Aplikasi Anda terus berfungsi saat koneksi jaringan tidak stabil atau tidak tersedia.
Jika Anda mendasarkan arsitektur aplikasi pada class model data, aplikasi Anda akan lebih mudah diuji dan andal.
Satu sumber tepercaya
Saat jenis data baru ditentukan di aplikasi, Anda harus menetapkan Satu Sumber Tepercaya (SST) ke jenis data tersebut. SST adalah pemilik data tersebut, dan hanya SST yang dapat mengubah atau memutasikannya. Untuk melakukannya, SST mengekspos data menggunakan jenis yang tidak dapat diubah. Jika perlu memodifikasi data tersebut, SST mengekspos fungsi atau menerima peristiwa yang dapat dipanggil oleh jenis lain.
Pola ini memberikan beberapa manfaat:
- Pola ini memusatkan semua perubahan pada jenis data tertentu di satu tempat.
- Pola ini melindungi data sehingga jenis lain tidak dapat mengutak-atiknya.
- Pola ini membuat perubahan pada data lebih mudah dilacak. Dengan demikian, bug lebih mudah ditemukan.
Dalam aplikasi yang mengutamakan versi offline, sumber tepercaya untuk data aplikasi biasanya adalah database. Dalam beberapa kasus lain, sumber tepercaya dapat berupa ViewModel atau bahkan UI.
Aliran Data Searah
Prinsip satu sumber tepercaya sering digunakan dalam panduan kami dengan pola Aliran Data Searah (UDF). Di UDF, status hanya mengalir dalam satu arah. Aliran data dalam arah yang berlawanan akan diubah oleh Peristiwa.
Di Android, status atau data biasanya mengalir dari jenis hierarki yang cakupannya lebih tinggi ke hierarki dengan cakupan yang lebih rendah. Peristiwa biasanya dipicu dari jenis cakupan yang lebih rendah hingga mencapai SST untuk jenis data yang sesuai. Misalnya, data aplikasi biasanya mengalir dari sumber data ke UI. Peristiwa pengguna seperti penekanan tombol mengalir dari UI ke SST tempat data aplikasi diubah dan diekspos dalam jenis yang tidak dapat diubah.
Pola ini menjamin konsistensi data dengan lebih baik, tidak terlalu rentan terhadap error, lebih mudah di-debug, dan menghadirkan semua manfaat pola SST.
Arsitektur aplikasi yang direkomendasikan
Bagian ini menunjukkan cara menyusun aplikasi berdasarkan praktik terbaik yang direkomendasikan.
Dengan mempertimbangkan prinsip arsitektur umum yang disebutkan di bagian sebelumnya, setiap aplikasi harus memiliki setidaknya dua lapisan:
- Lapisan UI yang menampilkan data aplikasi di layar.
- Lapisan data yang berisi logika bisnis aplikasi Anda dan mengekspos data aplikasi.
Anda dapat menambahkan lapisan tambahan yang disebut lapisan domain untuk menyederhanakan dan menggunakan kembali interaksi antara lapisan UI dan data.

Arsitektur Aplikasi Modern
Arsitektur Aplikasi Modern ini mendorong penggunaan teknik berikut, antara lain:
- Arsitektur reaktif dan berlapis.
- Aliran Data Searah (UDF) di semua lapisan aplikasi.
- Lapisan UI dengan holder status untuk mengelola kompleksitas UI.
- Coroutine dan aliran.
- Praktik terbaik injeksi dependensi.
Untuk informasi selengkapnya, lihat bagian berikut, halaman Arsitektur lainnya dalam daftar isi, dan halaman rekomendasi yang berisi ringkasan praktik terbaik yang paling penting.
Lapisan UI
Peran lapisan UI (atau lapisan presentasi) adalah menampilkan data aplikasi di layar. Setiap kali data berubah, baik karena interaksi pengguna (seperti menekan tombol) atau input eksternal (seperti respons jaringan), UI harus diupdate untuk mencerminkan perubahan tersebut.
Lapisan UI terdiri dari dua hal:
- Elemen UI yang merender data di layar. Anda membuat elemen ini menggunakan fungsi View atau Jetpack Compose.
- Pemegang status (seperti class ViewModel ) yang menyimpan data, mengeksposnya ke UI, dan menangani logika.

Untuk mempelajari lapisan ini lebih lanjut, lihat halaman lapisan UI.
Lapisan data
Lapisan data aplikasi berisi logika bisnis. Logika bisnis adalah yang memberikan nilai bagi aplikasi Anda—logika bisnis terdiri dari aturan yang menentukan cara aplikasi Anda membuat, menyimpan, dan mengubah data.
Lapisan data terdiri dari repositori yang masing-masing dapat berisi nol hingga banyak
sumber data. Anda harus membuat class repositori untuk setiap jenis data
yang ditangani di aplikasi Anda. Misalnya, Anda mungkin membuat class MoviesRepository
untuk data yang berhubungan dengan film, atau class PaymentsRepository
untuk data
yang terkait dengan pembayaran.

Class repositori bertanggung jawab atas tugas-tugas berikut:
- Mengekspos data ke seluruh aplikasi.
- Memusatkan perubahan pada data.
- Menyelesaikan konflik antara beberapa sumber data.
- Mengabstraksi sumber data dari bagian aplikasi lainnya.
- Berisi logika bisnis.
Setiap class sumber data harus memiliki tanggung jawab untuk menangani hanya satu sumber data, yang dapat berupa file, sumber jaringan, atau database lokal. Class sumber data adalah jembatan antara aplikasi dan sistem untuk operasi data.
Untuk mempelajari lapisan ini lebih lanjut, lihat halaman lapisan data.
Lapisan domain
Lapisan domain adalah lapisan opsional yang berada di antara lapisan UI dan data.
Lapisan domain bertanggung jawab untuk mengenkapsulasi logika bisnis yang kompleks, atau logika bisnis sederhana yang digunakan kembali oleh beberapa ViewModels. Lapisan ini bersifat opsional karena tidak semua aplikasi memiliki persyaratan ini. Sebaiknya hanya gunakan jika diperlukan—misalnya, untuk menangani kompleksitas atau mendukung penggunaan kembali.

Class di lapisan ini biasanya disebut kasus penggunaan atau pemicu interaksi. Setiap kasus
penggunaan harus memiliki tanggung jawab atas fungsi tunggal. Misalnya, aplikasi
Anda dapat memiliki class GetTimeZoneUseCase
jika beberapa ViewModel bergantung pada zona
waktu untuk menampilkan pesan yang tepat di layar.
Untuk mempelajari lapisan ini lebih lanjut, lihat halaman lapisan domain.
Mengelola dependensi antarkomponen
Class di aplikasi Anda bergantung pada class lain agar berfungsi dengan baik. Anda dapat menggunakan salah satu pola desain berikut untuk mengumpulkan dependensi class tertentu:
- Injeksi dependensi (DI): Injeksi dependensi memungkinkan class untuk menentukan dependensi tanpa perlu menyusunnya. Saat waktu proses, kelas lain bertanggung jawab untuk menyediakan dependensi-dependensi ini.
- Pencari lokasi: Pola pencari lokasi menyediakan registry tempat class dapat memperoleh dependensinya, bukan menyusunnya.
Kedua pola ini memungkinkan Anda menskalakan kode karena keduanya memberikan pola yang jelas untuk mengelola dependensi tanpa menduplikasi kode atau menambahkan kompleksitas. Selain itu, keduanya memungkinkan Anda beralih dengan cepat antara implementasi pengujian dan produksi.
Sebaiknya gunakan pola injeksi dependensi berikut dan gunakan library Hilt pada aplikasi Android. Hilt menyusun objek dengan cara menelusuri hierarki dependensi, menyediakan jaminan waktu kompilasi pada dependensi, dan membuat penampung dependensi untuk class framework Android.
Praktik terbaik umum
Pemrograman adalah bidang kreatif, begitu juga pembuatan aplikasi Android. Ada banyak cara untuk menyelesaikan masalah; Anda dapat mengomunikasikan data antara beberapa aktivitas atau fragmen, mengambil data jarak jauh dan mempertahankannya secara lokal untuk mode offline, atau menangani sejumlah skenario umum lainnya yang ditemukan oleh aplikasi yang tidak umum.
Meskipun rekomendasi berikut tidak wajib diikuti, dalam sebagian besar kasus, mengikuti rekomendasi berikut akan membuat code base Anda lebih tangguh, dapat diuji, dan mudah dipelihara dalam jangka panjang:
Jangan simpan data di komponen aplikasi.
Hindari menetapkan titik entri aplikasi Anda—seperti aktivitas, layanan, dan penerima siaran—sebagai sumber data. Komponen ini seharusnya hanya berkoordinasi dengan komponen lain untuk mengambil subset data yang relevan dengan titik entri tersebut. Setiap komponen aplikasi memiliki masa aktif yang singkat, bergantung pada interaksi pengguna dengan perangkatnya dan respons keseluruhan kesehatan sistem saat ini.
Mengurangi dependensi di class Android.
Komponen aplikasi Anda harus menjadi satu-satunya class yang mengandalkan API SDK
framework Android seperti Context
, atau
Toast
. Mengabstraksi class lain di
aplikasi Anda darinya membantu memudahkan pengujian dan mengurangi
penggabungan
dalam aplikasi Anda.
Buat batasan tanggung jawab yang jelas antara berbagai modul aplikasi Anda.
Misalnya, jangan menyebarkan kode yang memuat data dari jaringan di beberapa class atau paket pada code base Anda. Demikian pula, jangan menetapkan beberapa tanggung jawab yang tidak terkait—seperti data caching dan data binding—ke dalam class yang sama. Mengikuti arsitektur aplikasi yang direkomendasikan akan membantu Anda mengatasi ini.
Ekspos sesedikit mungkin dari setiap modul.
Misalnya, jangan tergoda untuk membuat pintasan yang mengekspos detail implementasi internal dari modul. Ini mungkin menghemat waktu dalam jangka pendek, tetapi Anda mungkin akan menanggung utang teknis berkali-kali lipat seiring berkembangnya codebase Anda.
Berfokus pada inti unik aplikasi Anda agar lebih menarik dari aplikasi lain.
Jangan memulai dari awal dengan menuliskan kode boilerplate yang sama berulang-ulang. Sebaliknya, fokuskan waktu dan energi Anda pada hal yang membuat aplikasi Anda unik, dan biarkan library Jetpack dan library rekomendasi lainnya menangani boilerplate berulang.
Pertimbangkan cara untuk menjadikan setiap bagian aplikasi mudah diuji secara terpisah.
Misalnya, memiliki API yang didefinisikan dengan baik untuk mengambil data dari jaringan akan mempermudah pengujian modul yang mempertahankan data tersebut di database lokal. Sebaliknya, jika Anda mencampur logika dari kedua modul ini di satu tempat, atau mendistribusikan kode jaringan Anda di seluruh code base, pengujian akan menjadi jauh lebih sulit—bahkan mustahil—untuk dilakukan secara efektif.
Jenis bertanggung jawab atas kebijakan serentaknya.
Jika suatu jenis menjalankan tugas pemblokiran yang berjalan lama, jenis tersebut harus bertanggung jawab untuk memindahkan komputasi tersebut ke thread yang tepat. Jenis tertentu mengetahui jenis komputasi yang dilakukannya dan di thread mana komputasi tersebut harus dieksekusi. Jenis harus main-safe, yang berarti jenis tersebut aman untuk dipanggil dari thread utama tanpa memblokirnya.
Pertahankan sebanyak mungkin data yang relevan dan baru.
Dengan demikian, pengguna dapat menikmati fungsionalitas aplikasi Anda meski perangkat mereka berada dalam mode offline. Ingat, tidak semua pengguna Anda menyukai konektivitas berkecepatan tinggi, dan konstan—dan meskipun mereka menyukainya, mereka bisa mendapatkan penerimaan sinyal yang buruk di tempat yang ramai.
Manfaat Arsitektur
Menerapkan Arsitektur yang baik di aplikasi Anda akan memberikan banyak manfaat bagi tim engineer dan tim project:
- Arsitektur yang baik dapat meningkatkan pemeliharaan, kualitas, dan keandalan aplikasi secara keseluruhan.
- Arsitektur yang baik memungkinkan aplikasi untuk melakukan penskalaan. Lebih banyak orang dan lebih banyak tim dapat berkontribusi pada codebase yang sama dengan sedikit konflik kode.
- Arsitektur yang baik membantu orientasi. Saat Arsitektur memberikan konsistensi pada project Anda, anggota tim baru dapat langsung bekerja dengan lebih cepat dan lebih efisien dalam waktu singkat.
- Pengujiannya lebih mudah. Arsitektur yang baik mendorong jenis yang lebih sederhana yang umumnya lebih mudah diuji.
- Bug dapat diselidiki secara metodis dengan proses yang didefinisikan dengan baik.
Berinvestasi pada Arsitektur juga berdampak langsung pada pengguna Anda. Mereka mendapatkan manfaat dari aplikasi yang lebih stabil, dan lebih banyak fitur karena tim engineer yang lebih produktif. Namun, Arsitektur juga memerlukan investasi awal. Untuk membantu Anda menentukan waktu ini bagi perusahaan, lihat studi kasus yang berisi kisah sukses perusahaan lain saat memiliki arsitektur yang baik di aplikasinya.
Contoh
Contoh Google berikut menunjukkan arsitektur aplikasi yang baik. Jelajahi untuk melihat panduan ini dalam praktik:
Microsoft memberdayakan orang dan organisasi untuk bekerja, mempelajari, mengatur, terhubung, dan berkreasi melalui aplikasi Microsoft 365 terkemuka mereka. Untuk mencapainya, mereka memahami pentingnya memberikan pengalaman produktivitas yang optimal bagi pelanggan, di semua perangkat yang mereka gunakan. Cuvva membuat asuransi jauh lebih baik
dengan memberi Anda cara yang benar-benar fleksibel untuk mengelola perlindungan, semuanya dari ponsel Anda.
Engineer Android di Cuvva menghabiskan waktu untuk merancang ulang aplikasi mereka
dan memutuskan Square membantu jutaan penjual menjalankan
bisnis mereka – mulai dari pemrosesan kartu kredit yang aman hingga solusi tempat penjualan (POS) hingga
menyiapkan toko online gratis. Square telah beralih ke UI deklaratif selama
beberapa waktu, tetapi Twitter adalah salah satu platform media sosial yang paling banyak digunakan, tempat pengguna dapat melihat apa yang terjadi di dunia pada waktu tertentu. Tim engineer mulai menggunakan Jetpack Compose untuk memodernisasi
sistem desain mereka. Karena Monzo adalah bank dan aplikasi yang menawarkan
layanan keuangan digital. Misi mereka adalah menghasilkan uang
bagi semua orang. Sistem desain Monzo mulai menyimpang dari Desain Material sehingga
mereka menginginkan cara mudah untuk menulis dan ShareChat is a leading social media platform in India that allows users to share their opinions, document their lives, and make new friends in their native language. The standard Red Up Green Down color scheme that many wealth management app users take for granted can be very problematic for colorblind users and those with color vision deficiency.The Futubull team is embracing users’ needs by making concrete improvements so that everyone can grasp the key to wealth. TikTok, the world’s community-driven entertainment destination, brings over 1 billion people together from around the world to discover, create and share content they love. OkCredit is a credit account management app for millions of shop owners and their customers in India. With 140M transactions month over month, and 50M+ downloads, last year alone saw OkCredit recording $50 billion worth of transactions on the app. Operating at such a huge scale scale, OkCredit created a smooth and seamless experience for all their users by focusing on reducing ANRs and improving the app startup time. Lyft is committed to app excellence. They have to be. For a rideshare app — providing a vital, time-sensitive service to millions of drivers and riders every day — a slow or unresponsive app adds unacceptable friction. Josh is a short-video app from India, launched in 2020. One of the fastest growing short-video apps with over 124 million MAUs, optimizing it across a range of devices (high, mid, low end) and maintaining a standard experience across all of them is critical for their success. Improving app startups time and making the app responsive helped them achieve success. Microsoft Lens increases developer productivity using CameraX Zomato is an Indian multinational restaurant aggregator and food delivery company serving customers across 500 cities in India alone. In order to launch new features on their Android app, Headspace spent 8 months refactoring their architecture and rewriting in Kotlin. Learn how this reboot helped their business grow. Google Photos is the home for your memories, and their development team believes people should be able to enjoy those memories across all devices. Learn how Duolingo made the business decision to focus on Android performance and how they improved developer productivity and scaled their business. Mercari allows millions of people to shop and sell almost anything. The company was founded in 2013 in Japan, and it now is the largest smartphone-focused C2C marketplace in Japan. Google Duo is a simple, high quality video calling app for everyone. With the increase of people being at home during the Covid-19 pandemic, the Duo team saw a significant increase in people using the app to stay connected with friends & family, school and work. Headspace drive business growth by investing in Android app quality. SmartNews helps millions of people discover their world everyday by sharing timely news from a diverse set of news sources. Twitter is one of the most widely used social media platforms where users can see what’s happening in the world at any given moment. Delight Room Alarmy is an alarm app that can be turned off only when the pre-selected activities, such as taking a photo, solving a math problem, shaking phone, etc., are performed by the user. The Google Home app helps set up, manage, and control your Google Home, Google Nest, and Chromecast devices—plus thousands of connected home products like lights, cameras, thermostats, and more. Truecaller is an app that offers caller identification, call blocking, chat messaging and organized inbox. The app has a basic offering and a premium version which is ad-free and has a variety of unlocked features like advanced spam blocking and call recording.Microsoft Outlook, Teams, dan Office meningkatkan retensi dan pengguna aktif dengan perangkat layar besar
Cuvva mem-build lebih cepat dan berkualitas lebih tinggi dengan Compose
Square melihat peningkatan produktivitas dengan Compose
Twitter melihat peningkatan efisiensi dan kecepatan developer dengan Compose
Monzo mem-build aplikasi yang lebih andal dan berkualitas lebih tinggi dengan Compose
ShareChat addresses Jank issues to increase feed scrolling by 60%
The Key to Wealth for Everyone
TikTok Optimizes User Experience with Android Tools
OkCredit’s average merchant transaction goes up by 30% after reducing ANR
Lyft improves Android app startup time for drivers by 21%
Josh sees increased customer retention by improving app startup time by 30%
Microsoft Lens increases developer productivity using CameraX
Increasing app speed by 30%: a key ingredient in Zomato’s growth recipe
Headspace's Android reboot increases monthly active users by 15%
Google Photos increased daily active users by building for large screens
Duolingo refactors on Android with MVVM and Jetpack libraries
Mercari improves UI development productivity by 56% with Jetpack Compose
Google Duo sees increased engagement and improved ratings by optimizing for larger screens
Headspace drive business growth by investing in Android app quality
SmartNews reduces lines of code by 20% and improves team morale with Kotlin
Twitter increases developer productivity and code reliability with Kotlin
Delight Room increased 90% of its organic US users with Play Console
Google Home reduces #1 cause of crashes by 33%
Truecaller brings ~40% subscribers back with real time developer notifications
Tidak ada rekomendasi untuk saat ini.
Coba login ke Akun Google Anda.