در اندروید 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_boot
ramdisk منتقل می شوند.از یک پارتیشن
recovery
اختصاصی استفاده کنید، هیچ تغییری در ramdiskrecovery
لازم نیست زیرا ramdiskrecovery
مستقل است.
معماری
نمودارهای زیر معماری دستگاه های دارای اندروید 12 و بالاتر را نشان می دهد. دستگاهی که با Android 13 راه اندازی می شود، یک تصویر init_boot
جدید حاوی ramdisk عمومی دارد. دستگاه هایی که از اندروید 12 به اندروید 13 ارتقا می یابند از همان معماری استفاده می کنند که در اندروید 12 استفاده می کردند.
راه اندازی با Android 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_boot
cmdline
متصل نیست. - هدر DTBO بازیابی را در صورت لزوم مشخص می کند.
- برای پارتیشن بازیابی A/B، محتویات را می توان از
boot
وvendor_boot
به هم پیوست یا استنباط کرد. به عنوان مثال: -
cmdline
بهboot
وvendor_boot
cmdline
متصل است. - DTBO را می توان از هدر
vendor_boot
استنباط کرد.
-
- تصویر رام دیسک
recovery
- منابع بازیابی
- برای پارتیشن بازیابی غیر A/B، محتویات ramdisk باید مستقل باشد. به تصاویر بازیابی مراجعه کنید. به عنوان مثال:
-
lib/modules
باید شامل تمام ماژول های هسته مورد نیاز برای بوت شدن حالت بازیابی باشد - ramdisk بازیابی باید حاوی
init
باشد. - برای پارتیشن بازیابی A/B، ramdisk بازیابی به ramdisk generic و
vendor_boot
اضافه شده است، بنابراین نیازی به مستقل بودن آن نیست. به عنوان مثال: -
lib/modules
ممکن است علاوه بر ماژولهای هسته درvendor_boot
ramdisk فقط شامل ماژولهای هسته اضافی مورد نیاز برای راهاندازی حالت بازیابی باشد. - ممکن است پیوند نمادین در
/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 راهاندازی میشوند و از پارتیشنrecovery
A/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
سوئیچ کند اما قبل از اینکهinit
root را به/system
تغییر دهد در دسترس باشد. برای مثال، جمعهای چک فراداده و فشردهسازی A/B مجازی را ببینید.هنگام نصب ماژول در
/
از نوعrecovery
ماژول استفاده کنید. این ماژول باید قبل از اینکهinit
root را به/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 و Virtual 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
مرحله دوم بتواند این فایل را بخواند تا ویژگیهای برچسب زمانی تصویرboot
را تنظیم کند.