Transisi Arsitektur Boot Image pada Android 13 (API 33)
Sejak rilis Android 13, Google memperkenalkan perubahan struktural mendasar pada tata letak (layout) partisi boot image perangkat seluler. Dalam rancangan arsitektur Android tradisional (Boot Header versi 0 hingga versi 3), seluruh komponen inisialisasi awal — meliputi biner kernel Linux (Image/zImage), ramdisk generic (CPIO archive), Device Tree Blob (DTB), dan signature header — dipadatkan bersama ke dalam satu partisi biner tunggal berlabel boot.img.
Pendekatan gabungan tersebut menimbulkan komplikasi serius ketika Google menerapkan inisiatif Generic Kernel Image (GKI 2.0). Melalui program GKI, Google mendistribusikan biner kernel resmi yang seragam bagi seluruh ekosistem perangkat Android berbasis arsitektur ARM64. Untuk memungkinkan pembaruan kernel GKI berkala secara modular tanpa mengganggu konfigurasi ramdisk tahap awal, Google memisahkan ramdisk ke dalam partisi independen baru yang dinamakan init_boot.
Struktur Partisi boot.img vs init_boot.img
Pada spesifikasi Boot Header Version 4 yang menjadi standar wajib pada perangkat yang diluncurkan dengan Android 13 ke atas, partisi boot dan init_boot memiliki pembagian tanggung jawab yang tegas:
| Elemen Biner | Tata Letak Android 12 (Boot v3/v4 Lama) | Tata Letak Android 13+ (Boot v4 Modern) | Tujuan Arsitektural Pemisahan |
|---|---|---|---|
| Kernel Image | boot.img |
boot.img |
Memuat biner kernel murni Google GKI (Generic Kernel Image). |
| Generic Ramdisk | boot.img |
init_boot.img |
Memuat /init tahap pertama, skrip init.rc, dan tabel mount. |
| Vendor Ramdisk | vendor_boot.img |
vendor_boot.img |
Memuat driver modul kernel pihak ketiga (.ko) yang dibutuhkan saat early boot. |
| Device Tree (DTB) | vendor_boot.img |
vendor_boot.img |
Mendeskripsikan konfigurasi memori alamat bus perangkat keras SoC. |
Peringatan Kritis: Verifikasi Partisi Ramdisk pada Android 13+
Melakukan patching biner atau injeksi modul modifikasi pada partisi boot.img pada perangkat berbasis Android 13+ tidak akan memberikan efek atau justru menyebabkan bootloop. Patching ramdisk tahap awal wajib dieksekusi secara tepat pada partisi init_boot.img.
Dekomposisi Ramdisk dan Alur Eksekusi First-Stage Init
Proses inisialisasi boot Android berjalan dalam model dual-stage init. Pemisahan generic ramdisk ke partisi init_boot secara langsung memengaruhi cara kernel mengeksekusi tahapan first-stage init:
- Bootloader ABL memuat kernel dari partisi
bootdan ramdisk dari partisiinit_bootke dalam alamat memori fisik yang berbeda. - Kernel Linux dieksekusi, menginisialisasi subsistem CPU dan scheduler, lalu mem-parsing ramdisk generic ke dalam
rootfsvirtual di RAM. - Proses pertama
/system/bin/init(first-stage init) dijalankan. Biner ini me-mount filesystem virtual darurat:/proc,/sys, dan/dev. - First-stage init memuat tabel pemetaan partisi perangkat (device-mapper), menginisialisasi pustaka
libavbuntuk memverifikasi partisisystem, lalu me-mount partisi sistem sesungguhnya ke/system. - Perangkat melakukan transisi
switch_rootdari memory ramdisk ke penyimpanan partisi internal flash yang sebenarnya.
Evolusi First-Stage Mount dan Penguraian fstab
Salah satu fungsi paling krusial yang ditangani oleh generic ramdisk di dalam init_boot adalah First-Stage Mount. Pada masa lampau, proses inisialisasi kernel mem-parsing argumen baris perintah statis untuk me-mount root filesystem. Pada Android modern, first-stage init membaca file tabel mount hardware (fstab) yang disediakan melalui Device Tree Blob (DTB) pada /proc/device-tree/firmware/android/fstab atau dari ramdisk vendor.
Inisialisasi tahap awal mengidentifikasi apakah partisi sistem menggunakan enkripsi dm-verity atau format partisi dinamis super via modul dm-linear. Tanpa file biner /init dan pustaka penunjang di dalam init_boot, kernel Linux yang telah berhasil booting tidak akan mampu menemukan partisi blok flash penyimpanan internal dan akan mengalami kondisi kernel panic: VFS: Unable to mount root fs.
Mekanisme Early SELinux Policy Loading pada First-Stage Init
Selain me-mount partisi sistem, first-stage init bertanggung jawab atas inisialisasi awal subsistem keamanan SELinux. Sebelum biner apa pun dari partisi sistem dieksekusi, proses init di dalam generic ramdisk memuat file kebijakan biner dasar plat_sepolicy.cil ke dalam memori kernel Linux. Inisialisasi awal ini memastikan bahwa transisi dari lingkungan ramdisk sementara ke sistem operasi utama terlindungi dari potensi serangan injeksi file berbahaya. Setelah kebijakan dimuat, init beralih ke mode enforcing dan melabeli kembali node perangkat di direktori /dev sesuai aturan tipe keamanan yang sah.
# Memeriksa skema partisi perangkat untuk memastikan keberadaan init_boot
adb shell ls -la /dev/block/by-name/ | grep -E "boot|init_boot"
# Membongkar struktur header partisi init_boot menggunakan unpack_bootimg resmi AOSP
unpack_bootimg --boot_img init_boot.img --out out_init_boot/
# Memeriksa isi arsip CPIO generic ramdisk yang diekstrak
cd out_init_boot/
ls -la
file ramdisk
mkdir extracted_ramdisk && cd extracted_ramdisk
cpio -idmv < ../ramdisk
Analisis Header Format Boot Image v4
Header boot image versi 4 tidak lagi memuat kolom ukuran ramdisk jika partisi tersebut adalah boot.img pada sistem GKI murni. Struktur header biner didefinisikan secara resmi pada repositori AOSP system/tools/mkbootimg/include/bootimg/bootimg.h. Pada partisi init_boot, magic header tetap menggunakan penanda ASCII ANDROID! (8 byte), namun offset pointer diarahkan secara eksklusif untuk mendeskripsikan blok ramdisk generic.
Kesimpulan Riset Arsitektur Boot Image
Inovasi pemisahan partisi init_boot pada Android 13+ menunjukkan komitmen Google dalam mempertahankan interoperabilitas biner Linux kernel tunggal (GKI) di seluruh portofolio manufaktur ARM64. Bagi periset firmware dan pengembang AOSP, memahami lokalisasi ramdisk generic pada init_boot merupakan prasyarat mutlak untuk keberhasilan analisis audit proses inisialisasi sistem.