Android 9 ได้เปิดตัวฟิลด์เวอร์ชันในส่วนหัวของรูปภาพการบูต ซึ่งช่วยให้อัปเดตส่วนหัวได้ในขณะที่ยังคงความเข้ากันได้แบบย้อนหลัง Bootloader ต้องตรวจสอบฟิลด์เวอร์ชันส่วนหัวและแยกวิเคราะห์ส่วนหัว ตามนั้น อุปกรณ์ที่เปิดตัวพร้อมกับ
- Android 13 สามารถใช้ส่วนหัวของการบูตเวอร์ชัน 3 หรือ 4 ได้ สำหรับอุปกรณ์ที่รองรับสถาปัตยกรรมรูปภาพเคอร์เนลทั่วไป
(GKI)
 เวอร์ชัน 4 จะเป็นรูปภาพการบูตหลัก และฟิลด์
os_versionในส่วนหัวของการบูตต้องเป็น 0 คาดว่า Bootloader ของอุปกรณ์จะ รับข้อมูลเวอร์ชันจากพร็อพเพอร์ตี้ Android Verified Boot (AVB) แทน
- Android 12 ใช้ส่วนหัวของการบูตเวอร์ชัน 3 หรือ 4 ได้ สำหรับอุปกรณ์ที่รองรับสถาปัตยกรรม Generic Kernel Image (GKI) เวอร์ชัน 4 คือรูปภาพการบูตหลัก
- Android 11 สามารถใช้ส่วนหัวของการบูตเวอร์ชัน 3 ได้ สำหรับอุปกรณ์ที่รองรับสถาปัตยกรรม Generic Kernel Image (GKI) คุณต้องใช้เวอร์ชันนี้สำหรับอิมเมจการบูตหลัก
- Android 10 ต้องใช้ส่วนหัวการบูตเวอร์ชัน 2
- Android 9 ต้องใช้ส่วนหัวการบูตเวอร์ชัน 1
- Android 8 และต่ำกว่าถือว่าใช้ส่วนหัวของรูปภาพการบูตเวอร์ชัน 0
สำหรับอุปกรณ์ทั้งหมดที่ใช้ Android 9 ขึ้นไป 
ชุดทดสอบของผู้ให้บริการ (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 ซึ่งใช้ตรวจสอบความสมบูรณ์ของเคอร์เนลและ
แรมดิสก์ได้ การตรวจสอบจะดำเนินการใน
VtsSecurityAvbTest
และจำเป็นสำหรับอุปกรณ์ที่ใช้สถาปัตยกรรม GKI อย่างไรก็ตาม 
boot_signature ไม่ได้เกี่ยวข้องกับกระบวนการเปิดเครื่องที่ได้รับการยืนยันเฉพาะอุปกรณ์
และใช้ใน VTS เท่านั้น ดูรายละเอียดได้ที่การกำหนดค่าบอร์ด boot.img ของ GKI
และการตั้งค่าการเปิดเครื่องที่ได้รับการยืนยันของ GKI
ส่วนหัวของอิมเมจการบูตของผู้ให้บริการ เวอร์ชัน 4 รองรับ Fragment ของ Vendor 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 ซึ่งจะนำข้อมูลต่อไปนี้ออก
- โปรแกรมโหลดระบบปฏิบัติการขั้นที่ 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 เพื่อให้เป็นไปตามสถาปัตยกรรม Generic Kernel Image
(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 แต่อย่างใดอย่างหนึ่งเท่านั้น (เนื่องจากสถาปัตยกรรมที่ใช้จะแตกต่างกัน) หากต้องการกำหนดค่าส่วนหัวของอิมเมจการบูตอย่างถูกต้อง เมื่อใช้
- รูปภาพ 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];
};
