Android 9 में, बूट इमेज के हेडर में वर्शन फ़ील्ड जोड़ा गया है. इससे, पुराने सिस्टम के साथ काम करने की सुविधा को बनाए रखते हुए, हेडर में अपडेट किए जा सकते हैं. बूटलोडर को हेडर वर्शन फ़ील्ड की जांच करनी चाहिए और उसके हिसाब से हेडर को पार्स करना चाहिए. इन डिवाइसों पर लॉन्च किया जा रहा है:
- Android 13, बूट हेडर के वर्शन 3 या 4 का इस्तेमाल कर सकता है. जेनरिक कर्नेल इमेज
(जीकेआई) आर्किटेक्चर के साथ काम करने वाले डिवाइसों के लिए, वर्शन 4 मुख्य बूट इमेज है. साथ ही, बूट हेडर में
os_version
फ़ील्ड शून्य होना चाहिए. इसके बजाय, डिवाइस के बूटलोडर को Android वेरिफ़ाइड बूट (AVB) प्रॉपर्टी से वर्शन की जानकारी मिलनी चाहिए. - Android 12, बूट हेडर के वर्शन 3 या 4 का इस्तेमाल कर सकता है. Generic Kernel Image (GKI) आर्किटेक्चर के साथ काम करने वाले डिवाइसों के लिए, वर्शन 4 मुख्य बूट इमेज है.
- Android 11, बूट हेडर के तीसरे वर्शन का इस्तेमाल कर सकता है. Generic Kernel Image (GKI) आर्किटेक्चर के साथ काम करने वाले डिवाइसों के लिए, प्राइमरी बूट इमेज के तौर पर इस वर्शन का इस्तेमाल किया जाना चाहिए.
- Android 10 में, बूट हेडर का वर्शन 2 इस्तेमाल करना ज़रूरी है.
- Android 9 में, बूट हेडर का वर्शन 1 इस्तेमाल करना ज़रूरी है.
- Android 8 और इससे पहले के वर्शन को बूट इमेज हेडर वर्शन 0 का इस्तेमाल करने वाला माना जाता है.
Android 9 या इसके बाद के वर्शन पर काम करने वाले सभी डिवाइसों के लिए, वेंडर टेस्ट सुइट (वीटीएस), boot/recovery
इमेज के फ़ॉर्मैट की जांच करता है. इससे यह पक्का होता है कि बूट इमेज हेडर, सही वर्शन का इस्तेमाल करता है. काम करने वाले सभी बूट और वेंडर बूट इमेज हेडर पर AOSP की जानकारी देखने के लिए, system/tools/mkbootimg/include/bootimg/bootimg.h
देखें.
बूट इमेज के हेडर के वर्शन को लागू करना
mkbootimg
टूल, इन आर्ग्युमेंट को स्वीकार करता है.
आर्ग्युमेंट | ब्यौरा |
---|---|
header_version |
बूट इमेज हेडर वर्शन को सेट करता है. हेडर वर्शन वाली बूट इमेज:
|
recovery_dtbo |
इसका इस्तेमाल DTB का इस्तेमाल करने वाले आर्किटेक्चर के लिए किया जाता है. रिकवरी DTBO इमेज का पाथ बताता है. A/B डिवाइसों के लिए ज़रूरी नहीं है. इन डिवाइसों को रिकवरी इमेज की ज़रूरत नहीं होती.
header_version का इस्तेमाल करने वाले ऐसे डिवाइस जो A/B टेस्टिंग के दायरे में नहीं आते:
|
recovery_acpio |
इसका इस्तेमाल उन आर्किटेक्चर के लिए किया जाता है जो DTB के बजाय ACPI का इस्तेमाल करते हैं. रिकवरी एसीपीआईओ इमेज
का पाथ बताता है. A/B डिवाइसों के लिए ज़रूरी नहीं है. इन डिवाइसों को रिपेयर करने के लिए, रिपेयर इमेज की ज़रूरत नहीं होती. header_version का इस्तेमाल करने वाले नॉन-A/B डिवाइस:
|
dtb |
DTB इमेज का पाथ, जो बूट/रिकवरी इमेज में शामिल है. |
dtb_offset |
base आर्ग्युमेंट में जोड़े जाने पर, यह आखिरी डिवाइस ट्री के लिए फ़िज़िकल लोड
पता देता है. उदाहरण के लिए, अगर base
आर्ग्युमेंट 0x10000000 है और dtb_offset आर्ग्युमेंट
0x01000000 है, तो बूट इमेज के हेडर में dtb_addr_field को 0x11000000 के तौर पर पॉप्युलेट किया जाता है. |
डिवाइस BoardConfig.mk
, mkbootimg
के बोर्ड के हिसाब से तय किए गए अन्य आर्ग्युमेंट में header version
जोड़ने के लिए, कॉन्फ़िगरेशन BOARD_MKBOOTIMG_ARGS
का इस्तेमाल करता है. उदाहरण के लिए:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
Android बिल्ड सिस्टम, रिकवरी इमेज बनाते समय mkbootimg
टूल के आर्ग्युमेंट recovery_dtbo
को सेट करने के लिए, BoardConfig
वैरिएबलBOARD_PREBUILT_DTBOIMAGE
का इस्तेमाल करता है. Android ओपन सोर्स प्रोजेक्ट (एओएसपी) में किए गए बदलावों की जानकारी के लिए, बूट इमेज हेडर वर्शन से जुड़ी बदलाव की सूचियां देखें.
बूट इमेज का हेडर, वर्शन 4
Android 12 में, बूट इमेज के हेडर वर्शन 4 में एक boot_signature
मौजूद होता है. इसका इस्तेमाल करके, कर्नेल और रैमडिस्क की इंटिग्रिटी की जांच की जा सकती है. जांच VtsSecurityAvbTest में की जाती है और यह जीकेआई आर्किटेक्चर का इस्तेमाल करने वाले डिवाइसों के लिए ज़रूरी है. हालांकि, डिवाइस के हिसाब से पुष्टि की गई बूट प्रोसेस में boot_signature
का इस्तेमाल नहीं किया जाता. इसका इस्तेमाल सिर्फ़ वीटीएस में किया जाता है. ज़्यादा जानकारी के लिए, GKI boot.img बोर्ड कॉन्फ़िगरेशन और GKI की पुष्टि की गई बूट सेटिंग देखें.
विक्रेता बूट इमेज हेडर वर्शन 4 में एक से ज़्यादा वेंडर रैम डिस्क फ़्रैगमेंट काम करते हैं.
बूट इमेज हेडर के वर्शन 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 */
};
बूट इमेज का हेडर, तीसरा वर्शन
Android 11, बूट इमेज हेडर को वर्शन 3 पर अपडेट करता है. इससे, यह डेटा हट जाता है:
दूसरे चरण का बूटलोडर.
second_size
औरsecond_addr
फ़ील्ड अब बूट इमेज के हेडर में नहीं दिखते. दूसरे चरण वाले बूटलोडर वाले डिवाइसों को, उस बूटलोडर को अपने सेक्शन में सेव करना होगा.रिकवरी इमेज. रिकवरी इमेज की जानकारी देने की ज़रूरत को हटा दिया गया है. साथ ही,
recovery_dtbo_size
,recovery_dtbo_offset
,recovery_acpio_size
, औरrecovery_acpio_offset
फ़ील्ड अब बूट इमेज हेडर में नहीं दिखते.A/B डिवाइस ऐसे अपडेट और रिकवरी स्कीम का इस्तेमाल करते हैं जिसकी वजह से, रिकवरी के लिए डीटीबीओ या एसीपीआईओ इमेज बताना ज़रूरी नहीं है.
ऐसे नॉन-A/B डिवाइसों को रिकवरी इमेज (DTBO या ACPIO) की जानकारी देनी चाहिए जो बूट इमेज हेडर के वर्शन 1 या 2 का इस्तेमाल करते हैं.
डिवाइस ट्री ब्लॉब (डीटीबी). डीटीबी को वेंडर बूट पार्टिशन में सेव किया जाता है. इसलिए,
dtb_size
औरdtb_addr
फ़ील्ड अब बूट इमेज के हेडर में नहीं दिखते. हालांकि, वे वेंडर बूट इमेज के हेडर में मौजूद होते हैं.
डिवाइस, Generic Kernel Image (GKI) आर्किटेक्चर का पालन करने के लिए, बूट इमेज हेडर के वर्शन 3 का इस्तेमाल कर सकते हैं. यह आर्किटेक्चर, कोर कर्नेल को एक साथ जोड़ता है और बूट के लिए ज़रूरी वेंडर मॉड्यूल को 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 नीचे दिए गए फ़ॉर्मैट का इस्तेमाल करता है.
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 या उसके बाद वाले वर्शन पर सेट करना होगा (इसकी पुष्टि वीटीएस ने की है).
बूट इमेज हेडर वर्शन का वर्शन 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 ओवरले इमेज तय की जा सकती है. इससे, ऑवर-द-एयर (ओटीए) अपडेट के दौरान होने वाली गड़बड़ियों को कम करने में मदद मिलती है. (A/B डिवाइसों में यह समस्या नहीं होती और इन्हें ओवरले इमेज की जानकारी देने की ज़रूरत नहीं होती.) आप या तो 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
फ़ील्ड में kernel
, ramdisk
, और second sections
के साथ-साथ बूट इमेज के recovery_[dtbo|acpio]
सेक्शन के लिए SHA-1 डाइजेस्ट शामिल होता है. 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];
};