Saat Anda mengetuk "Instal" pada file APK atau mengunduh aplikasi dari Play Store, serangkaian operasi kompleks dimulai di belakang layar. Apa yang tampak sebagai bilah kemajuan sederhana sebenarnya mewakili lusinan langkah yang melibatkan penguraian paket, verifikasi kriptografi, manajemen izin, ekstraksi file, dan optimalisasi kode. Memahami proses ini membantu menjelaskan mengapa instalasi terkadang gagal dan apa yang dapat Anda lakukan untuk mengatasinya.
Dalam artikel ini, kita akan membahas setiap langkah utama dalam alur instalasi Android, mulai dari saat sistem menerima APK hingga titik di mana aplikasi siap diluncurkan.
Langkah 1: Memulai Instalasi
Proses instalasi dimulai secara berbeda tergantung pada sumbernya:
- Mainkan Toko: Aplikasi Play Store mengunduh APK (atau APK terpisah) dan memanggil penginstal paket sistem dengan hak istimewa yang mengabaikan beberapa konfirmasi pengguna.
- Memuat samping: Saat Anda membuka file APK, Android meluncurkan aktivitas penginstal paket. Di Android 8.0 dan yang lebih baru, aplikasi penginstalan harus memiliki izin "Instal aplikasi tidak dikenal" untuk sumber spesifiknya.
- ADB: Perintah adb install berkomunikasi langsung dengan layanan manajer paket melalui USB, melewati penginstal grafis sepenuhnya.
Terlepas dari sumbernya, semua instalasi pada akhirnya mencapai layanan sistem yang sama: Layanan Manajer Paket (PMS). Ini adalah otoritas pusat untuk semua operasi paket di Android.
Langkah 2: Penguraian Paket
Sebelum melakukan hal lain, sistem perlu memahami apa yang akan diinstal. PackageManagerService memanggil PaketParser untuk membaca file APK dan mengekstrak metadatanya.
Parser membaca file AndroidManifest.xml dari dalam APK. File XML biner ini berisi informasi penting:
- Nama paket: Pengidentifikasi unik untuk aplikasi (mis., com.example.myapp)
- Kode dan nama versi: Digunakan untuk menentukan apakah ini merupakan upgrade atau instalasi baru
- Versi SDK minimum dan target: Menentukan kompatibilitas dengan perangkat
- Izin yang dinyatakan: Baik izin yang diminta aplikasi maupun izin khusus yang ditentukannya
- Komponen: Aktivitas, layanan, penerima siaran, dan penyedia konten yang didaftarkan aplikasi
- Persyaratan Fitur perangkat keras dan perangkat lunak: seperti kamera, GPS, atau versi OpenGL tertentu
Jika format manifes salah atau struktur APK tidak valid, instalasi gagal pada tahap ini dengan pesan "Parse error". Ini adalah salah satu alasan paling umum mengapa APK yang di-sideload gagal dipasang.
Langkah 3: Pemeriksaan Kompatibilitas
Setelah manifes diurai, sistem akan melakukan serangkaian pemeriksaan kompatibilitas:
- Versi SDK: Jika minSdkVersion aplikasi lebih tinggi dari level API perangkat, penginstalan ditolak.
- Kompatibilitas ABI: Jika APK berisi pustaka asli, sistem akan memeriksa apakah pustaka tersebut cocok dengan arsitektur CPU perangkat. APK yang hanya berisi pustaka armeabi-v7a tidak akan diinstal pada perangkat khusus x86.
- Fitur yang diperlukan: Jika aplikasi menyatakan fitur perangkat keras yang diperlukan (seperti android.hardware.telephony), sistem akan memverifikasi bahwa perangkat mendukungnya.
- Penyimpanan yang tersedia: Sistem memeriksa apakah terdapat cukup ruang kosong untuk menginstal aplikasi, termasuk ruang untuk perpustakaan asli yang diekstrak dan file DEX yang dioptimalkan.
Langkah 4: Verifikasi Tanda Tangan
Ini adalah salah satu langkah paling penting dalam proses instalasi. Android memverifikasi tanda tangan kriptografi APK untuk memastikan integritas dan keasliannya.
Proses verifikasi bergantung pada skema penandatanganan yang ada:
Tanda Tangan V1 (Penandatanganan JAR)
Sistem memeriksa direktori META-INF/ untuk file tanda tangan (.SF, .RSA atau .DSA). Setiap file di APK diverifikasi berdasarkan intisari yang tercantum dalam manifes. Ini lambat karena setiap file harus di-hash satu per satu.
Tanda Tangan V2 (Skema Tanda Tangan APK v2)
Diperkenalkan di Android 7.0, skema ini menandatangani seluruh APK sebagai blob biner. Blok tanda tangan disisipkan di antara direktori pusat ZIP dan catatan direktori akhir pusat. Verifikasi jauh lebih cepat karena beroperasi pada byte mentah tanpa perlu mendekompresi entri individual.
Tanda Tangan V3 (Rotasi Kunci)
Tersedia mulai Android 9.0, V3 memperluas V2 dengan dukungan untuk rotasi tombol. Ini mencakup struktur bukti rotasi yang menghubungkan kunci penandatanganan lama dan baru, memungkinkan pengembang untuk mengubah kunci penandatanganan mereka sambil mempertahankan kompatibilitas pembaruan.
Tanda Tangan V4 (Inkremental)
Android 11 memperkenalkan V4 untuk instalasi tambahan. Ini memberikan tanda tangan berbasis pohon Merkle yang memungkinkan verifikasi setiap blok saat dialirkan ke perangkat.
Jika verifikasi tanda tangan gagal karena alasan apa pun, instalasi akan segera dibatalkan. Anda dapat memeriksa tanda tangan APK sebelum instalasi menggunakan Alat Pemverifikasi APK kami.
Perbarui Pencocokan Tanda Tangan
Jika aplikasi dengan nama paket yang sama telah diinstal, sistem akan melakukan pemeriksaan tambahan: sertifikat penandatanganan APK baru harus cocok dengan sertifikat instalasi yang ada. Hal ini mencegah pihak jahat mengganti aplikasi yang sah dengan versi yang telah dirusak. Jika tanda tangan tidak cocok, Anda akan melihat kesalahan "Aplikasi tidak diinstal: Paket bertentangan dengan paket yang ada dengan nama yang sama."
Langkah 5: Konfirmasi Pengguna
Untuk instalasi yang dipindahkan, sistem menampilkan dialog konfirmasi instalasi yang menunjukkan:
- Nama dan ikon aplikasi (diekstraksi dari sumber daya APK)
- Izin yang diminta aplikasi (pada versi Android yang lebih lama)
- Apakah ini instalasi baru atau pembaruan
- Peringatan apa pun tentang sumber aplikasi atau potensi risikonya
Di Android 12 dan yang lebih baru, layar konfirmasi lebih sederhana karena izin runtime diberikan satu per satu saat aplikasi pertama kali membutuhkannya, bukan saat penginstalan.
Langkah 6: Ekstraksi dan Penempatan File
Setelah pengguna mengonfirmasi (atau untuk penginstalan Play Store, secara otomatis), sistem mulai mengekstraksi dan menempatkan file:
Penyimpanan APK
File APK sendiri disalin ke /data/app/[package-name]-[random]/base.apk. Untuk instalasi APK terpisah, file tambahan seperti split_config.arm64_v8a.apk ditempatkan di samping APK dasar. APK asli di folder Unduhan tidak diubah atau dihapus.
Ekstraksi Perpustakaan Asli
Jika APK berisi perpustakaan asli (di direktori lib/, mereka diekstraksi ke /data/app/[package-name]-[random]/lib/[abi]/). Pada versi Android yang lebih baru, aplikasi dapat memilih untuk tetap mengompresi pustaka asli di dalam APK dan memuatnya secara langsung menggunakan android:extractNativeLibs="false", sehingga menghemat ruang penyimpanan.
Pembuatan Direktori Data
Sistem membuat direktori data pribadi aplikasi di /data/data/[package-name]/ (atau /data/user/0/[package-name]/ pada perangkat multi-pengguna). Direktori ini dimiliki oleh UID Linux unik yang ditetapkan ke aplikasi, memastikan tidak ada aplikasi lain yang dapat mengaksesnya tanpa hak akses root.
Langkah 7: Optimasi DEX
Langkah ini adalah saat Android mengubah bytecode aplikasi menjadi format yang dioptimalkan untuk perangkat keras spesifik perangkat. Prosesnya telah berkembang secara signifikan sepanjang sejarah Android:
Era Dalvik (Android 4.4 dan versi lebih lama)
Mesin virtual Dalvik asli menggunakan kompilasi Just-In-Time (JIT). Selama instalasi, file classes.dex dioptimalkan menjadi file ODEX yang berisi bytecode terverifikasi dan dioptimalkan. Ini relatif cepat tetapi berarti aplikasi berjalan lebih lambat saat runtime karena sebagian besar kode masih diinterpretasikan.
SENI dengan AOT (Android 5.0 hingga 6.0)
Android Runtime (ART) menggantikan Dalvik dan memperkenalkan kompilasi Ahead-Of-Time (AOT). Selama instalasi, seluruh bytecode DEX dikompilasi ke kode mesin asli. Hal ini membuat aplikasi berjalan lebih cepat namun secara signifikan meningkatkan waktu instalasi dan penggunaan penyimpanan. Beberapa aplikasi memerlukan waktu beberapa menit untuk dipasang.
Kompilasi Berpanduan Profil (Android 7.0+)
Android modern menggunakan pendekatan hybrid. Selama instalasi, hanya jalur startup penting yang dikompilasi. Saat pengguna menjalankan aplikasi, sistem mengumpulkan profil eksekusi yang mengidentifikasi jalur kode yang sering digunakan. Selama pemeliharaan menganggur (biasanya saat mengisi daya semalaman), sistem mengkompilasi jalur panas ini ke kode asli. Ini menyeimbangkan kecepatan instalasi, penggunaan penyimpanan, dan kinerja runtime.
Kode yang dikompilasi disimpan di /data/dalvik-cache/ atau di samping APK sebagai file .odex, .vdex, dan .art. File .vdex berisi kode DEX terverifikasi, file .odex berisi kode asli yang dikompilasi, dan file .art berisi gambar heap yang telah diinisialisasi sebelumnya untuk memulai lebih cepat.
Langkah 8: Pendaftaran Izin
PackageManagerService mendaftarkan izin dan komponen aplikasi yang dinyatakan ke sistem:
- Izin waktu instalasi (seperti INTERNET atau VIBRATE diberikan secara otomatis tanpa interaksi pengguna).
- Izin waktu proses (seperti CAMERA atau LOCATION didaftarkan tetapi tidak diberikan). The app must request them at runtime.
- Filter maksud didaftarkan sehingga sistem mengetahui aplikasi mana yang dapat menangani tindakan tertentu (seperti membuka URL atau berbagi konten).
- Penyedia konten terdaftar pada otoritasnya sehingga aplikasi lain dapat menanyakannya.
Langkah 9: Integrasi Sistem
Langkah terakhir mengintegrasikan aplikasi ke dalam sistem Android:
- Pembaruan basis data paket: Basis data paket sistem (/data/system/packages.xml diperbarui dengan informasi aplikasi baru, termasuk UID yang ditetapkan, izin, dan deklarasi komponen).
- Pemberitahuan peluncur: Peluncur layar beranda diberitahu tentang aplikasi baru sehingga dapat menampilkan ikon aplikasi.
- Siaran: Sistem mengirimkan siaran PACKAGE_ADDED, sehingga aplikasi lain dapat bereaksi terhadap instalasi baru (misalnya, aplikasi cadangan mungkin menjadwalkan pencadangan).
- Konteks SELinux: File aplikasi diberi label dengan konteks keamanan SELinux yang sesuai berdasarkan versi SDK target dan izin yang dinyatakan.
Mengapa Instalasi Gagal
Memahami alur instalasi membantu mendiagnosis kegagalan umum:
- "Kesalahan penguraian": APK rusak, tidak lengkap, atau format manifesnya salah. Hal ini sering terjadi pada unduhan yang tidak lengkap atau file yang dikonversi secara tidak benar.
- "Aplikasi tidak terpasang" (tanda tangan tidak cocok): Anda mencoba memperbarui aplikasi dengan APK yang ditandatangani dengan kunci berbeda. Anda harus uninstall versi yang ada terlebih dahulu.
- "Penyimpanan tidak mencukupi": Tidak cukup ruang untuk APK, pustaka yang diekstraksi, dan keluaran pengoptimalan DEX. Ruang sebenarnya yang dibutuhkan biasanya 2-3x ukuran APK.
- "Paket bertentangan dengan paket yang ada": Nama paket sama tetapi tanda tangannya berbeda. Umum saat beralih antara Play Store dan versi yang di-sideload.
- Penurunan versi diblokir: Secara default, Android mencegah pemasangan versi lama dibandingkan versi baru. ADB dapat melewati batas ini dengan perintah adb install -d.
Instalasi APK terpisah
Saat memasang APK terpisah (dari App Bundle), prosesnya sedikit berbeda. The system uses a instalasi berbasis sesi API:
- Sesi instalasi baru dibuat
- Setiap APK terpisah ditulis ke sesi
- Sesi ini dilakukan, memicu alur verifikasi penuh
- Semua pemisahan harus memiliki nama paket, kode versi, dan sertifikat penandatanganan yang cocok
Ini adalah mekanisme yang digunakan oleh penginstal XAPK dan alat seperti Penggabungan APKS ke APK untuk menangani instalasi multi-file.
Instalasi melalui ADB
Saat Anda menggunakan adb install, prosesnya melewati penginstal grafis tetapi mengikuti alur internal yang sama. ADB berkomunikasi dengan layanan manajer paket melalui koneksi soket. Ini mendukung tanda tambahan yang tidak tersedia melalui GUI:
- -r: Ganti aplikasi yang ada (izinkan instal ulang)
- -d: Izinkan penurunan versi
- -g: Segera berikan semua izin runtime
- -t: Izinkan pemasangan APK khusus pengujian
- --install-multiple: Instal APK terpisah dalam satu sesi
Apa Yang Terjadi Selama Penghapusan Instalasi
Untuk lebih lengkapnya, berikut ini yang terjadi jika aplikasi dihapus:
- Proses aplikasi terhenti
- APK dan perpustakaan yang diekstraksi dihapus dari /data/app/
- Direktori data pribadi aplikasi dihapus (kecuali jika pengguna memilih untuk menyimpan data)
- File cache DEX yang dikompilasi akan dihapus
- Basis data paket diperbarui
- Siaran PACKAGE_REMOVED dikirim
- Peluncur menghapus ikon aplikasi
Perlu diperhatikan bahwa file khusus aplikasi di penyimpanan eksternal (/Android/data/[package]/ dan /Android/obb/[package]/ juga dihapus di Android 10 dan yang lebih baru, berkat penerapan penyimpanan terbatas).
Mengapa Memahami PackageManager Menghemat Waktu Debugging
Proses instalasi Android adalah rangkaian pemeriksaan keamanan, operasi file, dan integrasi sistem yang diatur dengan cermat. Setiap langkah memiliki tujuan, mulai dari melindungi pengguna dari aplikasi yang dirusak hingga mengoptimalkan kinerja untuk perangkat keras tertentu. Saat penginstalan gagal, kesalahan biasanya menunjuk ke langkah tertentu dalam alur ini, dan memahami prosesnya membantu Anda mendiagnosis dan menyelesaikan masalah dengan cepat.
Menginstal dari Play Store, melakukan sideload APK secara manual, dan mendorong build dengan ADB, semua corong melalui pipeline dasar yang sama, yang memastikan setiap aplikasi di perangkat Anda telah diverifikasi, ditempatkan dengan benar, dan dioptimalkan untuk perangkat keras Anda.