Android 9 memperkenalkan kolom versi di image booting header, yang memungkinkan update header sekaligus mempertahankan kompatibilitas mundur. Bootloader harus memeriksa kolom versi header dan mengurai header sebagaimana mestinya. Peluncuran perangkat dengan:
- Android 13 dapat menggunakan header booting versi 3 atau 4. Untuk
perangkat yang mendukung arsitektur Generic Kernel Image
(GKI),
versi 4 adalah image booting utama dan
kolom
os_version
di header booting harus nol. Bootloader perangkat diharapkan mendapatkan informasi versi dari Booting Terverifikasi Android (AVB) properti sebagai gantinya. - Android 12 dapat menggunakan header boot versi 3 atau 4. Sebagai perangkat yang mendukung Generic Kernel Image (GKI) versi 4 adalah image booting utama.
- Android 11 dapat menggunakan header boot versi 3. Untuk perangkat yang mendukung arsitektur Generic Kernel Image (GKI), versi ini harus digunakan untuk image booting utama.
- Android 10 harus menggunakan header boot versi 2.
- Android 9 harus menggunakan header boot versi 1.
- Android 8 dan yang lebih lama dianggap menggunakan header image boot versi 0.
Untuk semua perangkat yang menjalankan Android 9 atau yang lebih baru,
Paket Pengujian Vendor (VTS) memeriksa format
boot/recovery
untuk memastikan header image booting menggunakan
. Untuk melihat detail AOSP di semua header image booting dan booting
vendor yang didukung, lihat
system/tools/mkbootimg/include/bootimg/bootimg.h
.
Mengimplementasikan pembuatan versi header image booting
Alat mkbootimg
menerima argumen berikut.
Argumen | Deskripsi |
---|---|
header_version |
Menetapkan versi header image booting. Boot image dengan versi header:
|
recovery_dtbo |
Digunakan untuk arsitektur yang menggunakan DTB. Menentukan jalur menuju pemulihan
Gambar DTBO. Opsional untuk perangkat A/B, yang tidak memerlukan image pemulihan.
Perangkat non-A/B yang menggunakan header_version :
|
recovery_acpio |
Digunakan untuk arsitektur yang menggunakan ACPI, bukan DTB. Menentukan jalur
ke image ACPIO pemulihan. Opsional untuk perangkat A/B, yang tidak memerlukan
image pemulihan. Perangkat non-A/B yang menggunakan header_version :
|
dtb |
Jalur ke image DTB yang disertakan dalam image booting/pemulihan. |
dtb_offset |
Saat ditambahkan ke argumen base , akan memberikan beban fisik
untuk hierarki perangkat akhir. Misalnya, jika base
argumennya adalah 0x10000000 dan argumen dtb_offset
adalah 0x01000000 , dtb_addr_field dalam image booting
header diisi sebagai 0x11000000 . |
Perangkat BoardConfig.mk
menggunakan konfigurasi BOARD_MKBOOTIMG_ARGS
untuk menambahkan
header version
ke argumen khusus board mkbootimg
lainnya. Contoh:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Sistem build Android menggunakan variabel BoardConfig
BOARD_PREBUILT_DTBOIMAGE
untuk menetapkan argumen recovery_dtbo
dari
alat mkbootimg
selama pembuatan image pemulihan. Untuk mengetahui detail tentang
perubahan Android Open Source Project (AOSP), tinjau daftar perubahan terkait
untuk pembuatan versi header
image booting.
Header gambar booting, versi 4
Android 12 menyediakan boot_signature
dalam image booting
{i>header<i} versi 4, yang dapat digunakan untuk
memeriksa integritas {i>kernel<i} dan
ramdisk. Pemeriksaan dilakukan di
VtsSecurityAvbTest
dan diperlukan untuk perangkat yang menggunakan arsitektur GKI. Namun,
boot_signature
tidak terlibat dalam proses booting terverifikasi khusus perangkat
dan hanya digunakan di VTS. Lihat papan GKI boot.img
konfigurasi
dan Booting terverifikasi GKI
setelan
untuk mengetahui detailnya.
Image booting vendor {i>header<i} versi 4 mendukung fragmen ramdisk beberapa vendor.
Versi 4 header image booting menggunakan format berikut.
struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t ramdisk_size; /* size in bytes */
uint32_t os_version;
uint32_t header_size; /* size of boot image header in bytes */
uint32_t reserved[4];
uint32_t header_version; /* offset remains constant for version check */
#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
uint32_t signature_size; /* size in bytes */
};
Header image booting, versi 3
Android 11 mengupdate header image booting ke versi 3, yang menghapus data berikut:
Bootloader tahap kedua. Nomor kolom
second_size
dansecond_addr
muncul lagi di header image booting. Perangkat dengan bootloader tahap kedua harus menyimpan {i>bootloader<i} itu di partisinya sendiri.Gambar pemulihan. Persyaratan untuk menentukan gambar pemulihan telah tidak digunakan lagi, dan
recovery_dtbo_size
,recovery_dtbo_offset
, Kolomrecovery_acpio_size
danrecovery_acpio_offset
tidak lagi muncul di header image booting.Perangkat A/B menggunakan skema pembaruan dan pemulihan yang membuatnya tidak perlu menentukan citra DTBO atau ACPIO untuk pemulihan.
Perangkat non-A/B yang ingin menentukan image pemulihan (baik DTBO maupun ACPIO) harus menggunakan header image booting versi 1 atau 2.
Blob hierarki perangkat (DTB). DTB disimpan di booting vendor partisi, sehingga kolom
dtb_size
dandtb_addr
tidak lagi muncul di image booting (tetapi ada di header image booting vendor).
Perangkat dapat menggunakan header image boot versi 3 untuk mematuhi Generic Kernel Image
(GKI),
yang menyatukan {i>kernel<i} inti dan memindahkan
modul vendor yang diperlukan untuk
booting ke partisi vendor_boot
(artinya boot image hanya berisi GKI
komponen). Perangkat yang:
Gunakan GKI (memerlukan kernel android-4.19 atau android-5.4), tetapi jangan gunakan update A/B yang dapat menentukan image pemulihan menggunakan image booting versi 3 untuk image booting dan image booting versi 2 untuk image pemulihan.
Jangan gunakan GKI dan jangan gunakan update A/B yang dapat menentukan image pemulihan dengan menggunakan versi 1 atau 2 untuk image booting dan pemulihan.
Versi 3 header image booting menggunakan format berikut.
struct boot_img_hdr
{
#define BOOT_MAGIC_SIZE 8
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t ramdisk_size; /* size in bytes */
uint32_t os_version;
uint32_t header_size; /* size of boot image header in bytes */
uint32_t reserved[4];
uint32_t header_version; /* offset remains constant for version check */
#define BOOT_ARGS_SIZE 512
#define BOOT_EXTRA_ARGS_SIZE 1024
uint8_t cmdline[BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE];
};
Header gambar booting, versi 2
Android 10 mengupdate header image booting ke versi 2, yang menambahkan bagian untuk pemulihan DTB informasi gambar (ukuran gambar dan alamat beban fisik).
Versi 2 dari versi header image booting menggunakan format berikut.
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t header_version;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
uint32_t recovery_[dtbo|acpio]_size; /* size of recovery image */
uint64_t recovery_[dtbo|acpio]_offset; /* offset in boot image */
uint32_t header_size; /* size of boot image header in bytes */
uint32_t dtb_size; /* size of dtb image */
uint64_t dtb_addr; /* physical load address */
};
Header image booting, versi 1
Android 9 mengonversi kolom unused
booting
header gambar ke isian versi header. Peluncuran perangkat dengan Android
9 harus menggunakan header image booting dengan header
ditetapkan ke 1 atau yang lebih tinggi (ini diverifikasi oleh VTS).
Versi header image booting versi 1 menggunakan format berikut.
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t header_version;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
uint32_t recovery_[dtbo|acpio]_size; /* size of recovery image */
uint64_t recovery_[dtbo|acpio]_offset; /* offset in boot image */
uint32_t header_size; /* size of boot image header in bytes */
};
Perangkat non-A/B dapat menentukan image overlay DTB/ACPI untuk pemulihan guna membantu memitigasi kegagalan update over the air (OTA). (Perangkat A/B tidak memiliki masalah ini dan tidak perlu menetapkan gambar overlay.) Anda dapat menentukan gambar DTBO atau gambar ACPIO, tetapi bukan keduanya (karena digunakan oleh arsitektur yang berbeda). Untuk mengonfigurasi header image booting dengan benar, saat menggunakan:
Image DTBO untuk pemulihan, sertakan kolom
recovery_dtbo_size
danrecovery_dtbo_offset
(dan jangan sertakan kolomrecovery_acpio_size
danrecovery_acpio_offset
).Image ACPIO untuk pemulihan, sertakan kolom
recovery_acpio_size
danrecovery_acpio_offset
(dan jangan sertakan kolomrecovery_dtbo_size
danrecovery_dtbo_offset
).
Kolom header_size
berisi ukuran header image booting. Jika booting
versi header gambar ditetapkan ke 1, kolom id
berisi ringkasan SHA-1 untuk
bagian recovery_[dtbo|acpio]
pada image booting selain
kernel
, ramdisk
, dan second sections
. Untuk mengetahui detail tentang
kolom recovery_[dtbo|acpio]_size
dan recovery_[dtbo|acpio]_offset
, lihat
Image Pemulihan.
Header image booting lama, versi 0
Perangkat yang diluncurkan sebelum Android 9 menggunakan versi lama {i>header<i} {i>boot image<i} dianggap sebagai penggunaan header {i>boot image<i} versi 0.
struct boot_img_hdr
{
uint8_t magic[BOOT_MAGIC_SIZE];
uint32_t kernel_size; /* size in bytes */
uint32_t kernel_addr; /* physical load addr */
uint32_t ramdisk_size; /* size in bytes */
uint32_t ramdisk_addr; /* physical load addr */
uint32_t second_size; /* size in bytes */
uint32_t second_addr; /* physical load addr */
uint32_t tags_addr; /* physical addr for kernel tags */
uint32_t page_size; /* flash page size we assume */
uint32_t unused;
uint32_t os_version;
uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
uint8_t cmdline[BOOT_ARGS_SIZE];
uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
};