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

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

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

شکل 3. دستگاه هایی که به اندروید 13 راه اندازی یا ارتقا می یابند، با GKI، بازیابی اختصاصی و غیر A/B.
اگر دستگاه دارای پارتیشنی به نام recovery بدون پسوند اسلات است به این شکل مراجعه کنید.
راه اندازی یا ارتقا به اندروید 12، بدون بازیابی اختصاصی

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

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

شکل 6. دستگاه هایی که به اندروید 12 راه اندازی یا ارتقا می یابند، با GKI، بازیابی اختصاصی و غیر A/B.
اگر دستگاه دارای پارتیشنی به نام recovery بدون پسوند اسلات است به این شکل مراجعه کنید.
ارتقا به اندروید 12، بازیابی به عنوان بوت (بازیابی به عنوان ramdisk)

شکل 7. دستگاههایی که به اندروید 12 ارتقا مییابند، بدون GKI، بازیابی بهعنوان بوت.
ارتقا به اندروید 12، ریکاوری اختصاصی (رمدیسک اختصاصی)

شکل 8. دستگاه هایی که به اندروید 12 ارتقا می یابند، بدون GKI، بازیابی اختصاصی.
محتویات تصاویر را بوت کنید
تصاویر بوت اندروید شامل موارد زیر است.
تصویر
init_bootبرای دستگاه هایی که با Android 13 راه اندازی می شوند اضافه شد- نسخه هدر V4
- تصویر ramdisk عمومی
تصویر
bootعمومی- نسخه هدر V3 یا V4
- یک
boot_signatureبرای گواهی GKI boot.img (فقط نسخه 4). گواهی GKIboot.imgبرای بوت تایید شده امضا نشده است. OEM ها همچنان بایدboot.imgاز پیش ساخته شده را با یک کلید AVB مخصوص دستگاه امضا کنند. -
cmdlineعمومی (GENERIC_KERNEL_CMDLINE) - هسته GKI
- یک
- تصویر ramdisk عمومی
- فقط در تصاویر
bootاز اندروید 12 و نسخه های قبلی گنجانده شده است
- فقط در تصاویر
- نسخه هدر V3 یا V4
تصویر
vendor_boot(برای جزئیات، به پارتیشنهای بوت فروشنده مراجعه کنید)- هدر
vendor_boot-
cmdlineویژه دستگاه (BOARD_KERNEL_CMDLINE)
-
-
vendor_bootتصویر ramdisk-
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، ramdisk بازیابی به ramdisk generic و
vendor_bootاضافه شده است، بنابراین نیازی به مستقل بودن آن نیست. به عنوان مثال: -
lib/modulesممکن است علاوه بر ماژولهای هسته درvendor_bootramdisk فقط شامل ماژولهای هسته اضافی مورد نیاز برای راهاندازی حالت بازیابی باشد. - ممکن است پیوند نمادین در
/initوجود داشته باشد، اما توسط باینری/initمرحله اول در تصویر راهاندازی تحت الشعاع قرار میگیرد.
- نسخه هدر V2
محتویات تصویر ramdisk عمومی
ramdisk عمومی شامل اجزای زیر است.
-
init -
system/etc/ramdisk/build.prop -
ro. PRODUCT .bootimg.* buildلوازم - دایرکتوری های خالی برای نقاط اتصال:
debug_ramdisk/،mnt/،dev/،sys/،proc/،metadata/ -
first_stage_ramdisk/- دایرکتوری های خالی تکراری برای نقاط اتصال:
debug_ramdisk/,mnt/,dev/,sys/,proc/,metadata/
- دایرکتوری های خالی تکراری برای نقاط اتصال:
ادغام تصویر بوت
پرچمهای ساخت نحوه ساخت تصاویر init_boot ، boot ، recovery و vendor_boot را کنترل میکنند. مقدار متغیر برد بولی باید رشته 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دارای هسته است یا نه. دستگاههایی که با Android 12 راهاندازی میشوند و از پارتیشنrecoveryA/B استفاده میکنند باید این متغیر را رویtrueتنظیم کنند. دستگاههایی که با Android 12 راهاندازی میشوند و از غیر 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 (اندروید 13) | نه | نه | بله | بله | بله | بله |
حاوی 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 یا خالی تنظیم کنند. برای این دستگاهها، اگر 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 همچنین از نصب تصادفی فایلهای دیگر در ramdisk توسط سایر فایلهای make-فایل جلوگیری میکند (به جای آن چنین فایلهایی را به vendor_ramdisk منتقل کنید).
دستگاه ها را راه اندازی کنید
دستورالعملهای راهاندازی بین دستگاههایی که با Android 13 راهاندازی میشوند، بهروزرسانی به Android 12 و راهاندازی با Android 12 متفاوت است. Android 13، مانند آنچه در Android 12 بود، تنظیم شده است.
ارتقاء دستگاه ها به اندروید 12:
می تواند ارزش
BOARD_USES_RECOVERY_AS_BOOTرا حفظ کند. اگر این کار را انجام دهند، از پیکربندی های قدیمی استفاده می کنند و متغیرهای ساخت جدید باید خالی باشند. اگر چنین وسایلی:میتواند
BOARD_USES_RECOVERY_AS_BOOTرا روی خالی تنظیم کند. اگر این کار را انجام دهند، از تنظیمات جدید استفاده می کنند. اگر چنین وسایلی:
دستگاههایی که با Android 12 راهاندازی میشوند باید
BOARD_USES_RECOVERY_AS_BOOTبرای خالی کردن و استفاده از پیکربندیهای جدید تنظیم کنند. اگر چنین وسایلی:
از آنجا که aosp_arm64 فقط GKI (و نه vendor_boot یا بازیابی) را می سازد، یک هدف کامل نیست. برای تنظیمات ساخت aosp_arm64 ، به generic_arm64 مراجعه کنید.
گزینه 1: پارتیشن بازیابی اختصاصی وجود ندارد
دستگاههای بدون پارتیشن recovery حاوی تصویر boot عمومی در پارتیشن boot هستند. ramdisk vendor_boot شامل تمام منابع بازیابی، از جمله 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 بازنویسی می شود. هنگامی که دستگاه در مرحله بازیابی بوت می شود، باینری /system/bin/init برای پشتیبانی از مرحله دوم 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ماژول استفاده کنید. این ماژول باید بعد از اینکهinitروت را به/first_stage_ramdiskسوئیچ کند اما قبل از اینکهinitroot را به/systemتغییر دهد در دسترس باشد. برای مثال، جمعهای چک فراداده و فشردهسازی A/B مجازی را ببینید.هنگام نصب ماژول در
/از نوعrecoveryماژول استفاده کنید. این ماژول باید قبل از اینکهinitroot را به/first_stage_ramdiskسوئیچ کند در دسترس باشد. برای جزئیات بیشتر در مورد نصب ماژول ها در/به کنسول مرحله اول مراجعه کنید.
کنسول مرحله اول
از آنجا که کنسول مرحله اول قبل از اینکه init روت را به /first_stage_ramdisk سوئیچ کند شروع می شود، باید نوع recovery ماژول ها را نصب کنید. به طور پیشفرض، هر دو نوع ماژول برای build/make/target/product/base_vendor.mk نصب میشوند، بنابراین اگر فایل ساخت دستگاه از آن فایل به ارث میرسد، نیازی به نصب صریح نوع 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 را نصب میکند به ارث برده شود.
تغییرات در فرآیند بوت
روند بوت شدن در بازیابی یا اندروید تغییری نمی کند، به استثنای زیر:
- Ramdisk
build.propبه/second_stage_resourcesمنتقل میشود تاinitمرحله دوم بتواند مهر زمانی ساخت بوت را بخواند.
از آنجایی که منابع از ramdisk عمومی به ramdisk vendor_boot منتقل می شوند، نتیجه الحاق ramdisk عمومی به ramdisk vendor_boot تغییر نمی کند.
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 اجرا می کند.
گزینه 2a: پارتیشن بازیابی اختصاصی و A/B
از این گزینه برای دستگاه هایی با پارتیشن های recovery A/B استفاده کنید. یعنی دستگاه دارای یک recovery_b partition recovery_a و recovery_b است. چنین دستگاههایی شامل دستگاههای A/B و Virtual A/B هستند که پارتیشن بازیابی با پیکربندی زیر قابل بهروزرسانی است:
AB_OTA_PARTITIONS += recovery
ramdisk vendor_boot شامل بیتهای فروشنده ماژولهای 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
باینری ها و سیملینک ها را راه اندازی کنید
ramdisk recovery میتواند حاوی /init -> /system/bin/init و init_second_stage.recovery در /system/bin/init . با این حال، از آنجایی که ramdisk بوت پس از ramdisk recovery به هم پیوسته است، سیم پیوند /init بازنویسی می شود. هنگامی که دستگاه به حالت بازیابی راهاندازی میشود، باینری /system/bin/init برای پشتیبانی از init مرحله دوم مورد نیاز است.
هنگامی که دستگاه وارد recovery می شود، محتویات recovery + vendor_boot + ramdisks عمومی به شرح زیر است:
-
/init(از ramdisk، ساخته شده ازinit_first_stage) -
/system/bin/init(از ramdiskrecovery، ساخته شده ازinit_second_stage.recoveryو اجرا شده از/init)
هنگامی که دستگاه در اندروید بوت می شود، محتویات vendor_boot + 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 نصب شوند. اگر ramdisk vendor_boot در حالت بازیابی بارگیری شود، ماژول در recovery نیز موجود است. اگر ramdisk vendor_boot در حالت بازیابی بارگذاری نشود، دستگاه میتواند به صورت اختیاری 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 + ramdisk عمومی مشابه فرآیند بوت موجود است، با این تفاوت که fstab از vendor_boot بارگیری می شود. از آنجا که system/bin/recovery وجود ندارد، first_stage_init آن را به عنوان یک بوت معمولی مدیریت می کند.
هنگام بوت شدن به حالت بازیابی، فرآیند بوت تغییر می کند. بازیابی + vendor_boot + ramdisk عمومی مشابه فرآیند بازیابی موجود است، اما هسته به جای اینکه از تصویر recovery ، از تصویر boot بارگیری شود. فرآیند بوت برای حالت بازیابی به شرح زیر است.
بوت لودر شروع می شود، سپس کارهای زیر را انجام می دهد:
- بازیابی +
vendor_boot+ ramdisk عمومی را به/منتقل می کند. (اگر OEM با افزودن آنها بهBOARD_RECOVERY_KERNEL_MODULES، ماژولهای هسته را در ramdisk بازیابی کپی کند)،vendor_bootاختیاری است.) - هسته را از پارتیشن
bootاجرا می کند.
- بازیابی +
کرنل 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 /system/bin/e2fsck را اجرا می کند.
گزینه 2b: پارتیشن بازیابی اختصاصی و غیر A/B
از این گزینه برای دستگاه هایی با پارتیشن recovery غیر A/B استفاده کنید. یعنی دستگاه دارای یک پارتیشن به نام recovery بدون پسوند اسلات است. چنین دستگاه هایی عبارتند از:
- دستگاه های غیر A/B؛
- دستگاههای A/B و مجازی A/B که پارتیشن بازیابی آنها قابل بهروزرسانی نیست. (این غیرعادی است.)
ramdisk vendor_boot شامل بیتهای فروشنده ماژولهای ramdisk و vendor kernel، از جمله موارد زیر است:
- فایل های
fstabمخصوص دستگاه -
lib/modules(شامل ماژولهای هسته فروشنده)
تصویر recovery باید مستقل باشد. باید شامل تمام منابع مورد نیاز برای راه اندازی حالت بازیابی باشد، از جمله:
- تصویر هسته
- تصویر DTBO
- ماژول های هسته در
lib/modules - init مرحله اول به عنوان یک پیوند نمادین
/init -> /system/bin/init - مرحله دوم باینری
/system/bin/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
باینری ها و سیملینک ها را راه اندازی کنید
ramdisk recovery باید دارای یک /init -> /system/bin/init symlink و init_second_stage.recovery در /system/bin/init . هنگامی که دستگاه به حالت بازیابی راهاندازی میشود، باینری /system/bin/init برای پشتیبانی از مرحله اول و مرحله دوم مورد نیاز است.
هنگامی که دستگاه وارد recovery می شود، محتویات رام دیسک های recovery به شرح زیر است:
-
/init -> /system/bin/init(از ramdiskrecovery) -
/system/bin/init(از ramdiskrecovery، ساخته شده ازinit_second_stage.recoveryو اجرا شده از/init)
هنگامی که دستگاه در اندروید بوت می شود، محتویات vendor_boot + ramdisks عمومی به شرح زیر است:
-
/init(از ramdisk، ساخته شده ازinit_first_stage)
انتقال فایل های fstab
فایلهای fstab را که به ramdisk عمومی نصب شدهاند به vendor_ramdisk و ramdisk recovery منتقل کنید. برای مثال به این تغییر مراجعه کنید.
ماژول ها را نصب کنید
میتوانید ماژولهای مخصوص دستگاه را در vendor_ramdisk و ramdisk recovery نصب کنید (اگر ماژولهای مخصوص دستگاه برای نصب ندارید، از این مرحله رد شوید). init روت را عوض نمی کند. نوع vendor_ramdisk ماژول ها در ریشه vendor_ramdisk نصب می شود. نوع recovery ماژول ها در ریشه رم دیسک recovery نصب می شود. برای مثالهایی در مورد نصب ماژولها در 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 + ramdisk عمومی مشابه فرآیند بوت موجود است، با این تفاوت که fstab از vendor_boot بارگیری می شود. از آنجا که system/bin/recovery وجود ندارد، first_stage_init آن را به عنوان یک بوت معمولی مدیریت می کند.
هنگام بوت شدن به حالت بازیابی، فرآیند بوت تغییر نمی کند. ramdisk بازیابی به همان روشی که فرآیند بازیابی موجود بارگذاری می شود. هسته از تصویر 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 مرحله دومinitاین فایل را بخواند تا ویژگیهای برچسب زمانی تصویرbootرا تنظیم کند.