في Android 9، تم تقديم حقل إصدار في عنوان صورة التشغيل، ما يتيح إجراء تعديلات على العنوان مع الحفاظ على التوافق مع الأنظمة القديمة. يجب أن يتحقّق برنامج الإقلاع من حقل إصدار العنوان وأن يحلّل العنوان وفقًا لذلك. الأجهزة التي يتم تشغيلها باستخدام:
- يمكن لنظام التشغيل Android 13 استخدام الإصدار 3 أو 4 من عنوان الإقلاع. بالنسبة إلى الأجهزة التي تتوافق مع بنية صورة النواة العامة (GKI)، يكون الإصدار 4 هو صورة التشغيل الأساسية ويجب أن يكون الحقل
os_versionفي عنوان الإقلاع صفرًا. من المفترض أن يحصل برنامج إقلاع الجهاز على معلومات الإصدار من خصائص التشغيل المتحقّق منه من Android (AVB) بدلاً من ذلك. - يمكن لنظام التشغيل Android 12 استخدام الإصدار 3 أو 4 من عنوان الإقلاع. بالنسبة إلى الأجهزة التي تتوافق مع بنية صورة النواة العامة (GKI) ، يكون الإصدار 4 هو صورة التشغيل الأساسية.
- يمكن لنظام التشغيل Android 11 استخدام الإصدار 3 من عنوان الإقلاع. بالنسبة إلى الأجهزة التي تتوافق مع بنية صورة النواة العامة (GKI)، يجب استخدام هذا الإصدار لصورة التشغيل الأساسية.
- يجب أن يستخدم نظام التشغيل Android 10 الإصدار 2 من عنوان الإقلاع.
- يجب أن يستخدم نظام التشغيل Android 9 الإصدار 1 من عنوان الإقلاع.
- يُعتبر نظاما التشغيل Android 8 والإصدارات الأقدم منهما يستخدمان الإصدار 0 من عنوان صورة التشغيل.
بالنسبة إلى جميع الأجهزة التي تعمل بنظام التشغيل Android 9 أو إصدار أحدث، تتحقّق
"حزمة اختبارية" (VTS) من تنسيق صورة
boot/recovery للتأكّد من أنّ عنوان صورة التشغيل يستخدم الإصدار الصحيح. للاطّلاع على تفاصيل "مشروع Android مفتوح المصدر" (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 المتغيّر BOARD_PREBUILT_DTBOIMAGE في BoardConfig لضبط الوسيطة recovery_dtbo لأداة mkbootimg أثناء إنشاء صورة استرداد الإعدادات الأصلية. للاطّلاع على تفاصيل التغييرات في
"مشروع Android مفتوح المصدر" (AOSP)، يُرجى مراجعة قوائم التغييرات المرتبطة
بتحديد إصدارات عنوان صورة الإقلاع.
عنوان صورة التشغيل، الإصدار 4
يوفّر Android 12 boot_signature في الإصدار 4 من عنوان صورة التشغيل، ويمكن استخدامه للتحقّق من سلامة النواة وramdisk. يتم إجراء عملية التحقّق في
VtsSecurityAvbTest
وهي مطلوبة للأجهزة التي تستخدم بنية GKI. ومع ذلك، لا تشارك boot_signature في عملية الإقلاع الآمن الخاصة بالجهاز والتي تم التحقّق منها، ولا تُستخدم إلا في VTS. للاطّلاع على التفاصيل، يُرجى مراجعة إعدادات لوحة GKI boot.img
والإعدادات التي تم التحقّق منها للإقلاع الآمن في GKI
.
يتوافق الإصدار 4 من عنوان صورة التشغيل المزوّدة من جهة خارجية مع أجزاء متعددة من 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، الذي يزيل البيانات التالية:
برنامج الإقلاع في المرحلة الثانية لم يعُد الحقلان
second_sizeوsecond_addrيظهران في عنوان صورة التشغيل. يجب أن تخزّن الأجهزة التي تتضمّن برنامج إقلاع في المرحلة الثانية برنامج الإقلاع هذا في قسم خاص به.صورة استرداد الإعدادات الأصلية تم إيقاف شرط تحديد صورة استرداد الإعدادات الأصلية، ولم تعُد الحقول
recovery_dtbo_sizeوrecovery_dtbo_offsetوrecovery_acpio_sizeوrecovery_acpio_offsetتظهر في عنوان صورة التشغيل.تستخدم أجهزة A/B نظامًا للتعديل والاسترداد لا يستلزم تحديد صورة DTBO أو ACPIO للاسترداد.
يجب أن تستخدم الأجهزة غير A/B التي تريد تحديد صورة استرداد الإعدادات الأصلية (إما DTBO أو ACPIO) الإصدار 1 أو 2 من عنوان صورة التشغيل.
كائن شجرة الجهاز (DTB) يتم تخزين DTB في قسم الإقلاع المزوّد من جهة خارجية ، لذا لم يعُد الحقلان
dtb_sizeوdtb_addrيظهران في عنوان صورة التشغيل (ولكنهما يظهران في عنوان صورة الإقلاع المزوّدة من جهة خارجية).
يمكن للأجهزة استخدام الإصدار 3 من عنوان صورة التشغيل للامتثال لبنية صورة النواة العامة
(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];
};