Di Android 12, image boot
generik berisi ramdisk boot
generik dan image kernel generik (GKI) . Untuk membangun ramdisk generik, pindahkan sumber daya khusus vendor dari ramdisk sedemikian rupa sehingga ramdisk generik hanya berisi init
tahap pertama dan file properti yang berisi informasi stempel waktu.
Pada perangkat yang:
Jangan gunakan partisi
recovery
khusus, semua bit pemulihan berpindah dari ramdisk boot ke ramdiskvendor_boot
.Gunakan partisi
recovery
khusus, tidak ada perubahan dalam ramdiskrecovery
yang diperlukan karena ramdiskrecovery
mandiri.
Arsitektur
Diagram berikut mengilustrasikan arsitektur untuk perangkat yang menjalankan Android 12.
Luncurkan atau tingkatkan ke Android 12, tanpa pemulihan khusus
Gambar 1. Perangkat diluncurkan atau ditingkatkan ke Android 12, dengan GKI, tanpa pemulihan khusus
Luncurkan atau tingkatkan ke Android 12, pemulihan khusus dan A/B (ramdisk khusus)
Gambar 2a. Peluncuran atau peningkatan perangkat ke Android 12, dengan GKI, pemulihan khusus, dan A/B
Lihat gambar ini jika recovery
adalah A/B; yaitu, perangkat memiliki partisi recovery_a
dan recovery_b
.
Luncurkan atau tingkatkan ke Android 12, pemulihan khusus dan non-A/B (ramdisk khusus)
Gambar 2b. Perangkat diluncurkan atau ditingkatkan ke Android 12, dengan GKI, pemulihan khusus dan non-A/B
Lihat gambar ini jika recovery
bukan A/B; yaitu, perangkat memiliki partisi bernama recovery
tanpa akhiran slot.
Tingkatkan ke Android 12, recovery-as-boot (recovery-as-ramdisk)
Gambar 3. Upgrade perangkat ke Android 12, tanpa GKI, recovery-as-boot
Tingkatkan ke Android 12, pemulihan khusus (ramdisk khusus)
Gambar 4. Peningkatan perangkat ke Android 12, tanpa GKI, pemulihan khusus
Isi gambar boot
Di Android 12, gambar boot berisi yang berikut ini.
- Gambar
boot
umum- Versi tajuk V3 atau V4
-
boot_signature
untuk sertifikasi boot.img GKI (khusus v4).boot.img
GKI bersertifikat tidak ditandatangani untuk boot terverifikasi. OEM masih harus menandatanganiboot.img
dengan kunci AVB khusus perangkat. -
cmdline
(GENERIC_KERNEL_CMDLINE
) - Gambar kernel umum
-
- Gambar
boot
ramdisk generik
- Versi tajuk V3 atau V4
-
vendor_boot
image (untuk detailnya, lihat Vendor Boot Partitions )- header
vendor_boot
-
cmdline
khusus perangkat (BOARD_KERNEL_CMDLINE
)
-
- gambar ramdisk
vendor_boot
-
lib/modules
- Sumber daya pemulihan (jika tidak ada pemulihan khusus)
-
- gambar
dtb
- header
- gambar
recovery
- Versi tajuk V2
-
cmdline
khusus perangkat untuk pemulihan, jika perlu - Untuk partisi pemulihan non-A/B, konten header harus mandiri; lihat Gambar Pemulihan . Sebagai 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
. Sebagai contoh: -
cmdline
digabungkan menjadiboot
danvendor_boot
cmdline
. - DTBO dapat disimpulkan dari header
vendor_boot
.
-
-
recovery
gambar ramdisk- Sumber daya pemulihan
- Untuk partisi pemulihan non-A/B, isi ramdisk harus mandiri; lihat Gambar Pemulihan . Sebagai 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
boot
danvendor_boot
, sehingga tidak perlu berdiri sendiri. Sebagai 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 di image boot.
- Versi tajuk V2
Isi gambar boot ramdisk generik
Di Android 12, ramdisk boot
generik berisi komponen berikut.
-
init
- Menambahkan
system/etc/ramdisk/build.prop
-
ro. PRODUCT .bootimg.* build
alat peraga - Direktori kosong untuk titik pemasangan:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
-
first_stage_ramdisk/
- Direktori kosong yang digandakan untuk titik pemasangan:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
- Direktori kosong yang digandakan untuk titik pemasangan:
Integrasi gambar boot
Flag build mengontrol bagaimana image boot
, recovery
, dan vendor_boot
dibuat. Nilai variabel papan boolean harus berupa string true
atau kosong (yang merupakan default).
TARGET_NO_KERNEL
. Variabel ini menunjukkan jika build menggunakan image boot bawaan. Jika variabel ini disetel ketrue
, maka setelBOARD_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 citrarecovery
sebagai citraboot
. Saat menggunakan GKI, variabel ini kosong dan sumber daya pemulihan harus dipindahkan kevendor_boot
.BOARD_USES_GENERIC_KERNEL_IMAGE
. Variabel ini menunjukkan bahwa papan menggunakan GKI dan gambarboot
generik. Variabel ini tidak memengaruhi sysprops atauPRODUCT_PACKAGES
.Ini adalah sakelar GKI tingkat papan; semua variabel yang tercantum di bawah ini dibatasi oleh variabel ini.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
. Variabel ini mengontrol apakah sumber daya pemulihan ramdisk dibangun kevendor_boot
.Jika disetel ke
true
, sumber daya pemulihan dibuat hanya untukvendor-ramdisk/
dan tidak dibuat untukrecovery/root/
.Saat kosong, sumber daya pemulihan dibuat hanya untuk
recovery/root/
dan tidak dibuat untukvendor-ramdisk/
.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT
. Variabel ini mengontrol apakah kunci AVB GSI dibuat untukvendor_boot
.Ketika disetel ke
true
, jikaBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
:Sudah disetel, kunci AVB GSI dibuat ke
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb
.Tidak disetel, kunci AVB GSI dibuat ke
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb
.
Saat kosong, jika
BOARD_RECOVERY_AS_ROOT
:Sudah disetel, kunci AVB GSI dibuat ke
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb
.Tidak disetel, kunci AVB GSI dibuat ke
$ANDROID_PRODUCT_OUT/ramdisk/avb
.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE
. Variabel ini mengontrol apakah gambarrecovery
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
untuk menjaga citra pemulihan tetap utuh.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
. Variabel ini mengontrol apakah$OUT/boot*.img
disalin keIMAGES/
di bawah file target.aosp_arm64
harus menyetel variabel ini ketrue
.Perangkat lain harus membiarkan variabel ini kosong.
Kombinasi yang diizinkan
Komponen atau variabel | Memperbarui perangkat tanpa partisi recovery | Memperbarui perangkat dengan partisi recovery | Luncurkan perangkat tanpa partisi recovery | Luncurkan perangkat dengan partisi recovery A/B | Luncurkan perangkat dengan partisi recovery non-A/B | aosp_arm64 |
---|---|---|---|---|---|---|
Berisi boot | Ya | Ya | Ya | Ya | Ya | Ya |
Berisi vendor_boot | opsional | opsional | Ya | Ya | Ya | Tidak |
Berisi recovery | Tidak | Ya | Tidak | Ya | Ya | Tidak |
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_RESOURCE_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, citra recovery
akan dibuat.
Aktifkan vbmeta berantai untuk boot
Vbmeta berantai harus diaktifkan untuk gambar boot
. Tentukan berikut ini:
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
Sebagai contoh, lihat perubahan ini .
Sistem-sebagai-root
System-as-root tidak didukung untuk perangkat yang menggunakan GKI dan image boot generik, terlepas dari apakah perangkat mendukung modul GKI yang dapat diupdate. Pada perangkat tersebut, BOARD_BUILD_SYSTEM_ROOT_IMAGE
harus kosong. System-as-root juga tidak didukung untuk perangkat yang menggunakan partisi dinamis, yang merupakan persyaratan untuk menggunakan modul GKI yang dapat diperbarui.
Konfigurasi produk
Perangkat yang menggunakan ramdisk generik harus menginstal daftar file yang diizinkan untuk diinstal ke ramdisk. Untuk melakukannya, tentukan yang 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 (sebagai gantinya pindahkan file tersebut ke vendor_ramdisk
).
Menyiapkan perangkat
Petunjuk penyiapan berbeda antara perangkat yang memperbarui ke Android 12 dan meluncurkan dengan Android 12.
Pembaruan perangkat ke Android 12:
Dapat mempertahankan nilai
BOARD_USES_RECOVERY_AS_BOOT
. Jika mereka melakukannya, mereka menggunakan konfigurasi lama dan variabel build baru harus kosong. Jika perangkat tersebut:Dapat mengatur
BOARD_USES_RECOVERY_AS_BOOT
menjadi kosong. Jika mereka melakukannya, mereka menggunakan konfigurasi baru. Jika perangkat tersebut:Jangan gunakan partisi
recovery
khusus, arsitekturnya seperti yang ditunjukkan pada Gambar 1 dan opsi pengaturan perangkat adalah Opsi 1 .Gunakan partisi
recovery
khusus, arsitekturnya seperti yang ditunjukkan pada Gambar 2a atau Gambar 2b dan opsi pengaturan perangkat adalah Opsi 2a atau Opsi 2b .
Perangkat yang diluncurkan dengan Android 12 harus menyetel
BOARD_USES_RECOVERY_AS_BOOT
untuk mengosongkan dan menggunakan konfigurasi baru. Jika perangkat tersebut:Jangan gunakan partisi
recovery
khusus, arsitekturnya seperti yang ditunjukkan pada Gambar 1 dan opsi pengaturan perangkat adalah Opsi 1 .Gunakan partisi
recovery
khusus, arsitekturnya seperti yang ditunjukkan pada Gambar 2a atau Gambar 2b dan opsi pengaturan perangkat adalah Opsi 2a atau Opsi 2b .
Karena aosp_arm64
hanya membuat GKI dan gambar boot
generik (dan bukan vendor_boot
atau pemulihan), itu 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 sumber daya pemulihan, termasuk lib/modules
(dengan modul kernel vendor). Pada perangkat tersebut, konfigurasi produk mewarisi dari generic_ramdisk.mk
.
Menetapkan nilai PAPAN
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
Init binari dan symlink
vendor_boot
ramdisk dapat berisi symlink /init
ke /system/bin/init
, dan init_second_stage.recovery
di /system/bin/init
. Namun, karena ramdisk boot
digabungkan setelah ramdisk vendor_boot
, symlink /init
ditimpa. Saat perangkat melakukan boot ke pemulihan, biner /system/bin/init
diperlukan untuk mendukung init tahap kedua. Isi dari vendor_boot
+ boot
ramdisk adalah sebagai berikut:
-
/init
(dari ramdisk, dibangun dariinit_first_stage
) -
/system/bin/init
(darivendor_ramdisk
, dibangun dariinit_second_stage.recovery
)
Memindahkan file fstab
Pindahkan file fstab
yang diinstal ke boot
ramdisk ke vendor_ramdisk
. Sebagai contoh, lihat perubahan ini .
Memasang modul
Jika diinginkan, 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
dari modul saat modul dipasang ke/first_stage_ramdisk
. Modul ini harus tersedia setelahinit
mengalihkan root ke/first_stage_ramdisk
tetapi sebeluminit
mengalihkan root ke/system
. Sebagai contoh, lihat Checksum metadata dan kompresi A/B Virtual .Gunakan varian
recovery
modul saat modul diinstal ke/
. Modul ini harus tersedia sebeluminit
mengalihkan root ke/first_stage_ramdisk
. Untuk detail tentang 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 modul recovery
. Secara default, kedua varian modul diinstal ke build/make/target/product/base_vendor.mk
, jadi jika perangkat makefile mewarisi dari file itu, Anda tidak perlu menginstal varian recovery
secara eksplisit.
Untuk menginstal modul pemulihan secara eksplisit, gunakan yang berikut ini.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
Ini memastikan bahwa sh
linker
dan toybox
dipasang ke $ANDROID_PRODUCT_OUT/recovery/root/system/bin
, yang kemudian dipasang ke /system/bin
di bawah vendor_ramdisk
.
Untuk menambahkan modul yang diperlukan untuk konsol tahap pertama (misalnya, adbd), gunakan yang berikut ini.
PRODUCT_PACKAGES += adbd.recovery
Ini memastikan bahwa modul yang ditentukan dipasang ke $ANDROID_PRODUCT_OUT/recovery/root/system/bin
, yang kemudian dipasang ke /system/bin
di bawah vendor_ramdisk
.
Checksum metadata
Untuk mendukung checksum metadata selama pemasangan tahap pertama, perangkat yang tidak mendukung GKI menginstal varian ramdisk dari modul berikut. Untuk menambahkan dukungan untuk GKI, pindahkan modul ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Sebagai contoh, lihat daftar perubahan ini .
Kompresi A/B virtual
Untuk mendukung kompresi A/B virtual, snapuserd
harus diinstal ke vendor_ramdisk
. Perangkat harus mewarisi dari virtual_ab_ota/compression.mk
, yang menginstal varian vendor_ramdisk
dari snapuserd
.
Perubahan pada proses boot
Proses booting ke recovery atau ke Android tidak berubah, dengan pengecualian berikut:
- Ramdisk
build.prop
pindah ke/second_stage_resources
sehinggainit
tahap kedua dapat membaca stempel waktu pembuatan boot.
Karena resource berpindah dari boot
ramdisk ke vendor_boot
ramdisk, hasil penyambungan boot
ke vendor_boot
ramdisk tidak berubah.
Membuat e2fsck tersedia
Makefile perangkat dapat mewarisi 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, init
tahap pertama mengalihkan root ke /first_stage_ramdisk
kemudian mengeksekusi /system/bin/e2fsck
.
Opsi 2a: Partisi pemulihan khusus dan A/B
Gunakan opsi ini untuk perangkat dengan partisi recovery
A/B; yaitu, perangkat memiliki recovery_b partition
recovery_a
recovery_b . Perangkat tersebut mencakup perangkat A/B dan Virtual A/B yang partisi pemulihannya dapat diperbarui, dengan konfigurasi berikut:
AB_OTA_PARTITIONS += recovery
vendor_boot
ramdisk berisi bit vendor dari ramdisk dan modul kernel vendor, termasuk yang berikut:
File
fstab
khusus perangkatlib/modules
(termasuk modul kernel vendor)
Ramdisk recovery
berisi semua sumber daya pemulihan. Pada perangkat tersebut, konfigurasi produk mewarisi dari generic_ramdisk.mk
.
Menetapkan nilai PAPAN
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
Init binari dan symlink
Ramdisk recovery
dapat berisi symlink /init -> /system/bin/init
, dan init_second_stage.recovery
di /system/bin/init
. Namun, karena ramdisk boot digabungkan setelah ramdisk recovery
, symlink /init
ditimpa. Saat perangkat melakukan boot ke mode pemulihan, biner /system/bin/init
diperlukan untuk mendukung init tahap kedua.
Saat perangkat melakukan boot ke recovery
, isi dari recovery
+ vendor_boot
+ boot
ramdisks adalah sebagai berikut:
-
/init
(dari ramdisk, dibangun dariinit_first_stage
) -
/system/bin/init
(darirecovery
ramdisk, dibangun dariinit_second_stage.recovery
, dan dieksekusi dari/init
)
Saat perangkat melakukan booting ke Android, isi vendor_boot
+ boot
ramdisks adalah sebagai berikut:
-
/init
(dari ramdisk, dibangun dariinit_first_stage
)
Memindahkan file fstab
Pindahkan file fstab
yang diinstal ke boot
ramdisk ke vendor_ramdisk
. Sebagai contoh, lihat perubahan ini .
Memasang modul
Jika diinginkan, 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 vendor_ramdisk
dari modul dipasang ke root vendor_ramdisk
. Untuk contoh pemasangan 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 yang berikut ini:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Ini memastikan bahwa sh
linker
dan toybox
dipasang ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, yang kemudian dipasang 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 mengunggah patch yang relevan ke AOSP, lalu gunakan yang berikut ini,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Ini memastikan bahwa modul yang ditentukan dipasang ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
. Jika ramdisk vendor_boot
dimuat dalam mode pemulihan, modul juga tersedia dalam recovery
. Jika ramdisk vendor_boot
tidak dimuat dalam mode pemulihan, perangkat juga dapat menginstal adbd.recovery
secara opsional.
Checksum metadata
Untuk mendukung checksum metadata selama pemasangan tahap pertama, perangkat yang tidak mendukung GKI menginstal varian ramdisk dari modul berikut. Untuk menambahkan dukungan untuk GKI, pindahkan modul ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Sebagai contoh, lihat daftar perubahan ini .
Kompresi A/B virtual
Untuk mendukung kompresi A/B Virtual, snapuserd
harus diinstal ke vendor_ramdisk
. Perangkat harus mewarisi dari virtual_ab_ota/compression.mk
, yang menginstal varian vendor_ramdisk
dari snapuserd
.
Perubahan pada proses boot
Saat booting ke Android, proses booting tidak berubah. vendor_boot
+ boot
ramdisk mirip dengan proses boot yang ada, kecuali bahwa fstab
memuat dari vendor_boot
. Karena system/bin/recovery
tidak ada, first_stage_init
menanganinya sebagai boot normal.
Saat boot ke mode pemulihan, proses boot berubah. Recovery + vendor_boot
+ boot
ramdisk mirip dengan proses pemulihan yang ada, tetapi kernel dimuat dari image boot
, bukan dari image recovery
. Proses boot untuk mode pemulihan adalah sebagai berikut.
Bootloader dimulai, lalu lakukan hal berikut:
- Mendorong pemulihan +
vendor_boot
+boot
ramdisk ke/
. (Jika OEM menduplikasi modul kernel di ramdisk pemulihan dengan menambahkannya keBOARD_RECOVERY_KERNEL_MODULES
),vendor_boot
adalah opsional.) - Menjalankan kernel dari partisi
boot
.
- Mendorong pemulihan +
Kernel me-mount ramdisk ke
/
kemudian mengeksekusi/init
dariboot
ramdisk.Init tahap pertama dimulai, lalu lakukan hal berikut:
- Setel
IsRecoveryMode() == true
danForceNormalBoot() == false
. - Memuat modul kernel vendor dari
/lib/modules
. - Memanggil
DoFirstStageMount()
tetapi melewatkan pemasangan karenaIsRecoveryMode() == true
. (Perangkat tidak membebaskan ramdisk (karena/
masih sama) tetapi memanggilSetInitAvbVersionInRecovery()
.) - Memulai init tahap kedua dari
/system/bin/init
dari ramdiskrecovery
.
- Setel
Membuat e2fsck tersedia
Makefile perangkat dapat mewarisi 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.
Produk makefiles menginstal $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
. Saat runtime, init
tahap pertama dijalankan /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 meliputi:
- perangkat non-A/B;
- Perangkat A/B dan Virtual A/B, yang partisi pemulihannya tidak dapat diperbarui. (Ini tidak biasa.)
vendor_boot
ramdisk berisi bit vendor dari ramdisk dan modul kernel vendor, termasuk yang berikut:
- File
fstab
khusus perangkat -
lib/modules
(termasuk modul kernel vendor)
Citra recovery
harus mandiri. Itu harus berisi semua sumber daya yang diperlukan untuk mem-boot mode pemulihan, termasuk:
- Gambar kernel
- gambar DTBO
- Modul kernel di
lib/modules
- Init tahap pertama sebagai symlink
/init -> /system/bin/init
- Init biner tahap kedua
/system/bin/init
- File
fstab
khusus perangkat - Semua sumber daya pemulihan lainnya, termasuk biner
recovery
, dll. - dll.
Pada perangkat tersebut, konfigurasi produk mewarisi dari generic_ramdisk.mk
.
Menetapkan nilai PAPAN
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
Init binari dan symlink
Ramdisk recovery
harus berisi symlink /init -> /system/bin/init
, dan init_second_stage.recovery
di /system/bin/init
. Saat perangkat melakukan boot ke mode pemulihan, biner /system/bin/init
diperlukan untuk mendukung init tahap pertama dan kedua.
Saat perangkat melakukan boot ke recovery
, isi ramdisk recovery
adalah sebagai berikut:
-
/init -> /system/bin/init
(dari ramdiskrecovery
) -
/system/bin/init
(darirecovery
ramdisk, dibangun dariinit_second_stage.recovery
, dan dieksekusi dari/init
)
Saat perangkat melakukan booting ke Android, isi vendor_boot
+ boot
ramdisks adalah sebagai berikut:
-
/init
(dari ramdisk, dibangun dariinit_first_stage
)
Memindahkan file fstab
Pindahkan file fstab
yang diinstal ke boot
ramdisk ke vendor_ramdisk
dan recovery
ramdisk. Sebagai contoh, lihat perubahan ini .
Memasang modul
Jika diinginkan, Anda dapat menginstal modul khusus perangkat ke vendor_ramdisk
dan ramdisk recovery
(lewati langkah ini jika Anda tidak memiliki modul khusus perangkat untuk diinstal). init
tidak mengganti root. Varian vendor_ramdisk
dari modul dipasang ke root vendor_ramdisk
. Varian recovery
modul diinstal ke akar ramdisk recovery
. Untuk contoh pemasangan modul ke vendor_ramdisk
dan recovery
ramdisk, lihat First stage console dan Metadata checksums .
Konsol tahap pertama
Untuk menginstal varian vendor_ramdisk
dari modul, gunakan yang berikut ini:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Ini memastikan bahwa sh
linker
dan toybox
dipasang ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, yang kemudian dipasang 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 mengunggah patch yang relevan ke AOSP, lalu gunakan yang berikut ini,
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Ini memastikan bahwa modul yang ditentukan dipasang ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
.
Untuk menginstal varian recovery
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 menginstal varian ramdisk dari modul berikut. Untuk menambahkan dukungan untuk GKI, pindahkan modul ke $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resizefs.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 boot
Saat booting ke Android, proses booting tidak berubah. vendor_boot
+ boot
ramdisk mirip dengan proses boot yang ada, kecuali bahwa fstab
memuat dari vendor_boot
. Karena system/bin/recovery
tidak ada, first_stage_init
menanganinya sebagai boot normal.
Saat boot ke mode pemulihan, proses boot tidak berubah. Ramdisk pemulihan dimuat dengan cara yang sama seperti proses pemulihan yang ada. Kernel dimuat dari citra recovery
. Proses boot untuk mode pemulihan adalah sebagai berikut.
Bootloader dimulai, lalu lakukan hal berikut:
- Mendorong ramdisk pemulihan ke
/
. - Menjalankan kernel dari partisi
recovery
.
- Mendorong ramdisk pemulihan ke
Kernel memasang ramdisk ke
/
kemudian mengeksekusi/init
, yang merupakan symlink ke/system/bin/init
dari ramdiskrecovery
.Init tahap pertama dimulai, lalu lakukan hal berikut:
- Setel
IsRecoveryMode() == true
danForceNormalBoot() == false
. - Memuat modul kernel vendor dari
/lib/modules
. - Memanggil
DoFirstStageMount()
tetapi melewatkan pemasangan karenaIsRecoveryMode() == true
. (Perangkat tidak membebaskan ramdisk (karena/
masih sama) tetapi memanggilSetInitAvbVersionInRecovery()
.) - Memulai init tahap kedua dari
/system/bin/init
dari ramdiskrecovery
.
- Setel
Stempel waktu gambar boot
Kode berikut adalah contoh file cap 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 pembuatan, file
system/etc/ramdisk/build.prop
ditambahkan ke ramdisk gambarboot
generik. File ini berisi informasi stempel waktu build.Saat runtime,
init
tahap pertama menyalin file dari ramdisk ketmpfs
sebelum membebaskan ramdisk sehinggainit
tahap kedua dapat membaca file ini untuk mengatur properti cap waktu gambarboot
.