در اندروید ۱۲، تصویر boot عمومی که به آن تصویر هسته عمومی (GKI) گفته میشود، شامل ramdisk عمومی و هسته GKI است.
برای دستگاههایی که با اندروید ۱۳ عرضه میشوند، ramdisk عمومی از تصویر boot حذف شده و در یک تصویر init_boot جداگانه قرار میگیرد. این تغییر، تصویر boot را تنها با هسته GKI باقی میگذارد.
برای دستگاههایی که همچنان از اندروید ۱۲ یا نسخههای قدیمیتر کرنل استفاده میکنند، ramdisk عمومی بدون نیاز به یک تصویر جدید init_boot در جای خود باقی میماند.
برای ساخت یک ramdisk عمومی، منابع مختص فروشنده را از ramdisk خارج کنید به طوری که ramdisk عمومی فقط شامل init مرحله اول و یک فایل ویژگی باشد که حاوی اطلاعات timestamp است.
در دستگاههایی که:
از یک پارتیشن
recoveryاختصاصی استفاده نکنید، تمام بیتهای ریکاوری از ramdisk عمومی بهvendor_bootramdisk منتقل میشوند.از یک پارتیشن
recoveryاختصاصی استفاده کنید، هیچ تغییری در رمدیسکrecoveryلازم نیست زیرا رمدیسکrecoveryمستقل است.
معماری
نمودارهای زیر معماری دستگاههایی که اندروید ۱۲ و بالاتر را اجرا میکنند را نشان میدهند. دستگاههایی که با اندروید ۱۳ راهاندازی میشوند، یک ایمیج init_boot جدید دارند که حاوی ramdisk عمومی است. دستگاههایی که از اندروید ۱۲ به اندروید ۱۳ ارتقا مییابند، از همان معماری اندروید ۱۲ استفاده میکنند.
با اندروید ۱۳ اجرا میشود، بدون ریکاوری اختصاصی

شکل ۱. دستگاههایی که در حال راهاندازی یا ارتقاء به اندروید ۱۳ هستند، با GKI، بدون بازیابی اختصاصی.
راهاندازی با اندروید ۱۳، ریکاوری اختصاصی و A/B (رمدیسک اختصاصی)

شکل ۲. دستگاههایی که در حال راهاندازی یا ارتقاء به اندروید ۱۳ هستند، با GKI اختصاصی و بازیابی A/B.
اگر دستگاه دارای پارتیشنهای recovery_a و recovery_b است، به این شکل مراجعه کنید.
راهاندازی با اندروید ۱۳، ریکاوری اختصاصی و غیر A/B (رمدیسک اختصاصی)

شکل ۳. دستگاههایی که در حال راهاندازی یا ارتقاء به اندروید ۱۳ هستند، با GKI، بازیابی اختصاصی و غیر A/B.
اگر دستگاه دارای پارتیشنی به نام recovery بدون پسوند slot است، به این شکل مراجعه کنید.
راهاندازی یا ارتقا به اندروید ۱۲، بدون نیاز به ریکاوری اختصاصی

شکل ۴. دستگاههایی که در حال راهاندازی یا ارتقاء به اندروید ۱۲ هستند، با GKI، بدون بازیابی اختصاصی.
راهاندازی یا ارتقا به اندروید ۱۲، ریکاوری اختصاصی و A/B (رمدیسک اختصاصی)

شکل ۵. دستگاههایی که در حال راهاندازی یا ارتقاء به اندروید ۱۲ هستند، با GKI اختصاصی و بازیابی A/B.
اگر دستگاه دارای پارتیشنهای recovery_a و recovery_b است، به این شکل مراجعه کنید.
راهاندازی یا ارتقا به اندروید ۱۲، ریکاوری اختصاصی و غیر A/B (رمدیسک اختصاصی)

شکل ۶. دستگاههایی که در حال راهاندازی یا ارتقاء به اندروید ۱۲ هستند، با GKI، بازیابی اختصاصی و غیر A/B.
اگر دستگاه دارای پارتیشنی به نام recovery بدون پسوند slot است، به این شکل مراجعه کنید.
ارتقا به اندروید ۱۲، بازیابی هنگام بوت (بازیابی به عنوان رم دیسک)

شکل ۷. دستگاههای در حال ارتقا به اندروید ۱۲، بدون GKI، بازیابی هنگام بوت.
ارتقا به اندروید ۱۲، ریکاوری اختصاصی (رمدیسک اختصاصی)

شکل ۸. دستگاههای در حال ارتقا به اندروید ۱۲، بدون GKI، بازیابی اختصاصی.
محتویات تصاویر بوت
تصاویر بوت اندروید شامل موارد زیر است.
ایمیج
init_bootبرای دستگاههایی که با اندروید ۱۳ عرضه میشوند اضافه شد- نسخه هدر V4
- ایمیج عمومی رمدیسک
تصویر
bootعمومی- نسخه هدر V3 یا V4
- یک
boot_signatureبرای گواهینامه GKI boot.img (فقط نسخه ۴).boot.imgGKI تایید شده برای بوت تایید شده امضا نشده است. تولیدکنندگان اصلی تجهیزات (OEM) همچنان بایدboot.imgاز پیش ساخته شده را با یک کلید AVB مخصوص دستگاه امضا کنند. -
cmdlineعمومی (GENERIC_KERNEL_CMDLINE) - هسته GKI
- یک
- ایمیج عمومی رمدیسک
- فقط در تصاویر
bootاندروید ۱۲ و قبل از آن گنجانده شده است
- فقط در تصاویر
- نسخه هدر V3 یا V4
تصویر
vendor_boot(برای جزئیات بیشتر، به بخش پارتیشنهای بوت فروشنده مراجعه کنید)- هدر
vendor_boot-
cmdlineمخصوص دستگاه (BOARD_KERNEL_CMDLINE)
-
- ایمیج ramdisk
vendor_boot-
lib/modules - منابع بازیابی (در صورت عدم وجود بازیابی اختصاصی)
-
- تصویر
dtb
- هدر
تصویر
recovery- نسخه هدر V2
- در صورت لزوم،
cmdlineمخصوص دستگاه برای بازیابی - برای پارتیشن بازیابی غیر A/B، محتویات هدر باید مستقل باشند؛ به تصاویر بازیابی مراجعه کنید. برای مثال:
-
cmdlineبهbootوvendor_bootcmdlineالحاق نشده است. - در صورت لزوم، هدر، DTBO بازیابی را مشخص میکند.
- برای پارتیشن بازیابی A/B، محتویات را میتوان به هم پیوند داد یا از
bootوvendor_bootاستنباط کرد. برای مثال: -
cmdlineبهbootوvendor_bootcmdlineالحاق شده است. - DTBO را میتوان از هدر
vendor_bootاستنباط کرد.
- در صورت لزوم،
-
recoveryایمیج رمدیسک- منابع بازیابی
- برای پارتیشن بازیابی غیر A/B، محتویات ramdisk باید مستقل باشند؛ به تصاویر بازیابی مراجعه کنید. برای مثال:
-
lib/modulesباید شامل تمام ماژولهای هسته مورد نیاز برای بوت شدن در حالت ریکاوری باشد. - ramdisk مربوط به ریکاوری باید شامل
initباشد. - برای پارتیشن بازیابی A/B، عبارت recovery ramdisk به صورت پیشفرض به generic و
vendor_bootramdisk اضافه شده است، از این رو نیازی به مستقل بودن ندارد. برای مثال: -
lib/modulesممکن است علاوه بر ماژولهای هسته درvendor_bootramdisk، فقط شامل ماژولهای هسته اضافی مورد نیاز برای راهاندازی حالت بازیابی باشد. - ممکن است پیوند نمادین در
/initوجود داشته باشد، اما توسط فایل باینری مرحله اول/initدر تصویر بوت، تحت الشعاع قرار گرفته است.
- نسخه هدر V2
محتویات عمومی تصویر رمدیسک
ramdisk عمومی شامل اجزای زیر است.
-
init -
system/etc/ramdisk/build.prop -
ro. PRODUCT .bootimg.* buildprops - دایرکتوریهای خالی برای نقاط اتصال:
debug_ramdisk/،mnt/،dev/،sys/،proc/،metadata/ -
first_stage_ramdisk/- دایرکتوریهای خالی تکراری برای نقاط اتصال:
debug_ramdisk/،mnt/،dev/،sys/،proc/،metadata/
- دایرکتوریهای خالی تکراری برای نقاط اتصال:
ادغام تصویر بوت
پرچمهای ساخت، نحوه ساخت ایمیجهای init_boot ، boot ، recovery و vendor_boot را کنترل میکنند. مقدار یک متغیر boolean board باید رشته true یا خالی باشد (که پیشفرض است).
TARGET_NO_KERNEL. این متغیر نشان میدهد که آیا نسخهٔ ساختهشده از یک تصویر بوت از پیش ساخته شده استفاده میکند یا خیر. اگر این متغیر رویtrueتنظیم شده باشد،BOARD_PREBUILT_BOOTIMAGEرا روی محل تصویر بوت از پیش ساخته شده تنظیم کنید (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img)BOARD_USES_RECOVERY_AS_BOOT. این متغیر نشان میدهد که آیا دستگاه از تصویرrecoveryبه عنوان تصویرbootاستفاده میکند یا خیر. هنگام استفاده از GKI، این متغیر خالی است و منابع بازیابی باید بهvendor_bootمنتقل شوند.BOARD_USES_GENERIC_KERNEL_IMAGE. این متغیر نشان میدهد که برد از GKI استفاده میکند. این متغیر تاثیری بر sysprops یاPRODUCT_PACKAGESندارد.این سوئیچ GKI در سطح برد است؛ تمام متغیرهای زیر توسط این متغیر محدود میشوند.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT. این متغیر کنترل میکند که آیا منابع بازیابی ramdisk برایvendor_bootساخته شدهاند یا خیر.وقتی روی
trueتنظیم شود، منابع بازیابی فقط برایvendor-ramdisk/ساخته میشوند و برایrecovery/root/ساخته نمیشوند.وقتی منابع بازیابی خالی باشند، فقط برای
recovery/root/ساخته میشوند و برایvendor-ramdisk/ساخته نمیشوند.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT. این متغیر کنترل میکند که آیا کلیدهای GSI AVB برایvendor_bootساخته شدهاند یا خیر.وقتی روی
trueتنظیم شده باشد، اگرBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT:اگر تنظیم شود، کلیدهای GSI AVB در
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb ساخته میشوند.تنظیم نشده است، کلیدهای GSI AVB در
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb ساخته شدهاند.
وقتی خالی باشد، اگر
BOARD_RECOVERY_AS_ROOT:اگر تنظیم شود، کلیدهای GSI AVB در
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb ساخته میشوند.تنظیم نشده است، کلیدهای GSI AVB در
$ANDROID_PRODUCT_OUT/ramdisk/avb ساخته شدهاند.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE. این متغیر کنترل میکند که آیا تصویرrecoveryحاوی هسته است یا خیر. دستگاههایی که با اندروید ۱۲ راهاندازی میشوند و از پارتیشنrecoveryA/B استفاده میکنند باید این متغیر را رویtrueتنظیم کنند. دستگاههایی که با اندروید ۱۲ راهاندازی میشوند و از پارتیشنهای غیر A/B استفاده میکنند باید این متغیر را رویfalseتنظیم کنند تا تصویر بازیابی مستقل باقی بماند.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES. این متغیر کنترل میکند که آیا$OUT/boot*.imgدر مسیرIMAGES/زیر فایلهای مقصد کپی شود یا خیر.aosp_arm64باید این متغیر را رویtrueتنظیم کند.سایر دستگاهها باید این متغیر را خالی بگذارند.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE. این متغیر کنترل میکند که آیاinit_boot.imgتولید شود و اندازه را تنظیم میکند. وقتی تنظیم شود، ramdisk عمومی به جایboot.imgبهinit_boot.imgاضافه میشود و نیاز دارد که متغیرهایBOARD_AVB_INIT_BOOT*برای vbmeta زنجیرهای تنظیم شوند.
ترکیبهای مجاز
| مولفه یا متغیر | ارتقاء دستگاه بدون پارتیشن ریکاوری | ارتقا دستگاه با پارتیشن ریکاوری | راه اندازی دستگاه بدون پارتیشن ریکاوری | دستگاه را با پارتیشن بازیابی A/B راه اندازی کنید | راهاندازی دستگاه با پارتیشن بازیابی غیر A/B | aosp_arm64 |
|---|---|---|---|---|---|---|
حاوی boot است | بله | بله | بله | بله | بله | بله |
شامل init_boot (اندروید ۱۳) است | خیر | خیر | بله | بله | بله | بله |
شامل vendor_boot است | اختیاری | اختیاری | بله | بله | بله | خیر |
حاوی recovery | خیر | بله | خیر | بله | بله | خیر |
BOARD_USES_RECOVERY_AS_BOOT | true | خالی | خالی | خالی | خالی | خالی |
BOARD_USES_GENERIC_KERNEL_IMAGE | خالی | خالی | true | true | true | true |
PRODUCT_BUILD_RECOVERY_IMAGE | خالی | true یا خالی | خالی | true یا خالی | true یا خالی | خالی |
BOARD_RECOVERYIMAGE_PARTITION_SIZE | خالی | > 0 | خالی | > 0 | > 0 | خالی |
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT | خالی | خالی | true | خالی | خالی | خالی |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT | خالی | خالی | true | true | true | خالی |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE | خالی | خالی | خالی | true | خالی | خالی |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES | خالی | خالی | خالی | خالی | خالی | true |
دستگاههایی که دارای یک پارتیشن recovery اختصاصی هستند میتوانند PRODUCT_BUILD_RECOVERY_IMAGE روی true یا empty تنظیم کنند. برای این دستگاهها، اگر BOARD_RECOVERYIMAGE_PARTITION_SIZE تنظیم شود، یک تصویر recovery ساخته میشود.
فعال کردن vbmeta زنجیر شده برای بوت
vbmeta زنجیرهای باید برای تصاویر boot و init_boot فعال باشد. موارد زیر را مشخص کنید:
BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
برای مثال، به این تغییر مراجعه کنید.
سیستم به عنوان ریشه
قابلیت System-as-root برای دستگاههایی که از GKI استفاده میکنند پشتیبانی نمیشود. در چنین دستگاههایی، BOARD_BUILD_SYSTEM_ROOT_IMAGE باید خالی باشد. همچنین System-as-root برای دستگاههایی که از پارتیشنهای پویا استفاده میکنند پشتیبانی نمیشود.
پیکربندیهای محصول
دستگاههایی که از ramdisk عمومی استفاده میکنند باید فهرستی از فایلهایی که مجاز به نصب در ramdisk هستند را نصب کنند. برای انجام این کار، موارد زیر را در device.mk مشخص کنید:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
فایل generic_ramdisk.mk همچنین از نصب تصادفی فایلهای دیگر توسط makefileها روی ramdisk جلوگیری میکند (به جای آن، چنین فایلهایی را به vendor_ramdisk منتقل کنید).
دستگاهها را تنظیم کنید
دستورالعملهای راهاندازی بین دستگاههایی که با اندروید ۱۳ راهاندازی میشوند، دستگاههایی که به اندروید ۱۲ ارتقا میدهند و دستگاههایی که با اندروید ۱۲ راهاندازی میشوند، متفاوت است. اندروید ۱۳، تنظیماتی مشابه با اندروید ۱۲ دارد.
دستگاههایی که به اندروید ۱۲ ارتقا مییابند:
میتواند مقدار
BOARD_USES_RECOVERY_AS_BOOTرا حفظ کند. اگر این کار را انجام دهند، از پیکربندیهای قدیمی استفاده میکنند و متغیرهای ساخت جدید باید خالی باشند. اگر چنین دستگاههایی:میتوانند
BOARD_USES_RECOVERY_AS_BOOTروی خالی تنظیم کنند. اگر این کار را انجام دهند، از پیکربندیهای جدید استفاده میکنند. اگر چنین دستگاههایی:
دستگاههایی که با اندروید ۱۲ راهاندازی میشوند باید
BOARD_USES_RECOVERY_AS_BOOTروی خالی کردن و استفاده از پیکربندیهای جدید تنظیم کنند. اگر چنین دستگاههایی:
از آنجا که aosp_arm64 فقط GKI را میسازد (و نه vendor_boot یا recovery)، یک هدف کامل نیست. برای پیکربندیهای ساخت aosp_arm64 ، به generic_arm64 مراجعه کنید.
گزینه ۱: بدون پارتیشن ریکاوری اختصاصی
دستگاههایی که پارتیشن recovery ندارند، حاوی فایل ایمیج boot عمومی در پارتیشن boot هستند. فایل vendor_boot ramdisk شامل تمام منابع ریکاوری، از جمله lib/modules (به همراه ماژولهای هسته فروشنده) است. در چنین دستگاههایی، پیکربندی محصول از generic_ramdisk.mk به ارث میرسد .
مقادیر BOARD را تنظیم کنید
مقادیر زیر را تنظیم کنید:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
فایلهای باینری اولیه و پیوندهای نمادین
ramdisk vendor_boot میتواند شامل یک پیوند /init به /system/bin/init و init_second_stage.recovery در /system/bin/init باشد. با این حال، از آنجا که ramdisk عمومی پس از ramdisk مربوط به vendor_boot الحاق میشود، پیوند نمادین /init رونویسی میشود. هنگامی که دستگاه به حالت بازیابی بوت میشود، برای پشتیبانی از init مرحله دوم، به فایل باینری /system/bin/init نیاز است. محتویات vendor_boot + ramdisks عمومی به شرح زیر است:
-
/init(از ramdisk عمومی، ساخته شده ازinit_first_stage) -
/system/bin/init(ازvendor_ramdisk، ساخته شده ازinit_second_stage.recovery)
انتقال فایلهای fstab
هر فایل fstab که در ramdisk عمومی نصب شده بود را به vendor_ramdisk منتقل کنید. برای مثال، به این تغییر مراجعه کنید.
ماژولها را نصب کنید
شما میتوانید ماژولهای مخصوص دستگاه را در vendor_ramdisk نصب کنید (اگر ماژول مخصوص دستگاهی برای نصب ندارید، از این مرحله صرف نظر کنید).
هنگام نصب ماژول در
/first_stage_ramdiskاز نوعvendor_ramdiskماژول استفاده کنید. این ماژول باید پس از اینکهinitroot را به/first_stage_ramdiskسوئیچ میکند، اما قبل از اینکهinitroot را به/systemسوئیچ کند، در دسترس باشد. برای مثال، به بررسیهای متادیتا و فشردهسازی مجازی A/B مراجعه کنید.هنگام نصب ماژول در
/، از نوعrecoveryماژول استفاده کنید. این ماژول باید قبل از اینکهinitریشه را به/first_stage_ramdiskسوئیچ کند، در دسترس باشد. برای جزئیات بیشتر در مورد نصب ماژولها در/، به کنسول مرحله اول مراجعه کنید.
کنسول مرحله اول
از آنجا که کنسول مرحله اول قبل از اینکه init ریشه را به /first_stage_ramdisk سوئیچ کند، شروع میشود، باید نوع recovery ماژولها را نصب کنید. به طور پیشفرض، هر دو نوع ماژول در build/make/target/product/base_vendor.mk نصب میشوند، بنابراین اگر فایل makefile دستگاه از آن فایل ارثبری کند، نیازی به نصب صریح نوع recovery ندارید.
برای نصب صریح ماژولهای بازیابی، از موارد زیر استفاده کنید.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
این تضمین میکند که linker ، sh و toybox در مسیر $ANDROID_PRODUCT_OUT/recovery/root/system/bin نصب میشوند، که سپس در مسیر /system/bin تحت vendor_ramdisk نصب میشوند.
برای افزودن ماژولهای مورد نیاز برای کنسول مرحله اول (مثلاً adbd)، از موارد زیر استفاده کنید.
PRODUCT_PACKAGES += adbd.recovery
این تضمین میکند که ماژولهای مشخص شده در مسیر $ANDROID_PRODUCT_OUT/recovery/root/system/bin نصب میشوند، که سپس در مسیر /system/bin تحت vendor_ramdisk نصب میشوند.
چکسامهای متادیتا
برای پشتیبانی از بررسیهای متادیتا در طول نصب مرحله اول، دستگاههایی که از GKI پشتیبانی نمیکنند، نوع ramdisk از ماژولهای زیر را نصب میکنند. برای افزودن پشتیبانی از GKI، ماژولها را به $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin منتقل کنید:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
برای مثال، به این فهرست تغییرات مراجعه کنید.
فشردهسازی مجازی A/B
برای پشتیبانی از فشردهسازی مجازی A/B، snapuserd باید روی vendor_ramdisk نصب شود. دستگاه باید از virtual_ab_ota/compression.mk ارثبری کند، که نوع vendor_ramdisk از snapuserd را نصب میکند.
تغییرات در فرآیند بوت
روند بوت شدن به ریکاوری یا اندروید تغییر نمیکند، به استثنای موارد زیر:
-
build.propمربوط به Ramdisk به/second_stage_resourcesمنتقل میشود تاinitمرحله دوم بتواند مهر زمانی ساخت بوت را بخواند.
از آنجا که منابع از generic ramdisk به vendor_boot ramdisk منتقل میشوند، نتیجه الحاق generic ramdisk به vendor_boot ramdisk تغییر نمیکند.
e2fsck را در دسترس قرار دهید
فایلهای سازنده دستگاه میتوانند از موارد زیر ارثبری کنند:
virtual_ab_ota/launch_with_vendor_ramdisk.mkاگر دستگاه از A/B مجازی پشتیبانی میکند اما فشردهسازی را پشتیبانی نمیکند.virtual_ab_ota/compression.mkاگر دستگاه از فشردهسازی مجازی A/B پشتیبانی میکند.
فایلهای ساخت محصول، $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck را نصب میکنند. در زمان اجرا، init مرحله اول، root را به /first_stage_ramdisk سوئیچ میکند و سپس /system/bin/e2fsck را اجرا میکند.
گزینه ۲a: پارتیشن بازیابی اختصاصی و A/B
از این گزینه برای دستگاههایی با پارتیشنهای recovery A/B استفاده کنید؛ یعنی دستگاه دارای پارتیشن recovery_a و recovery_b partition است. چنین دستگاههایی شامل دستگاههای A/B و Virtual A/B هستند که پارتیشن بازیابی آنها با پیکربندی زیر قابل بهروزرسانی است:
AB_OTA_PARTITIONS += recovery
فایل vendor_boot ramdisk شامل بیتهای vendor مربوط به ماژولهای ramdisk و vendor kernel است که شامل موارد زیر میشود:
فایلهای
fstabمخصوص دستگاهlib/modules(شامل ماژولهای هسته فروشنده)
ramdisk recovery شامل تمام منابع بازیابی است. در چنین دستگاههایی، پیکربندی محصول از generic_ramdisk.mk ارثبری میکند .
مقادیر BOARD را تنظیم کنید
مقادیر زیر را برای دستگاههایی با پارتیشن recovery A/B تنظیم کنید:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
فایلهای باینری اولیه و پیوندهای نمادین
دیسک رم recovery میتواند شامل یک پیوند نمادین /init -> /system/bin/init و init_second_stage.recovery در /system/bin/init باشد. با این حال، از آنجا که دیسک رم بوت پس از دیسک رم recovery به هم متصل میشود، پیوند نمادین /init رونویسی میشود. هنگامی که دستگاه در حالت ریکاوری بوت میشود، برای پشتیبانی از init مرحله دوم، به فایل باینری /system/bin/init نیاز است.
وقتی دستگاه در حالت recovery بوت میشود، محتویات recovery + vendor_boot + generic ramdisks به شرح زیر است:
-
/init(از ramdisk، ساخته شده ازinit_first_stage) -
/system/bin/init(ازrecoveryramdisk، ساخته شده ازinit_second_stage.recovery، و اجرا شده از/init)
وقتی دستگاه در اندروید بوت میشود، محتویات vendor_boot + generic ramdisks به شرح زیر است:
-
/init(از ramdisk عمومی، ساخته شده ازinit_first_stage)
انتقال فایلهای fstab
هر فایل fstab که در ramdisk عمومی نصب شده بود را به vendor_ramdisk منتقل کنید. برای مثال، به این تغییر مراجعه کنید.
ماژولها را نصب کنید
به صورت اختیاری، میتوانید ماژولهای مخصوص دستگاه را در vendor_ramdisk نصب کنید (اگر هیچ ماژول مخصوص دستگاهی برای نصب ندارید، از این مرحله صرف نظر کنید). Init به ریشه تغییر نمیکند. نوع vendor_ramdisk از ماژولها در ریشه vendor_ramdisk نصب میشود. برای مثالهایی در مورد نصب ماژولها در vendor_ramdisk ، به کنسول مرحله اول ، بررسیهای متادیتا و فشردهسازی مجازی A/B مراجعه کنید.
کنسول مرحله اول
برای نصب نوع vendor_ramdisk از ماژولها، از موارد زیر استفاده کنید:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
این تضمین میکند که linker ، sh و toybox در مسیر $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin نصب میشوند، که سپس در مسیر /system/bin زیر مسیر vendor_ramdisk نصب میشود.
برای افزودن ماژولهای مورد نیاز برای کنسول مرحله اول (برای مثال، adbd)، نوع vendor_ramdisk این ماژولها را با آپلود وصلههای مربوطه در AOSP فعال کنید، سپس از دستور زیر استفاده کنید:
PRODUCT_PACKAGES += adbd.vendor_ramdisk
این تضمین میکند که ماژولهای مشخص شده در $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin نصب شوند. اگر vendor_boot ramdisk در حالت ریکاوری بارگذاری شده باشد، ماژول نیز در recovery موجود است. اگر vendor_boot ramdisk در حالت ریکاوری بارگذاری نشده باشد، دستگاه میتواند به صورت اختیاری adbd.recovery نیز نصب کند.
چکسامهای متادیتا
برای پشتیبانی از بررسیهای متادیتا در طول نصب مرحله اول، دستگاههایی که از GKI پشتیبانی نمیکنند، نوع ramdisk از ماژولهای زیر را نصب میکنند. برای افزودن پشتیبانی از GKI، ماژولها را به $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin منتقل کنید:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
برای مثال، به این فهرست تغییرات مراجعه کنید.
فشردهسازی مجازی A/B
برای پشتیبانی از فشردهسازی مجازی A/B، snapuserd باید روی vendor_ramdisk نصب شود. دستگاه باید از virtual_ab_ota/compression.mk ارثبری کند، که نوع vendor_ramdisk از snapuserd را نصب میکند.
تغییرات در فرآیند بوت
هنگام بوت شدن به اندروید، فرآیند بوت تغییر نمیکند. vendor_boot + generic ramdisk مشابه فرآیند بوت موجود است، با این تفاوت که fstab از vendor_boot بارگذاری میشود. از آنجا که system/bin/recovery وجود ندارد، first_stage_init آن را به عنوان یک بوت معمولی مدیریت میکند.
هنگام بوت شدن در حالت ریکاوری، فرآیند بوت تغییر میکند. دستور recovery + vendor_boot + generic ramdisk مشابه فرآیند ریکاوری موجود است، اما هسته به جای بارگذاری از تصویر recovery ، از تصویر boot بارگذاری میشود. فرآیند بوت برای حالت ریکاوری به شرح زیر است.
بوت لودر شروع به کار میکند، سپس کارهای زیر را انجام میدهد:
- recovery +
vendor_boot+ generic ramdisk را به/منتقل میکند. (اگر تولیدکننده اصلی (OEM) ماژولهای هسته را با اضافه کردن آنها بهBOARD_RECOVERY_KERNEL_MODULESدر recovery ramdisk کپی کند،vendor_bootاختیاری است.) - هسته را از پارتیشن
bootاجرا میکند.
- recovery +
کرنل ramdisk را روی
/سوار میکند و سپس/initاز ramdisk عمومی اجرا میکند.مرحله اول init شروع میشود، سپس موارد زیر را انجام میدهد:
-
IsRecoveryMode() == trueوForceNormalBoot() == falseقرار میدهد. - ماژولهای هسته فروشنده را از
/lib/modulesبارگذاری میکند. - تابع
DoFirstStageMount()فراخوانی میکند اما از نصب صرف نظر میکند زیراIsRecoveryMode() == true. (دستگاه ramdisk را آزاد نمیکند (زیرا/هنوز یکسان است) اما تابعSetInitAvbVersionInRecovery()فراخوانی میکند.) - مرحله دوم init را از
/system/bin/initاز ramdiskrecoveryشروع میکند.
-
e2fsck را در دسترس قرار دهید
فایلهای سازنده دستگاه میتوانند از موارد زیر ارثبری کنند:
virtual_ab_ota/launch_with_vendor_ramdisk.mkاگر دستگاه از A/B مجازی پشتیبانی میکند اما فشردهسازی را پشتیبانی نمیکند.virtual_ab_ota/compression.mkاگر دستگاه از فشردهسازی مجازی A/B پشتیبانی میکند.
فایلهای ساخت محصول، فایل $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck را نصب میکنند. در زمان اجرا، init مرحله اول init /system/bin/e2fsck را اجرا میکند.
گزینه ۲ب: پارتیشن بازیابی اختصاصی و غیر A/B
از این گزینه برای دستگاههایی با پارتیشن recovery غیر A/B استفاده کنید؛ یعنی دستگاه دارای پارتیشنی به نام recovery بدون پسوند اسلات است. چنین دستگاههایی عبارتند از:
- دستگاههای غیر A/B؛
- دستگاههای A/B و Virtual A/B که پارتیشن بازیابی آنها قابل بهروزرسانی نیست. (این مورد غیرمعمول است.)
فایل vendor_boot ramdisk شامل بیتهای vendor مربوط به ماژولهای ramdisk و vendor kernel است که شامل موارد زیر میشود:
- فایلهای
fstabمخصوص دستگاه -
lib/modules(شامل ماژولهای هسته فروشنده)
تصویر recovery باید مستقل باشد. باید شامل تمام منابع مورد نیاز برای بوت شدن حالت بازیابی، از جمله موارد زیر باشد:
- تصویر هسته
- تصویر DTBO
- ماژولهای هسته در
lib/modules - init مرحله اول به عنوان یک پیوند نمادین
/init -> /system/bin/init - فایل باینری
/system/bin/initمرحله دوم init - فایلهای
fstabمخصوص دستگاه - تمام منابع بازیابی دیگر، از جمله فایل باینری
recovery
در چنین دستگاههایی، پیکربندی محصول از generic_ramdisk.mk ارثبری میکند .
مقادیر BOARD را تنظیم کنید
مقادیر زیر را برای دستگاههای غیر A/B تنظیم کنید:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
فایلهای باینری اولیه و پیوندهای نمادین
دیسک رم recovery باید حاوی یک پیوند نمادین /init -> /system/bin/init و init_second_stage.recovery در /system/bin/init باشد. هنگامی که دستگاه در حالت ریکاوری بوت میشود، فایل باینری /system/bin/init برای پشتیبانی از هر دو مرحله اول و دوم init مورد نیاز است.
وقتی دستگاه وارد recovery میشود، محتویات رمدیسکهای recovery به شرح زیر است:
-
/init -> /system/bin/init(از ramdiskrecovery) -
/system/bin/init(ازrecoveryramdisk، ساخته شده ازinit_second_stage.recovery، و اجرا شده از/init)
وقتی دستگاه در اندروید بوت میشود، محتویات vendor_boot + generic ramdisks به شرح زیر است:
-
/init(از ramdisk، ساخته شده ازinit_first_stage)
انتقال فایلهای fstab
هر فایل fstab که در ramdisk عمومی نصب شده بود را به vendor_ramdisk و recovery ramdisk منتقل کنید. برای مثال، به این تغییر مراجعه کنید.
ماژولها را نصب کنید
شما میتوانید ماژولهای مخصوص دستگاه را در vendor_ramdisk و recovery ramdisk نصب کنید (اگر هیچ ماژول مخصوص دستگاهی برای نصب ندارید، از این مرحله صرف نظر کنید). init به ریشه تغییر نمیکند. نوع vendor_ramdisk ماژولها در ریشه vendor_ramdisk نصب میشود. نوع recovery ماژولها در ریشه recovery ramdisk نصب میشود. برای مثال در مورد نصب ماژولها در vendor_ramdisk و recovery ramdisk، به کنسول مرحله اول و بررسیهای متاداده مراجعه کنید.
کنسول مرحله اول
برای نصب نوع vendor_ramdisk از ماژولها، از موارد زیر استفاده کنید:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
این تضمین میکند که linker ، sh و toybox در مسیر $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin نصب میشوند، که سپس در مسیر /system/bin زیر مسیر vendor_ramdisk نصب میشود.
برای افزودن ماژولهای مورد نیاز برای کنسول مرحله اول (برای مثال، adbd)، نوع vendor_ramdisk این ماژولها را با آپلود وصلههای مربوطه در AOSP فعال کنید، سپس از دستور زیر استفاده کنید:
PRODUCT_PACKAGES += adbd.vendor_ramdisk
این تضمین میکند که ماژولهای مشخص شده در مسیر $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin نصب شوند.
برای نصب نوع recovery ماژولها، vendor_ramdisk با recovery جایگزین کنید:
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
چکسامهای متادیتا
برای پشتیبانی از بررسیهای متادیتا در طول نصب مرحله اول، دستگاههایی که از GKI پشتیبانی نمیکنند، نوع ramdisk از ماژولهای زیر را نصب میکنند. برای افزودن پشتیبانی از GKI، ماژولها را به $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin منتقل کنید:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
برای پشتیبانی از بررسیهای متادیتا در طول مرحله اول نصب در بازیابی، نوع بازیابی این ماژولها را فعال کرده و آنها را نیز نصب کنید.
تغییرات در فرآیند بوت
هنگام بوت شدن به اندروید، فرآیند بوت تغییر نمیکند. vendor_boot + generic ramdisk مشابه فرآیند بوت موجود است، با این تفاوت که fstab از vendor_boot بارگذاری میشود. از آنجا که system/bin/recovery وجود ندارد، first_stage_init آن را به عنوان یک بوت معمولی مدیریت میکند.
هنگام بوت شدن در حالت ریکاوری، فرآیند بوت تغییر نمیکند. رمدیسک ریکاوری به همان روشی که فرآیند ریکاوری موجود است، بارگذاری میشود. هسته از فایل ایمیج recovery بارگذاری میشود. فرآیند بوت برای حالت ریکاوری به شرح زیر است.
بوت لودر شروع به کار میکند، سپس کارهای زیر را انجام میدهد:
- ramdisk بازیابی را به
/منتقل میکند. - هسته را از پارتیشن
recoveryاجرا میکند.
- ramdisk بازیابی را به
کرنل ramdisk را روی
/سوار میکند و سپس/initرا اجرا میکند که یک پیوند نمادین به/system/bin/initاز ramdiskrecoveryاست.مرحله اول init شروع میشود، سپس موارد زیر را انجام میدهد:
-
IsRecoveryMode() == trueوForceNormalBoot() == falseقرار میدهد. - ماژولهای هسته فروشنده را از
/lib/modulesبارگذاری میکند. - تابع
DoFirstStageMount()فراخوانی میکند اما از نصب صرف نظر میکند زیراIsRecoveryMode() == true. (دستگاه ramdisk را آزاد نمیکند (زیرا/هنوز یکسان است) اما تابعSetInitAvbVersionInRecovery()فراخوانی میکند.) - مرحله دوم init را از
/system/bin/initاز ramdiskrecoveryشروع میکند.
-
مهرهای زمانی تصویر بوت
کد زیر نمونهای از فایل مهر زمانی تصویر boot است:
####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
در زمان ساخت، یک فایل
system/etc/ramdisk/build.propبه ramdisk عمومی اضافه میشود. این فایل حاوی اطلاعات مربوط به زمان ساخت است.در زمان اجرا،
initمرحله اول قبل از آزاد کردن ramdisk، فایلها را از ramdisk بهtmpfsکپی میکند تاinitمرحله دوم بتواند این فایل را بخواند تا ویژگیهای برچسب زمانی تصویرbootرا تنظیم کند.