Di Android 12, image boot
generik, yang disebut sebagai
Generic Kernel Image (GKI),
berisi ramdisk generik dan kernel GKI.
Untuk perangkat yang diluncurkan dengan Android 13, ramdisk generik dihapus dari image boot
dan ditempatkan di image init_boot
terpisah. Perubahan ini membuat image boot
hanya memiliki
kernel GKI.
Untuk mengupgrade perangkat yang terus menggunakan Android 12 atau versi kernel yang lebih lama, ramdisk generik tetap berada di tempatnya tanpa memerlukan image init_boot
baru.
Untuk membuat ramdisk generik, pindahkan resource khusus vendor dari ramdisk sehingga ramdisk generik hanya berisi init
tahap pertama dan file properti yang berisi informasi stempel waktu.
Di perangkat yang:
Jangan gunakan partisi
recovery
khusus, semua bit pemulihan dipindahkan dari ramdisk generik ke ramdiskvendor_boot
.Gunakan partisi
recovery
khusus, tidak ada perubahan pada ramdiskrecovery
yang diperlukan karena ramdiskrecovery
bersifat mandiri.
Arsitektur
Diagram berikut mengilustrasikan arsitektur untuk perangkat yang menjalankan Android 12 dan yang lebih tinggi.
Perangkat yang diluncurkan dengan Android 13 memiliki image
init_boot
baru yang berisi ramdisk generik.
Perangkat yang diupgrade dari Android 12 ke Android 13 menggunakan arsitektur yang sama seperti saat menggunakan Android 12.
Peluncuran dengan Android 13, tanpa pemulihan khusus
Gambar 1. Perangkat yang diluncurkan atau diupgrade ke Android 13, dengan GKI, tanpa pemulihan khusus.
Peluncuran dengan Android 13, pemulihan khusus dan A/B (ramdisk khusus)
Gambar 2. Perangkat yang meluncurkan atau mengupgrade ke Android 13, dengan GKI, pemulihan khusus, dan A/B.
Lihat gambar ini jika perangkat memiliki partisi recovery_a
dan recovery_b
.
Diluncurkan dengan Android 13, pemulihan khusus dan non-A/B (ramdisk khusus)
Gambar 3. Perangkat yang diluncurkan atau diupgrade ke Android 13, dengan GKI, pemulihan khusus dan non-A/B.
Lihat gambar ini jika perangkat memiliki partisi bernama recovery
tanpa akhiran slot.
Meluncurkan atau mengupgrade ke Android 12, tanpa pemulihan khusus
Gambar 4. Perangkat yang diluncurkan atau diupgrade ke Android 12, dengan GKI, tidak memiliki pemulihan khusus.
Meluncurkan atau mengupgrade ke Android 12, pemulihan khusus dan A/B (ramdisk khusus)
Gambar 5. Perangkat yang meluncurkan atau mengupgrade ke Android 12, dengan GKI, pemulihan khusus, dan A/B.
Lihat gambar ini jika perangkat memiliki partisi recovery_a
dan recovery_b
.
Meluncurkan atau mengupgrade ke Android 12, pemulihan khusus dan non-A/B (ramdisk khusus)
Gambar 6. Perangkat yang meluncurkan atau mengupgrade ke Android 12, dengan GKI, pemulihan khusus dan non-A/B.
Lihat gambar ini jika perangkat memiliki partisi bernama recovery
tanpa akhiran slot.
Upgrade ke Android 12, pemulihan sebagai boot (pemulihan sebagai ramdisk)
Gambar 7. Perangkat yang diupgrade ke Android 12, tanpa GKI, pemulihan sebagai booting.
Upgrade ke Android 12, pemulihan khusus (ramdisk khusus)
Gambar 8. Perangkat yang diupgrade ke Android 12, tanpa GKI, pemulihan khusus.
Isi image boot
Image booting Android berisi hal berikut.
init_boot
gambar ditambahkan untuk perangkat yang diluncurkan dengan Android 13- Versi header V4
- Gambar ramdisk generik
Gambar
boot
generik- Versi header V3 atau
V4
boot_signature
untuk sertifikasi boot.img GKI (khusus v4). GKI bersertifikasiboot.img
tidak ditandatangani untuk booting terverifikasi. OEM tetap harus menandatanganiboot.img
bawaan dengan kunci AVB khusus perangkat.- Generik
cmdline
(GENERIC_KERNEL_CMDLINE
) - Kernel GKI
- Gambar ramdisk generik
- Hanya disertakan dalam gambar
boot
dari Android 12 dan yang lebih lama
- Hanya disertakan dalam gambar
- Versi header V3 atau
V4
vendor_boot
(untuk mengetahui detailnya, lihat Partisi Boot Vendor)vendor_boot
header- Spesifik per perangkat
cmdline
(BOARD_KERNEL_CMDLINE
)
- Spesifik per perangkat
vendor_boot
ramdisk imagelib/modules
- Resource pemulihan (jika tidak ada pemulihan khusus)
dtb
gambar
recovery
gambar- Header versi V2
cmdline
khusus perangkat untuk pemulihan, jika perlu- Untuk partisi pemulihan non-A/B, konten header harus bersifat mandiri; lihat Gambar Pemulihan. Contoh:
cmdline
tidak digabungkan denganboot
danvendor_boot
cmdline
.- Header menentukan DTBO pemulihan, jika perlu.
- Untuk partisi pemulihan A/B, konten dapat digabungkan atau disimpulkan
dari
boot
danvendor_boot
. Contoh: cmdline
digabungkan keboot
danvendor_boot
cmdline
.- DTBO dapat disimpulkan dari header
vendor_boot
.
recovery
ramdisk image- Resource pemulihan
- Untuk partisi pemulihan non-A/B, konten ramdisk harus bersifat mandiri; lihat Gambar Pemulihan. Contoh:
lib/modules
harus berisi semua modul kernel yang diperlukan untuk mem-boot mode pemulihan- Ramdisk pemulihan harus berisi
init
. - Untuk partisi pemulihan A/B, ramdisk pemulihan ditambahkan ke
ramdisk generik dan
vendor_boot
, sehingga tidak perlu berdiri sendiri. Contoh: lib/modules
mungkin hanya berisi modul kernel tambahan yang diperlukan untuk mem-boot mode pemulihan selain modul kernel di ramdiskvendor_boot
.- Symlink di
/init
mungkin ada, tetapi dibayangi oleh biner/init
tahap pertama dalam image boot.
- Header versi V2
Isi image ramdisk generik
Ramdisk generik berisi komponen berikut.
init
system/etc/ramdisk/build.prop
ro.PRODUCT.bootimg.* build
properti- Direktori kosong untuk titik pemasangan:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
first_stage_ramdisk/
- Direktori kosong duplikat untuk titik pemasangan:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
- Direktori kosong duplikat untuk titik pemasangan:
Integrasi image boot
Flag build mengontrol cara pembuatan gambar init_boot
, boot
, recovery
, dan vendor_boot
. Nilai variabel papan boolean harus berupa string
true
atau kosong (yang merupakan nilai default).
TARGET_NO_KERNEL
. Variabel ini menunjukkan apakah build menggunakan image boot bawaan. Jika variabel ini ditetapkan ketrue
, tetapkanBOARD_PREBUILT_BOOTIMAGE
ke lokasi image boot bawaan (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img
)BOARD_USES_RECOVERY_AS_BOOT
. Variabel ini menunjukkan apakah perangkat menggunakan gambarrecovery
sebagai gambarboot
. Saat menggunakan GKI, variabel ini kosong dan resource pemulihan harus dipindahkan kevendor_boot
.BOARD_USES_GENERIC_KERNEL_IMAGE
. Variabel ini menunjukkan bahwa board menggunakan GKI. Variabel ini tidak memengaruhi sysprops atauPRODUCT_PACKAGES
.Ini adalah peralihan GKI tingkat board; semua variabel berikut dibatasi oleh variabel ini.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
. Variabel ini mengontrol apakah resource pemulihan ramdisk dibangun untukvendor_boot
.Jika disetel ke
true
, resource pemulihan hanya dibuat untukvendor-ramdisk/
dan tidak dibuat untukrecovery/root/
.Jika kosong, resource pemulihan hanya dibuat untuk
recovery/root/
dan tidak dibuat untukvendor-ramdisk/
.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT
. Variabel ini mengontrol apakah kunci GSI AVB dibuat untukvendor_boot
.Jika disetel ke
true
, jikaBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
:Disetel, kunci AVB GSI dibuat untuk
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb
.Tidak disetel, kunci AVB GSI dibangun ke
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb
.
Jika kosong, jika
BOARD_RECOVERY_AS_ROOT
:Disetel, kunci AVB GSI dibuat untuk
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb
.Tidak disetel, kunci AVB GSI dibangun ke
$ANDROID_PRODUCT_OUT/ramdisk/avb
.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE
. Variabel ini mengontrol apakah imagerecovery
berisi kernel atau tidak. Perangkat yang diluncurkan dengan Android 12 dan menggunakan partisirecovery
A/B harus menyetel variabel ini ketrue
. Perangkat yang diluncurkan dengan Android 12 dan menggunakan non-A/B harus menyetel variabel ini kefalse
agar image pemulihan tetap mandiri.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
. Variabel ini mengontrol apakah$OUT/boot*.img
disalin keIMAGES/
di bawah file target.aosp_arm64
harus menetapkan variabel ini ketrue
.Perangkat lain harus membiarkan variabel ini kosong.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
. Variabel ini mengontrol apakahinit_boot.img
dibuat dan menetapkan ukurannya. Jika disetel, ramdisk generik ditambahkan keinit_boot.img
, bukanboot.img
, dan memerlukan variabelBOARD_AVB_INIT_BOOT*
disetel untuk vbmeta berantai.
Kombinasi yang diizinkan
Komponen atau variabel | Mengupgrade perangkat tanpa partisi pemulihan | Mengupgrade perangkat dengan partisi pemulihan | Meluncurkan perangkat tanpa partisi pemulihan | Meluncurkan perangkat dengan partisi pemulihan A/B | Meluncurkan perangkat dengan partisi pemulihan non-A/B | aosp_arm64 |
---|---|---|---|---|---|---|
Berisi boot |
ya | ya | ya | ya | ya | ya |
Berisi init_boot (Android 13) |
no | tidak | ya | ya | ya | ya |
Berisi vendor_boot |
opsional | opsional | ya | ya | ya | no |
Berisi recovery |
no | ya | no | ya | ya | no |
BOARD_USES_RECOVERY_AS_BOOT |
true |
kosong | kosong | kosong | kosong | kosong |
BOARD_USES_GENERIC_KERNEL_IMAGE |
kosong | kosong | true |
true |
true |
true |
PRODUCT_BUILD_RECOVERY_IMAGE |
kosong | true atau kosong |
kosong | true atau kosong |
true atau kosong |
kosong |
BOARD_RECOVERYIMAGE_PARTITION_SIZE |
kosong | > 0 | kosong | > 0 | > 0 | kosong |
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT |
kosong | kosong | true |
kosong | kosong | kosong |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT |
kosong | kosong | true |
true |
true |
kosong |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE |
kosong | kosong | kosong | true |
kosong | kosong |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES |
kosong | kosong | kosong | kosong | kosong | true |
Perangkat dengan partisi recovery
khusus dapat menyetel
PRODUCT_BUILD_RECOVERY_IMAGE
ke true
atau kosong. Untuk perangkat ini, jika
BOARD_RECOVERYIMAGE_PARTITION_SIZE
disetel, gambar recovery
akan dibuat.
Mengaktifkan vbmeta berantai untuk booting
vbmeta berantai harus diaktifkan untuk image boot
dan init_boot
. Tentukan
hal berikut:
BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
Untuk contoh, lihat perubahan ini.
System-as-root
System-as-root tidak didukung untuk perangkat yang menggunakan GKI. Di
perangkat tersebut, BOARD_BUILD_SYSTEM_ROOT_IMAGE
harus kosong. System-as-root
juga tidak didukung untuk perangkat yang menggunakan partisi dinamis.
Konfigurasi produk
Perangkat yang menggunakan ramdisk generik harus menginstal daftar file yang diizinkan untuk diinstal ke ramdisk. Untuk melakukannya, tentukan hal berikut di
device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
File generic_ramdisk.mk
juga mencegah makefile lain menginstal file lain secara tidak sengaja ke ramdisk (pindahkan file tersebut ke vendor_ramdisk
).
Menyiapkan perangkat
Petunjuk penyiapan berbeda antara perangkat yang diluncurkan dengan Android 13, diupgrade ke Android 12, dan diluncurkan dengan Android 12. Android 13, disiapkan dengan cara yang sama seperti saat menggunakan Android 12
Perangkat yang Diupgrade ke Android 12:
Dapat mempertahankan nilai
BOARD_USES_RECOVERY_AS_BOOT
. Jika melakukannya, mereka menggunakan konfigurasi lama dan variabel build baru harus kosong. Jika perangkat tersebut:Dapat menyetel
BOARD_USES_RECOVERY_AS_BOOT
menjadi kosong. Jika melakukannya, mereka menggunakan konfigurasi baru. Jika perangkat tersebut:Jangan gunakan partisi
recovery
khusus, arsitekturnya seperti yang ditunjukkan dalam Gambar 1 dan opsi penyiapan perangkat adalah Opsi 1.Menggunakan partisi
recovery
khusus, arsitekturnya seperti yang ditunjukkan pada Gambar 2a atau Gambar 2b dan opsi penyiapan perangkat adalah Opsi 2a atau Opsi 2b.
Perangkat yang diluncurkan dengan Android 12 harus menyetel
BOARD_USES_RECOVERY_AS_BOOT
ke kosong dan menggunakan konfigurasi baru. Jika perangkat tersebut:
Karena aosp_arm64
hanya membangun GKI (dan bukan vendor_boot
atau pemulihan), aosp_arm64
bukan target yang lengkap. Untuk konfigurasi build aosp_arm64
, lihat
generic_arm64
.
Opsi 1: Tidak ada partisi pemulihan khusus
Perangkat tanpa partisi recovery
berisi image boot
generik di partisi
boot
. Ramdisk vendor_boot
berisi semua resource pemulihan,
termasuk lib/modules
(dengan modul kernel vendor). Pada perangkat tersebut, konfigurasi produk diwariskan dari
generic_ramdisk.mk
.
Menetapkan nilai BOARD
Tetapkan nilai berikut:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Biner dan link simbolis init
Ramdisk vendor_boot
dapat berisi link simbolis /init
ke /system/bin/init
,
dan init_second_stage.recovery
di /system/bin/init
. Namun, karena ramdisk generik digabungkan setelah ramdisk vendor_boot
, symlink /init
akan ditimpa. Saat perangkat melakukan booting ke pemulihan, biner
/system/bin/init
diperlukan untuk mendukung inisialisasi tahap kedua. Isi
vendor_boot
+ ramdisk generik adalah sebagai berikut:
/init
(dari ramdisk generik, dibuat dariinit_first_stage
)/system/bin/init
(darivendor_ramdisk
, dibuat dariinit_second_stage.recovery
)
Memindahkan file fstab
Pindahkan semua file fstab
yang diinstal ke ramdisk generik ke
vendor_ramdisk
. Untuk contoh, lihat perubahan
ini.
Menginstal modul
Anda dapat menginstal modul khusus perangkat ke vendor_ramdisk
(lewati
langkah ini jika Anda tidak memiliki modul khusus perangkat untuk diinstal).
Gunakan varian
vendor_ramdisk
modul saat modul diinstal ke/first_stage_ramdisk
. Modul ini harus tersedia setelahinit
mengalihkan root ke/first_stage_ramdisk
, tetapi sebeluminit
mengalihkan root ke/system
. Untuk contoh, lihat Checksum metadata dan Kompresi A/B virtual.Gunakan varian
recovery
dari modul saat modul diinstal ke/
. Modul ini harus tersedia sebeluminit
mengalihkan root ke/first_stage_ramdisk
. Untuk mengetahui detail tentang cara menginstal modul ke/
, lihat Konsol tahap pertama.
Konsol tahap pertama
Karena konsol tahap pertama dimulai sebelum init
mengalihkan root ke
/first_stage_ramdisk
, Anda perlu menginstal varian recovery
modul.
Secara default, kedua varian modul diinstal ke
build/make/target/product/base_vendor.mk
, jadi jika makefile perangkat mewarisi
dari file tersebut, Anda tidak perlu menginstal varian recovery
secara eksplisit.
Untuk menginstal modul pemulihan secara eksplisit, gunakan perintah berikut.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
Hal ini memastikan bahwa linker
, sh
, dan toybox
diinstal ke
$ANDROID_PRODUCT_OUT/recovery/root/system/bin
, yang kemudian diinstal ke
/system/bin
di bawah vendor_ramdisk
.
Untuk menambahkan modul yang diperlukan untuk konsol tahap pertama (misalnya, adbd), gunakan berikut.
PRODUCT_PACKAGES += adbd.recovery
Hal ini memastikan bahwa modul yang ditentukan diinstal ke
$ANDROID_PRODUCT_OUT/recovery/root/system/bin
, yang kemudian diinstal ke
/system/bin
di bawah vendor_ramdisk
.
Checksum metadata
Untuk mendukung checksum metadata selama pemasangan tahap pertama, perangkat yang tidak mendukung GKI akan menginstal varian ramdisk dari modul berikut. Untuk menambahkan dukungan bagi GKI, pindahkan modul ke
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Untuk contoh, lihat daftar perubahan ini.
Kompresi A/B virtual
Untuk mendukung kompresi A/B virtual, snapuserd
harus diinstal ke
vendor_ramdisk
. Perangkat harus diwarisi dari
virtual_ab_ota/compression.mk
,
yang menginstal varian vendor_ramdisk
dari snapuserd
.
Perubahan pada proses booting
Proses booting ke pemulihan atau ke Android tidak berubah, dengan pengecualian berikut:
- Ramdisk
build.prop
berpindah ke/second_stage_resources
sehinggainit
tahap kedua dapat membaca stempel waktu build saat booting.
Karena resource berpindah dari ramdisk generik ke ramdisk vendor_boot
, hasil
penggabungan ramdisk generik ke ramdisk vendor_boot
tidak berubah.
Menyediakan e2fsck
Makefile perangkat dapat diwarisi dari:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
jika perangkat mendukung A/B virtual, tetapi tidak mendukung kompresi.virtual_ab_ota/compression.mk
jika perangkat mendukung kompresi A/B virtual.
Makefile produk menginstal
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
. Saat
runtime, tahap pertama init
mengalihkan root ke /first_stage_ramdisk
, lalu
mengeksekusi /system/bin/e2fsck
.
Opsi 2a: Partisi pemulihan khusus dan A/B
Gunakan opsi ini untuk perangkat dengan partisi A/B recovery
; yaitu,
perangkat memiliki recovery_a
dan recovery_b partition
. Perangkat tersebut mencakup perangkat A/B dan A/B Virtual yang partisi pemulihannya dapat diupdate, dengan konfigurasi berikut:
AB_OTA_PARTITIONS += recovery
Ramdisk vendor_boot
berisi bit vendor ramdisk dan modul kernel vendor, termasuk yang berikut:
File
fstab
khusus perangkatlib/modules
(termasuk modul kernel vendor)
Disk RAM recovery
berisi semua resource pemulihan. Pada perangkat tersebut, konfigurasi produk diwariskan dari
generic_ramdisk.mk
.
Menetapkan nilai BOARD
Tetapkan nilai berikut untuk perangkat dengan partisi recovery
A/B:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Biner dan link simbolis init
Ramdisk recovery
dapat berisi link simbolis /init -> /system/bin/init
, dan
init_second_stage.recovery
di /system/bin/init
. Namun, karena ramdisk boot digabungkan setelah ramdisk recovery
, link simbolis /init
akan ditimpa. Saat perangkat melakukan booting ke mode pemulihan, biner /system/bin/init
diperlukan untuk mendukung inisialisasi tahap kedua.
Saat perangkat melakukan booting ke recovery
, konten recovery
+
vendor_boot
+ ramdisk generik adalah sebagai berikut:
/init
(dari ramdisk, dibuat dariinit_first_stage
)/system/bin/init
(dari ramdiskrecovery
, dibuat dariinit_second_stage.recovery
, dan dieksekusi dari/init
)
Saat perangkat melakukan booting ke Android, konten vendor_boot
+ ramdisk generik adalah sebagai berikut:
/init
(dari ramdisk generik, dibuat dariinit_first_stage
)
Memindahkan file fstab
Pindahkan file fstab
yang diinstal ke ramdisk generik ke
vendor_ramdisk
. Untuk contoh, lihat perubahan
ini.
Menginstal modul
Secara opsional, Anda dapat menginstal modul khusus perangkat ke vendor_ramdisk
(lewati langkah ini jika Anda tidak memiliki modul khusus perangkat untuk diinstal). Init
tidak mengganti root. Varian modul vendor_ramdisk
diinstal ke
root vendor_ramdisk
. Untuk contoh penginstalan modul ke
vendor_ramdisk
, lihat Konsol tahap pertama, Checksum
metadata, dan Kompresi A/B virtual.
Konsol tahap pertama
Untuk menginstal varian vendor_ramdisk
dari modul, gunakan perintah berikut:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Hal ini memastikan bahwa linker
, sh
, dan toybox
diinstal ke
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, yang kemudian diinstal ke
/system/bin
di bawah vendor_ramdisk
.
Untuk menambahkan modul yang diperlukan untuk konsol tahap pertama (misalnya, adbd), aktifkan varian vendor_ramdisk
dari modul ini dengan mengupload patch yang relevan ke AOSP, lalu gunakan yang berikut ini,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Hal ini memastikan bahwa modul yang ditentukan diinstal ke
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
. Jika ramdisk vendor_boot
dimuat dalam mode pemulihan, modul juga tersedia di recovery
. Jika
ramdisk vendor_boot
tidak dimuat dalam mode pemulihan, perangkat dapat secara opsional
menginstal adbd.recovery
juga.
Checksum metadata
Untuk mendukung checksum metadata selama pemasangan tahap pertama, perangkat yang tidak mendukung GKI akan menginstal varian ramdisk dari modul berikut. Untuk menambahkan dukungan bagi GKI, pindahkan modul ke
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Untuk contoh, lihat daftar perubahan ini.
Kompresi A/B virtual
Untuk mendukung kompresi A/B Virtual, snapuserd
harus diinstal ke
vendor_ramdisk
. Perangkat harus diwarisi dari
virtual_ab_ota/compression.mk
,
yang menginstal varian vendor_ramdisk
dari snapuserd
.
Perubahan pada proses booting
Saat melakukan booting ke Android, proses booting tidak berubah. vendor_boot
+
ramdisk generik mirip dengan proses booting yang ada, kecuali fstab
dimuat dari vendor_boot
. Karena system/bin/recovery
tidak ada,
first_stage_init
menanganinya sebagai booting normal.
Saat melakukan booting ke mode pemulihan, proses booting akan berubah. Pemulihan +
vendor_boot
+ ramdisk generik mirip dengan proses pemulihan yang ada, tetapi
kernel dimuat dari image boot
, bukan dari image recovery
.
Proses booting untuk mode pemulihan adalah sebagai berikut.
Bootloader dimulai, lalu melakukan hal berikut:
- Mendorong pemulihan +
vendor_boot
+ ramdisk generik ke/
. (Jika OEM menduplikasi modul kernel di ramdisk pemulihan dengan menambahkannya keBOARD_RECOVERY_KERNEL_MODULES
),vendor_boot
bersifat opsional.) - Menjalankan kernel dari partisi
boot
.
- Mendorong pemulihan +
Kernel memasang ramdisk ke
/
lalu menjalankan/init
dari ramdisk generik.Inisialisasi tahap pertama dimulai, lalu melakukan hal berikut:
- Menetapkan
IsRecoveryMode() == true
danForceNormalBoot() == false
. - Memuat modul kernel vendor dari
/lib/modules
. - Memanggil
DoFirstStageMount()
, tetapi melewati pemasangan karenaIsRecoveryMode() == true
. (Perangkat tidak membebaskan ramdisk (karena/
masih sama) tetapi memanggilSetInitAvbVersionInRecovery()
.) - Memulai inisialisasi tahap kedua dari
/system/bin/init
dari ramdiskrecovery
.
- Menetapkan
Menyediakan e2fsck
Makefile perangkat dapat diwarisi dari:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
jika perangkat mendukung A/B virtual, tetapi tidak mendukung kompresi.virtual_ab_ota/compression.mk
jika perangkat mendukung kompresi A/B virtual.
Makefile produk menginstal
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
. Saat
runtime, tahap pertama init
mengeksekusi /system/bin/e2fsck
.
Opsi 2b: Partisi pemulihan khusus dan non-A/B
Gunakan opsi ini untuk perangkat dengan partisi recovery
non-A/B; yaitu,
perangkat memiliki partisi bernama recovery
tanpa akhiran slot. Perangkat tersebut mencakup:
- perangkat non-A/B;
- Perangkat A/B dan A/B Virtual, yang partisi pemulihannya tidak dapat diupdate. (Ini tidak biasa.)
Ramdisk vendor_boot
berisi bit vendor ramdisk dan modul kernel vendor, termasuk yang berikut:
- File
fstab
khusus perangkat lib/modules
(termasuk modul kernel vendor)
Gambar recovery
harus mandiri. Harus berisi
semua resource yang diperlukan untuk mem-boot mode pemulihan, termasuk:
- Image kernel
- Gambar DTBO
- Modul kernel di
lib/modules
- Inisialisasi tahap pertama sebagai symlink
/init -> /system/bin/init
- Biner init tahap kedua
/system/bin/init
- File
fstab
khusus perangkat - Semua resource pemulihan lainnya, termasuk biner
recovery
Di perangkat tersebut, konfigurasi produk diwariskan
dari generic_ramdisk.mk
.
Menetapkan nilai BOARD
Tetapkan nilai berikut untuk perangkat non-A/B:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Biner dan link simbolis init
Ramdisk recovery
harus berisi symlink /init -> /system/bin/init
, dan
init_second_stage.recovery
di /system/bin/init
. Saat perangkat melakukan booting ke
mode pemulihan, biner /system/bin/init
diperlukan untuk mendukung inisialisasi tahap pertama dan tahap kedua.
Saat perangkat melakukan booting ke recovery
, konten ramdisk recovery
adalah sebagai berikut:
/init -> /system/bin/init
(dari ramdiskrecovery
)/system/bin/init
(dari ramdiskrecovery
, dibuat dariinit_second_stage.recovery
, dan dieksekusi dari/init
)
Saat perangkat melakukan booting ke Android, konten vendor_boot
+ ramdisk generik adalah sebagai berikut:
/init
(dari ramdisk, dibuat dariinit_first_stage
)
Memindahkan file fstab
Pindahkan semua file fstab
yang diinstal ke ramdisk generik ke ramdisk
vendor_ramdisk
dan recovery
. Untuk contoh, lihat perubahan
ini.
Menginstal modul
Anda dapat menginstal modul khusus perangkat ke vendor_ramdisk
dan
recovery
ramdisk (lewati
langkah ini jika Anda tidak memiliki modul khusus perangkat untuk diinstal). init
tidak mengganti root. Varian modul vendor_ramdisk
diinstal ke
root vendor_ramdisk
. Varian modul recovery
diinstal ke
root ramdisk recovery
. Untuk contoh penginstalan modul ke ramdisk vendor_ramdisk
dan recovery
, lihat Konsol tahap pertama dan Checksum metadata.
Konsol tahap pertama
Untuk menginstal varian vendor_ramdisk
dari modul, gunakan perintah berikut:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Hal ini memastikan bahwa linker
, sh
, dan toybox
diinstal ke
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, yang kemudian diinstal ke
/system/bin
di bawah vendor_ramdisk
.
Untuk menambahkan modul yang diperlukan untuk konsol tahap pertama (misalnya, adbd), aktifkan varian vendor_ramdisk
dari modul ini dengan mengupload patch yang relevan ke AOSP, lalu gunakan yang berikut ini,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Hal ini memastikan bahwa modul yang ditentukan diinstal ke
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
.
Untuk menginstal varian recovery
dari modul, ganti vendor_ramdisk
dengan
recovery
:
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
Checksum metadata
Untuk mendukung checksum metadata selama pemasangan tahap pertama, perangkat yang tidak mendukung GKI akan menginstal varian ramdisk dari modul berikut. Untuk menambahkan dukungan bagi GKI, pindahkan modul ke
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Untuk mendukung checksum metadata selama pemasangan tahap pertama dalam pemulihan, aktifkan varian pemulihan modul ini dan instal juga.
Perubahan pada proses booting
Saat melakukan booting ke Android, proses booting tidak berubah. vendor_boot
+
ramdisk generik mirip dengan proses booting yang ada, kecuali fstab
dimuat dari vendor_boot
. Karena system/bin/recovery
tidak ada,
first_stage_init
menanganinya sebagai booting normal.
Saat melakukan booting ke mode pemulihan, proses booting tidak berubah. Ramdisk pemulihan dimuat dengan cara yang sama seperti proses pemulihan yang ada.
Kernel dimuat dari image recovery
. Proses
booting untuk mode pemulihan adalah sebagai berikut.
Bootloader dimulai, lalu melakukan hal berikut:
- Mendorong ramdisk pemulihan ke
/
. - Menjalankan kernel dari partisi
recovery
.
- Mendorong ramdisk pemulihan ke
Kernel memasang ramdisk ke
/
, lalu menjalankan/init
, yang merupakan symlink ke/system/bin/init
dari ramdiskrecovery
.Inisialisasi tahap pertama dimulai, lalu melakukan hal berikut:
- Menetapkan
IsRecoveryMode() == true
danForceNormalBoot() == false
. - Memuat modul kernel vendor dari
/lib/modules
. - Memanggil
DoFirstStageMount()
, tetapi melewati pemasangan karenaIsRecoveryMode() == true
. (Perangkat tidak membebaskan ramdisk (karena/
masih sama) tetapi memanggilSetInitAvbVersionInRecovery()
.) - Memulai inisialisasi tahap kedua dari
/system/bin/init
dari ramdiskrecovery
.
- Menetapkan
Stempel waktu image boot
Kode berikut adalah contoh file stempel waktu gambar boot
:
####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
Pada waktu build, file
system/etc/ramdisk/build.prop
ditambahkan ke ramdisk generik. File ini berisi informasi stempel waktu build.Saat runtime, tahap pertama
init
menyalin file dari ramdisk ketmpfs
sebelum mengosongkan ramdisk sehingga tahap keduainit
dapat membaca file ini untuk menyetel properti stempel waktu gambarboot
.