Android 9 เปิดตัวช่องเวอร์ชันในส่วนหัวรูปภาพการเปิดเครื่อง ซึ่งช่วยให้อัปเดตส่วนหัวได้ขณะที่ยังคงความเข้ากันได้แบบย้อนหลัง Bootloader ต้องตรวจสอบช่องเวอร์ชันส่วนหัวและแยกวิเคราะห์ส่วนหัวให้สอดคล้องกัน อุปกรณ์ที่กำลังจะเปิดตัวด้วย:
- Android 13 สามารถใช้ส่วนหัวการเปิดเครื่องเวอร์ชัน 3 หรือ 4 สำหรับอุปกรณ์ที่รองรับสถาปัตยกรรมอิมเมจเคอร์เนลทั่วไป (GKI) เวอร์ชัน 4 คืออิมเมจการเปิดเครื่องหลักและช่อง
os_version
ในส่วนหัวเปิดเครื่องต้องเป็น 0 คาดว่า Bootloader ของอุปกรณ์จะได้รับข้อมูลเวอร์ชันจากคุณสมบัติการเปิดเครื่องที่ได้รับการยืนยันของ Android (AVB) แทน - Android 12 สามารถใช้ส่วนหัวเปิดเครื่องเวอร์ชัน 3 หรือ 4 ได้ สำหรับอุปกรณ์ที่รองรับสถาปัตยกรรมอิมเมจเคอร์เนลทั่วไป (GKI) เวอร์ชัน 4 จะเป็นอิมเมจการเปิดเครื่องหลัก
- Android 11 สามารถใช้ส่วนหัวการเปิดเครื่องเวอร์ชัน 3 ได้ สำหรับอุปกรณ์ที่รองรับสถาปัตยกรรมอิมเมจเคอร์เนลทั่วไป (GKI) คุณต้องใช้เวอร์ชันนี้สำหรับอิมเมจการเปิดเครื่องหลัก
- Android 10 ต้องใช้ส่วนหัวการเปิดเครื่องเวอร์ชัน 2
- Android 9 ต้องใช้ส่วนหัวการเปิดเครื่องเวอร์ชัน 1
- Android 8 และต่ำกว่าจะถือว่าใช้ส่วนหัวอิมเมจการเปิดเครื่องเวอร์ชัน 0
สำหรับอุปกรณ์ทุกเครื่องที่ใช้ Android 9 ขึ้นไป Vendor Test Suite (VTS) จะตรวจสอบรูปแบบของอิมเมจ boot/recovery
เพื่อให้แน่ใจว่าส่วนหัวของอิมเมจการเปิดเครื่องใช้เวอร์ชันที่ถูกต้อง หากต้องการดูรายละเอียด AOSP ในส่วนหัวอิมเมจการเปิดเครื่องและของผู้ให้บริการที่รองรับทั้งหมด โปรดดูที่ system/tools/mkbootimg/include/bootimg/bootimg.h
ใช้การกำหนดเวอร์ชันส่วนหัวอิมเมจการเปิดเครื่อง
เครื่องมือ mkbootimg
ยอมรับอาร์กิวเมนต์ต่อไปนี้
อาร์กิวเมนต์ | คำอธิบาย |
---|---|
header_version |
ตั้งค่าเวอร์ชันส่วนหัวของอิมเมจการเปิดเครื่อง อิมเมจการเปิดเครื่องที่มีเวอร์ชันส่วนหัว
|
recovery_dtbo |
ใช้สำหรับสถาปัตยกรรมที่ใช้ DTB ระบุเส้นทางไปยังอิมเมจ DTBO การกู้คืน ไม่บังคับสำหรับอุปกรณ์ A/B ซึ่งไม่ต้องใช้อิมเมจการกู้คืน
อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ header_version :
|
recovery_acpio |
ใช้สำหรับสถาปัตยกรรมที่ใช้ ACPI แทน DTB ระบุเส้นทางไปยังอิมเมจ ACPIO การกู้คืน ไม่บังคับสำหรับอุปกรณ์ A/B ซึ่งไม่ต้องใช้อิมเมจการกู้คืน อุปกรณ์ที่ไม่ใช่ A/B ที่ใช้ header_version :
|
dtb |
เส้นทางไปยังอิมเมจ DTB ที่รวมอยู่ในอิมเมจการเปิดเครื่อง/การกู้คืน |
dtb_offset |
เมื่อเพิ่มในอาร์กิวเมนต์ base ให้ระบุที่อยู่โหลดจริงสำหรับแผนผังอุปกรณ์สุดท้าย เช่น หากอาร์กิวเมนต์ base คือ 0x10000000 และอาร์กิวเมนต์ dtb_offset คือ 0x01000000 ระบบจะป้อนข้อมูล dtb_addr_field ในส่วนหัวของอิมเมจการเปิดเครื่องเป็น 0x11000000 |
อุปกรณ์ BoardConfig.mk
ใช้การกำหนดค่า BOARD_MKBOOTIMG_ARGS
เพื่อเพิ่ม header version
ไปยังอาร์กิวเมนต์เฉพาะบอร์ดอื่นๆ ของ mkbootimg
ตัวอย่างเช่น
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
ระบบบิลด์ของ Android ใช้ตัวแปร BoardConfig
BOARD_PREBUILT_DTBOIMAGE
เพื่อตั้งค่าอาร์กิวเมนต์ recovery_dtbo
ของเครื่องมือ mkbootimg
ระหว่างการสร้างอิมเมจการกู้คืน สำหรับรายละเอียดเกี่ยวกับการเปลี่ยนแปลงของโครงการโอเพนซอร์ส Android (AOSP) ให้อ่านรายการการเปลี่ยนแปลงที่เกี่ยวข้องสำหรับการกำหนดเวอร์ชันส่วนหัวอิมเมจการเปิดเครื่อง
ส่วนหัวของรูปภาพเปิดเครื่อง เวอร์ชัน 4
Android 12 มี boot_signature
ในส่วนหัวอิมเมจการเปิดเครื่องเวอร์ชัน 4 ซึ่งสามารถใช้เพื่อตรวจสอบความสมบูรณ์ของเคอร์เนลและ RAM ได้ การตรวจสอบจะเสร็จสิ้นใน
VtsSecurityAvbTest
และจำเป็นสำหรับอุปกรณ์ที่ใช้สถาปัตยกรรม GKI อย่างไรก็ตาม boot_signature
ไม่เกี่ยวข้องกับกระบวนการเปิดเครื่องที่ได้รับการยืนยันเฉพาะอุปกรณ์และจะใช้ใน VTS เท่านั้น ดูรายละเอียดได้ที่การกำหนดค่าบอร์ด Boot.img ของ GKI และการตั้งค่าการเปิดเครื่องที่ได้รับการยืนยัน GKI
ส่วนหัวอิมเมจการเปิดเครื่องของผู้ให้บริการ เวอร์ชัน 4 รองรับ Fragment ramdisk ของผู้ให้บริการหลายรายการ
เวอร์ชัน 4 ของเวอร์ชันส่วนหัวของอิมเมจการเปิดเครื่องจะใช้รูปแบบต่อไปนี้
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 */
};
ส่วนหัวของรูปภาพเปิดเครื่อง เวอร์ชัน 3
Android 11 อัปเดตส่วนหัวของอิมเมจการเปิดเครื่องเป็นเวอร์ชัน 3 ซึ่งจะนำข้อมูลต่อไปนี้ออก
Bootloader ขั้นที่ 2 ช่อง
second_size
และsecond_addr
จะไม่ปรากฏในส่วนหัวของอิมเมจการเปิดเครื่องอีกต่อไป อุปกรณ์ที่มี Bootloader ขั้นที่ 2 ต้องจัดเก็บ Bootloader ดังกล่าวในพาร์ติชันของตนเองอิมเมจการกู้คืน ข้อกำหนดในการระบุอิมเมจการกู้คืนเลิกใช้งานแล้ว และช่อง
recovery_dtbo_size
,recovery_dtbo_offset
,recovery_acpio_size
และrecovery_acpio_offset
จะไม่ปรากฏในส่วนหัวของอิมเมจการเปิดเครื่องอีกต่อไปอุปกรณ์ A/B ใช้รูปแบบการอัปเดตและการกู้คืนที่ทำให้ไม่จำเป็นต้องระบุอิมเมจ DTBO หรือ ACPIO สำหรับการกู้คืน
อุปกรณ์ที่ไม่ใช่ A/B ที่ต้องการระบุอิมเมจการกู้คืน (DTBO หรือ ACPIO) ควรใช้ส่วนหัวอิมเมจการเปิดเครื่องเวอร์ชัน 1 หรือ 2
Device Tree Blob (DTB) ระบบจะจัดเก็บ DTB ไว้ในพาร์ติชันบูตของผู้ให้บริการ ดังนั้นช่อง
dtb_size
และdtb_addr
จะไม่ปรากฏในส่วนหัวอิมเมจการเปิดเครื่องอีกต่อไป (แต่จะแสดงในส่วนหัวอิมเมจการเปิดเครื่องของผู้ให้บริการ)
อุปกรณ์สามารถใช้ส่วนหัวอิมเมจการเปิดเครื่องเวอร์ชัน 3 เพื่อให้สอดคล้องกับสถาปัตยกรรมอิมเมจ Kernel ทั่วไป (GKI) ซึ่งจะรวมเคอร์เนลหลักและย้ายโมดูลของผู้ให้บริการที่จำเป็นต่อการบูตไปยังพาร์ติชัน vendor_boot
(หมายความว่าอิมเมจการเปิดเครื่องจะมีเฉพาะคอมโพเนนต์ GKI เท่านั้น) อุปกรณ์ที่มีลักษณะดังนี้
ใช้ GKI (ต้องมีเคอร์เนล android-4.19 หรือ android-5.4) แต่ไม่ใช้การอัปเดต A/B สามารถระบุอิมเมจการกู้คืนได้โดยใช้อิมเมจการกู้คืนเวอร์ชัน 3 สำหรับอิมเมจการเปิดเครื่องและอิมเมจการเปิดเครื่องเวอร์ชัน 2 สำหรับอิมเมจการกู้คืน
อย่าใช้ GKI และไม่ใช้การอัปเดต A/B จะระบุอิมเมจการกู้คืนได้โดยใช้อิมเมจการกู้คืนเวอร์ชัน 1 หรือ 2 สำหรับทั้งอิมเมจการเปิดเครื่องและอิมเมจการกู้คืน
เวอร์ชัน 3 ของเวอร์ชันส่วนหัวของอิมเมจการเปิดเครื่องจะใช้รูปแบบต่อไปนี้
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];
};
ส่วนหัวของรูปภาพเปิดเครื่อง เวอร์ชัน 2
Android 10 อัปเดตส่วนหัวของอิมเมจการเปิดเครื่องเป็นเวอร์ชัน 2 ซึ่งจะเพิ่มส่วนสำหรับข้อมูลอิมเมจ DTB การกู้คืน (ขนาดรูปภาพและที่อยู่การโหลดจริง)
เวอร์ชัน 2 ของเวอร์ชันส่วนหัวของอิมเมจการเปิดเครื่องจะใช้รูปแบบต่อไปนี้
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 */
};
ส่วนหัวของรูปภาพเปิดเครื่อง เวอร์ชัน 1
Android 9 แปลงช่อง unused
ของส่วนหัวรูปภาพการเปิดเครื่องเป็นช่องเวอร์ชันส่วนหัว อุปกรณ์ที่ใช้ Android 9 ต้องใช้ส่วนหัวอิมเมจการเปิดเครื่องโดยตั้งค่าเวอร์ชันส่วนหัวเป็น 1 ขึ้นไป (ยืนยันโดย VTS)
เวอร์ชัน 1 ของเวอร์ชันส่วนหัวของอิมเมจการเปิดเครื่องจะใช้รูปแบบต่อไปนี้
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 */
};
อุปกรณ์ที่ไม่ใช่ A/B สามารถระบุรูปภาพซ้อนทับ DTB/ACPI สำหรับการกู้คืนเพื่อช่วยลดความล้มเหลวในการอัปเดตผ่านอากาศ (OTA) (อุปกรณ์ A/B จะไม่มีปัญหานี้และ ไม่จำเป็นต้องระบุภาพซ้อนทับ) คุณระบุอิมเมจ DTBO หรือรูปภาพ ACPIO ได้ แต่ระบุทั้ง 2 อย่างไม่ได้ (เนื่องจากใช้ในสถาปัตยกรรมที่ต่างกัน) หากต้องการกำหนดค่าส่วนหัวอิมเมจการเปิดเครื่องอย่างถูกต้อง ให้ทำดังนี้
อิมเมจ DTBO สำหรับการกู้คืน ประกอบด้วยช่อง
recovery_dtbo_size
และrecovery_dtbo_offset
(ไม่รวมช่องrecovery_acpio_size
และrecovery_acpio_offset
)อิมเมจ ACPIO สำหรับการกู้คืนมีช่อง
recovery_acpio_size
และrecovery_acpio_offset
(ไม่รวมช่องrecovery_dtbo_size
และrecovery_dtbo_offset
)
ช่อง header_size
จะมีขนาดของส่วนหัวอิมเมจการเปิดเครื่อง หากตั้งค่าเวอร์ชันส่วนหัวของรูปภาพการเปิดเครื่องเป็น 1 ช่อง id
จะมีไดเจสต์ SHA-1 สำหรับส่วน recovery_[dtbo|acpio]
ของอิมเมจการเปิดเครื่อง นอกเหนือจาก kernel
, ramdisk
และ second sections
ดูรายละเอียดเกี่ยวกับช่อง recovery_[dtbo|acpio]_size
และ recovery_[dtbo|acpio]_offset
ได้ที่อิมเมจการกู้คืน
ส่วนหัวอิมเมจการเปิดเครื่องแบบเดิม เวอร์ชัน 0
อุปกรณ์ที่เปิดตัวก่อน Android 9 โดยใช้ส่วนหัวรูปภาพเปิดเครื่องแบบเดิมจะถือว่าใช้ส่วนหัวของรูปภาพเปิดเครื่องเวอร์ชัน 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];
};