في Android 12 ، تحتوي صورة boot
العامة ، المشار إليها باسم Generic Kernel Image (GKI) ، على ramdisk العام ونواة GKI.
بالنسبة للأجهزة التي تعمل بنظام Android 13 ، تتم إزالة ramdisk العام من صورة boot
ووضعه في صورة init_boot
منفصلة. يترك هذا التغيير صورة boot
مع نواة GKI فقط.
لترقية الأجهزة التي تستمر في استخدام Android 12 أو إصدارات kernel الأقدم ، يظل ramdisk العام في مكانه دون الحاجة إلى صورة init_boot
جديدة.
لإنشاء ramdisk عام ، قم بنقل الموارد الخاصة بالمورد خارج ذاكرة الوصول العشوائي بحيث تحتوي ذاكرة الوصول العشوائية العامة على init
الأولى فقط وملف الخاصية الذي يحتوي على معلومات الطابع الزمني.
على الأجهزة التي:
لا تستخدم قسمًا مخصصًا
recovery
، فكل بتات الاسترداد تنتقل من ذاكرة الوصول العشوائية العامة إلىvendor_boot
ramdisk.استخدم قسمًا مخصصًا
recovery
، ولا يلزم إجراء أي تغيير في ذاكرة الوصول العشوائيrecovery
لأن ذاكرة الوصول العشوائيrecovery
قائمة بذاتها.
هندسة عامة
توضح المخططات التالية بنية الأجهزة التي تعمل بنظام Android 12 وما فوق. يحتوي الجهاز الذي يعمل بنظام Android 13 على صورة init_boot
جديدة تحتوي على ramdisk العام. تستخدم الأجهزة التي تتم ترقيتها من Android 12 إلى Android 13 نفس البنية كما فعلت مع Android 12.
ابدأ باستخدام Android 13 ، بدون استرداد مخصص
الشكل 1. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 13 ، مع GKI ، بدون استرداد مخصص
ابدأ باستخدام Android 13 ، استرداد مخصص و A / B (ramdisk مخصص)
الشكل 2. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 13 ، مع GKI ، مخصصة واستعادة A / B
الرجوع إلى هذا الرقم إذا كان الجهاز يحتوي على أقسام recovery_a
و recovery_b
.
ابدأ باستخدام Android 13 ، استرداد مخصص وغير A / B (ramdisk مخصص)
الشكل 3. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 13 ، مع GKI ، استرداد مخصص وغير A / B
راجع هذا الرقم إذا كان الجهاز يحتوي على قسم يسمى recovery
بدون لاحقة فتحة.
قم بتشغيل أو الترقية إلى Android 12 ، بدون استرداد مخصص
الشكل 4. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 12 ، مع GKI ، بدون استرداد مخصص
إطلاق أو الترقية إلى Android 12 ، استرداد مخصص و A / B (ramdisk مخصص)
الشكل 5. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 12 ، مع GKI ، مخصصة واستعادة A / B
الرجوع إلى هذا الرقم إذا كان الجهاز يحتوي على أقسام recovery_a
و recovery_b
.
إطلاق أو الترقية إلى Android 12 ، استرداد مخصص وغير A / B (ramdisk مخصص)
الشكل 6. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 12 ، مع GKI ، استرداد مخصص وغير A / B
راجع هذا الرقم إذا كان الجهاز يحتوي على قسم يسمى recovery
بدون لاحقة فتحة.
الترقية إلى Android 12 ، Recovery-as-boot (recovery-as-ramdisk)
الشكل 7. ترقية الأجهزة إلى Android 12 ، بدون GKI ، الاسترداد كإقلاع
الترقية إلى Android 12 ، استرداد مخصص (ramdisk مخصص)
الشكل 8. ترقية الأجهزة إلى Android 12 ، بدون GKI ، استرداد مخصص
محتويات صور التمهيد
تحتوي صور تمهيد Android على ما يلي.
تم إضافة صورة
init_boot
للأجهزة التي تعمل بنظام Android 13- إصدار الرأس V4.0
- صورة رامديسك عامة
صورة
boot
العامة- إصدار الرأس V3 أو V4
-
boot_signature
للحصول على شهادة GKI boot.img (الإصدار 4 فقط). لم يتم توقيعboot.img
المعتمد من GKI للتمهيد الذي تم التحقق منه. لا يزال يتعين على مصنعي المعدات الأصلية التوقيع علىboot.img
prebuilt باستخدام مفتاح AVB الخاص بالجهاز. -
cmdline
(GENERIC_KERNEL_CMDLINE
) - نواة GKI
-
- صورة رامديسك عامة
- يتم تضمينه فقط في صور
boot
من Android 12 والإصدارات الأقدم
- يتم تضمينه فقط في صور
- إصدار الرأس V3 أو V4
vendor_boot
image (للحصول على التفاصيل ، راجع أقسام تمهيد البائع )-
vendor_boot
-
cmdline
الخاص بالجهاز (BOARD_KERNEL_CMDLINE
)
-
-
vendor_boot
ramdisk image-
lib/modules
- موارد الاسترداد (إذا لم يكن هناك استرداد مخصص)
-
- صورة
dtb
-
صورة
recovery
- إصدار الرأس V2.0
-
cmdline
الخاص بالجهاز للاسترداد ، إذا لزم الأمر - بالنسبة لقسم الاسترداد غير A / B ، يجب أن تكون محتويات الرأس قائمة بذاتها ؛ انظر صور الاسترداد . فمثلا:
- لم يتم تسلسل
cmdline
boot
وvendor_boot
cmdline
. - يحدد Header الاسترداد DTBO ، إذا لزم الأمر.
- بالنسبة لقسم استرداد A / B ، قد تكون المحتويات متسلسلة أو يُستدل عليها من
boot
وvendor_boot
. فمثلا: -
cmdline
boot
وvendor_boot
cmdline
. - يمكن الاستدلال على
vendor_boot
من العنوان vendor_boot.
-
-
recovery
الصورة رامديسك- موارد الاسترداد
- بالنسبة لقسم الاسترداد غير A / B ، يجب أن تكون محتويات ramdisk قائمة بذاتها ؛ انظر صور الاسترداد . فمثلا:
- يجب أن تحتوي
lib/modules
على جميع وحدات kernel النمطية المطلوبة لتشغيل وضع الاسترداد - يجب أن يحتوي قرص الاسترداد على
init
. - بالنسبة لقسم الاسترداد A / B ، يتم تقديم ذاكرة الوصول العشوائية للاسترداد إلى ramdisk العام و
vendor_boot
، وبالتالي لا تحتاج إلى أن تكون قائمة بذاتها. فمثلا: -
lib/modules
قد تحتوي فقط على وحدات kernel إضافية مطلوبة لتشغيل وضع الاسترداد بالإضافة إلى وحدات kernel فيvendor_boot
ramdisk. - قد يكون الارتباط الرمزي في
/init
موجودًا ، ولكن طغى عليه ثنائي المرحلة الأولى/init
الثنائي في صورة التمهيد.
- إصدار الرأس V2.0
محتويات صورة 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
. يتحكم هذا المتغير فيما إذا كانت موارد استرداد ذاكرة الوصول العشوائي مبنية على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 العام إلىinit_boot.img
بدلاً منboot.img
ويتطلب تعيين متغيراتBOARD_AVB_INIT_BOOT*
لـ vbmeta المتسلسل
المجموعات المسموح بها
مكون أو متغير | ترقية الجهاز بدون قسم recovery | ترقية الجهاز بقسم recovery | قم بتشغيل الجهاز بدون قسم recovery | قم بتشغيل الجهاز مع قسم recovery A / B | قم بتشغيل الجهاز مع قسم recovery غير A / B | aosp_arm64 |
---|---|---|---|---|---|---|
يحتوي على boot | نعم | نعم | نعم | نعم | نعم | نعم |
يحتوي على init_boot (Android 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
على سبيل المثال ، راجع هذا التغيير .
النظام كجذر
النظام كجذر غير مدعوم للأجهزة التي تستخدم GKI. في مثل هذه الأجهزة ، يجب أن يكون BOARD_BUILD_SYSTEM_ROOT_IMAGE
فارغًا. النظام كجذر أيضًا غير مدعوم للأجهزة التي تستخدم الأقسام الديناميكية.
تكوينات المنتج
يجب أن تقوم الأجهزة التي تستخدم ramdisk العام بتثبيت قائمة بالملفات المسموح بتثبيتها على ramdisk. للقيام بذلك ، حدد ما يلي في device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
يمنع ملف generic_ramdisk.mk
أيضًا ملفات makefiles الأخرى من تثبيت ملفات أخرى بطريق الخطأ على ramdisk (انقل هذه الملفات إلى vendor_ramdisk
بدلاً من ذلك).
إعداد الأجهزة
تختلف تعليمات الإعداد بين الأجهزة التي يتم تشغيلها بنظام Android 13 ، والترقية إلى Android 12 ، والتشغيل باستخدام Android 12. أما Android 13 ، فهي إعدادات مشابهة للطريقة التي كانت بها مع Android 12.
ترقية الأجهزة إلى Android 12:
يمكن الحفاظ على قيمة
BOARD_USES_RECOVERY_AS_BOOT
. إذا فعلوا ذلك ، فإنهم يستخدمون التكوينات القديمة ويجب أن تكون متغيرات البناء الجديدة فارغة. إذا كانت هذه الأجهزة:يمكن ضبط
BOARD_USES_RECOVERY_AS_BOOT
على فارغ. إذا فعلوا ذلك ، فإنهم يستخدمون تكوينات جديدة. إذا كانت هذه الأجهزة:لا تستخدم قسمًا مخصصًا
recovery
، فالهيكل كما هو موضح في الشكل 1 وخيار إعداد الجهاز هو الخيار 1 .استخدم قسم
recovery
مخصصًا ، تكون البنية كما هو موضح في الشكل 2 أ أو الشكل 2 ب وخيار إعداد الجهاز هو الخيار 2 أ أو الخيار 2 ب .
يجب أن تقوم الأجهزة التي تعمل بنظام Android 12 بتعيين
BOARD_USES_RECOVERY_AS_BOOT
على إفراغ واستخدام التكوينات الجديدة. إذا كانت هذه الأجهزة:لا تستخدم قسمًا مخصصًا
recovery
، فالهيكل كما هو موضح في الشكل 1 وخيار إعداد الجهاز هو الخيار 1 .استخدم قسم
recovery
مخصصًا ، تكون البنية كما هو موضح في الشكل 2 أ أو الشكل 2 ب وخيار إعداد الجهاز هو الخيار 2 أ أو الخيار 2 ب .
نظرًا لأن aosp_arm64
يبني GKI فقط (وليس vendor_boot
أو الاسترداد) ، فهو ليس هدفًا كاملاً. للحصول على تكوينات بناء aosp_arm64
، راجع generic_arm64
.
الخيار 1: لا يوجد قسم استرداد مخصص
تحتوي الأجهزة التي لا تحتوي على قسم recovery
على صورة boot
العامة في قسم boot
. يحتوي vendor_boot
ramdisk على جميع موارد الاسترداد ، بما في ذلك lib/modules
(مع وحدات نواة البائع). في مثل هذه الأجهزة ، يرث تكوين المنتج من generic_ramdisk.mk
.
تحديد قيم اللوحة
قم بتعيين القيم التالية:
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
الثنائيات الأولية والروابط الرمزية
يمكن أن يحتوي vendor_boot
على رابط رمزي /init
إلى /system/bin/init
، و init_second_stage.recovery
في /system/bin/init
. ومع ذلك ، نظرًا لتسلسل ramdisk العام بعد vendor_boot
، يتم الكتابة فوق الارتباط الرمزي /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
(تجاوز هذه الخطوة إذا لم يكن لديك أي وحدات خاصة بالجهاز لتثبيتها).
استخدم متغير
vendor_ramdisk
للوحدة النمطية عند تثبيت الوحدة على/first_stage_ramdisk
. يجب أن تكون هذه الوحدة متاحة بعد تحويلinit
إلى root إلى/first_stage_ramdisk
ولكن قبل تحويلinit
إلى root إلى/system
. للحصول على أمثلة ، راجع المجاميع الاختبارية للبيانات الوصفية وضغط أ / ب الظاهري .استخدم متغير
recovery
للوحدة النمطية عند تثبيت الوحدة على/
. يجب أن تكون هذه الوحدة متاحة قبل بدء تحويل الجذر إلى/first_stage_ramdisk
init
للحصول على تفاصيل حول تثبيت الوحدات على/
، راجع وحدة تحكم المرحلة الأولى .
وحدة تحكم المرحلة الأولى
نظرًا لأن وحدة التحكم في المرحلة الأولى تبدأ قبل أن تقوم 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
.
التغييرات في عملية التمهيد
لا تتغير عملية التمهيد في نظام الاسترداد أو Android ، مع الاستثناء التالي:
- ينتقل Ramdisk
build.prop
إلى/second_stage_resources
init
بحيث يمكن لمبادرة المرحلة الثانية قراءة الطابع الزمني لبناء التمهيد.
نظرًا لأن الموارد تنتقل من ramdisk العام إلى vendor_boot
ramdisk ، فإن نتيجة ربط 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
بتحويل الجذر إلى /first_stage_ramdisk
ثم تنفيذ /system/bin/e2fsck
.
الخيار 2 أ: قسم مخصص واسترداد أ / ب
استخدم هذا الخيار للأجهزة التي تحتوي على أقسام recovery
A / B ؛ أي أن الجهاز يحتوي على recovery_b partition
recovery_a
recovery_b. تتضمن هذه الأجهزة أجهزة A / B و Virtual A / B التي يكون قسم الاسترداد فيها قابلاً للتحديث ، مع التكوين التالي:
AB_OTA_PARTITIONS += recovery
يحتوي vendor_boot
ramdisk على وحدات بت البائع من ramdisk ووحدات نواة البائع ، بما في ذلك ما يلي:
ملفات
fstab
الخاصة بالجهازlib/modules
(تشمل وحدات نواة البائع)
يحتوي قرص recovery
على جميع موارد الاسترداد. في مثل هذه الأجهزة ، يرث تكوين المنتج من generic_ramdisk.mk
.
تحديد قيم اللوحة
قم بتعيين القيم التالية للأجهزة التي تحتوي على قسم 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
. ومع ذلك ، نظرًا لتسلسل قرص ramdisk التمهيد بعد قرص recovery
، يتم الكتابة فوق الارتباط الرمزي /init
. عند تشغيل الجهاز في وضع الاسترداد ، يلزم وجود ثنائي /system/bin/init
لدعم المرحلة الثانية.
عندما يبدأ الجهاز في recovery
، تكون محتويات recovery
+ vendor_boot
+ ramdisks كما يلي:
-
/init
(من ramdisk ، مبني منinit_first_stage
) -
/system/bin/init
(من ذاكرة الوصول العشوائيrecovery
، تم إنشاؤها منinit_second_stage.recovery
، وتم تنفيذها من/init
)
عندما يتم تشغيل الجهاز في Android ، تكون محتويات vendor_boot
+ ramdisks العامة كما يلي:
-
/init
(من ramdisk عام ، مبني منinit_first_stage
)
نقل ملفات fstab
انقل أي ملفات fstab
تم تثبيتها إلى ramdisk العام إلى vendor_ramdisk
. على سبيل المثال ، راجع هذا التغيير .
تركيب الوحدات
إذا رغبت في ذلك ، يمكنك تثبيت الوحدات النمطية الخاصة بالجهاز على vendor_ramdisk
(تجاوز هذه الخطوة إذا لم يكن لديك أي وحدات خاصة بالجهاز لتثبيتها). Init
لا يبدل الجذر. يتم تثبيت متغير vendor_ramdisk
للوحدات النمطية على جذر vendor_ramdisk
. للحصول على أمثلة حول تثبيت الوحدات النمطية على vendor_ramdisk
، راجع وحدة التحكم في المرحلة الأولى والمجاميع الاختبارية لبيانات التعريف وضغط Virtual 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 الظاهري
لدعم ضغط Virtual A / B ، يجب تثبيت snapuserd
على vendor_ramdisk
. يجب أن يرث الجهاز من virtual_ab_ota/compression.mk
، والذي يقوم بتثبيت متغير vendor_ramdisk
من snapuserd
.
التغييرات في عملية التمهيد
عند التشغيل في Android ، لا تتغير عملية التمهيد. vendor_boot
+ ramdisk العام عملية التمهيد الحالية ، باستثناء تحميل fstab
من vendor_boot
. نظرًا لعدم وجود system/bin/recovery
، first_stage_init
يتعامل معها كتمهيد عادي.
عند التشغيل في وضع الاسترداد ، تتغير عملية التمهيد. يشبه الاسترداد + vendor_boot
+ ramdisk العام عملية الاسترداد الحالية ، ولكن يتم تحميل النواة من صورة boot
بدلاً من صورة recovery
. تكون عملية التمهيد لوضع الاسترداد كما يلي.
يبدأ Bootloader ، ثم يقوم بما يلي:
- يدفع الاسترداد +
vendor_boot
+ ramdisk العام إلى/
. (إذا قام OEM بتكرار وحدات kernel النمطية في ذاكرة الوصول العشوائي للاسترداد عن طريق إضافتها إلىBOARD_RECOVERY_KERNEL_MODULES
) ،vendor_boot
يكون اختياريًا.) - يقوم بتشغيل النواة من قسم
boot
.
- يدفع الاسترداد +
يقوم Kernel بتحميل ramdisk إلى
/
ثم تنفيذ/init
من ramdisk العام.تبدأ المرحلة الأولى ، ثم تقوم بما يلي:
-
IsRecoveryMode() == true
وForceNormalBoot() == false
. - تحميل وحدات kernel الخاصة بالمورد من
/lib/modules
. - يستدعي
DoFirstStageMount()
ولكنه يتخطى التركيب لأنIsRecoveryMode() == true
. (لا يحرر الجهاز ramdisk (لأن/
لا يزال هو نفسه) ولكنه يستدعيSetInitAvbVersionInRecovery()
.) - تبدأ المرحلة الثانية من "
/system/bin/init
من ذاكرة الوصول العشوائيrecovery
.
-
إتاحة 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
.
الخيار 2 ب: قسم الاسترداد المخصص وغير A / B
استخدم هذا الخيار للأجهزة التي تحتوي على قسم recovery
غير A / B ؛ أي أن الجهاز يحتوي على قسم يسمى recovery
بدون لاحقة الفتحة. تشمل هذه الأجهزة:
- الأجهزة غير A / B ؛
- أجهزة A / B و Virtual A / B ، والتي لا يمكن تحديث قسم الاسترداد منها. (هذا أمر غير معتاد).
يحتوي vendor_boot
ramdisk على وحدات بت البائع من ramdisk ووحدات نواة البائع ، بما في ذلك ما يلي:
- ملفات
fstab
الخاصة بالجهاز -
lib/modules
(تشمل وحدات نواة البائع)
يجب أن تكون صورة recovery
قائمة بذاتها. يجب أن يحتوي على جميع الموارد المطلوبة لتشغيل وضع الاسترداد ، بما في ذلك:
- صورة النواة
- صورة DTBO
- وحدات Kernel في
lib/modules
- بدء المرحلة الأولى كرابط رمزي
/init -> /system/bin/init
- ثنائي المرحلة الثانية
/system/bin/init
- ملفات
fstab
الخاصة بالجهاز - جميع موارد الاسترداد الأخرى ، بما في ذلك ملف
recovery
الثنائي ، إلخ. - إلخ.
في مثل هذه الأجهزة ، يرث تكوين المنتج من generic_ramdisk.mk
.
تحديد قيم اللوحة
قم بتعيين القيم التالية للأجهزة غير 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
لدعم كل من المرحلة الأولى والمرحلة الثانية.
عندما يبدأ الجهاز في recovery
، تكون محتويات ذاكرة الوصول العشوائي recovery
كما يلي:
-
/init -> /system/bin/init
recovery
من ذاكرة الوصول العشوائي) -
/system/bin/init
(من ذاكرة الوصول العشوائيrecovery
، تم إنشاؤها منinit_second_stage.recovery
، وتم تنفيذها من/init
)
عندما يتم تشغيل الجهاز في Android ، تكون محتويات vendor_boot
+ ramdisks العامة كما يلي:
-
/init
(من ramdisk ، مبني منinit_first_stage
)
نقل ملفات fstab
انقل أي ملفات fstab
تم تثبيتها إلى ramdisk العام إلى vendor_ramdisk
recovery
. على سبيل المثال ، راجع هذا التغيير .
تركيب الوحدات
إذا رغبت في ذلك ، يمكنك تثبيت وحدات خاصة بالجهاز على vendor_ramdisk
recovery
(تجاوز هذه الخطوة إذا لم يكن لديك أي وحدات خاصة بالجهاز لتثبيتها). init
لا يبدل الجذر. يتم تثبيت متغير vendor_ramdisk
للوحدات النمطية على جذر vendor_ramdisk
. يتم تثبيت متغير recovery
للوحدات النمطية على جذر قرص recovery
. للحصول على أمثلة حول تثبيت الوحدات النمطية على vendor_ramdisk
و ramdisk recovery
، حد ذاته وحدة تحكم المرحلة الأولى والمجاميع الاختبارية للبيانات الوصفية .
وحدة تحكم المرحلة الأولى
لتثبيت متغير 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 \
لدعم المجاميع الاختبارية لبيانات التعريف أثناء تثبيت المرحلة الأولى في الاسترداد ، قم بتمكين متغير الاسترداد لهذه الوحدات وتثبيتها أيضًا.
التغييرات في عملية التمهيد
عند التشغيل في Android ، لا تتغير عملية التمهيد. vendor_boot
+ ramdisk العام عملية التمهيد الحالية ، باستثناء تحميل fstab
من vendor_boot
. نظرًا لعدم وجود system/bin/recovery
، first_stage_init
يتعامل معها كتمهيد عادي.
عند التشغيل في وضع الاسترداد ، لا تتغير عملية التمهيد. يتم تحميل ذاكرة الوصول العشوائي للاسترداد بنفس طريقة عملية الاسترداد الحالية. يتم تحميل النواة من صورة recovery
. تكون عملية التمهيد لوضع الاسترداد كما يلي.
يبدأ Bootloader ، ثم يقوم بما يلي:
- يدفع استرداد ramdisk إلى
/
. - يقوم بتشغيل النواة من قسم
recovery
.
- يدفع استرداد ramdisk إلى
يقوم Kernel بتحميل ramdisk إلى
/
ثم تنفيذ/init
، وهو ارتباط رمزي بـ/system/bin/init
من ذاكرة الوصول العشوائيةrecovery
.تبدأ المرحلة الأولى ، ثم تقوم بما يلي:
-
IsRecoveryMode() == true
وForceNormalBoot() == false
. - تحميل وحدات kernel الخاصة بالمورد من
/lib/modules
. - يستدعي
DoFirstStageMount()
ولكنه يتخطى التركيب لأنIsRecoveryMode() == true
. (لا يحرر الجهاز ramdisk (لأن/
لا يزال هو نفسه) ولكنه يستدعيSetInitAvbVersionInRecovery()
.) - تبدأ المرحلة الثانية من "
/system/bin/init
من ذاكرة الوصول العشوائيrecovery
.
-
الطوابع الزمنية لصورة التمهيد
الكود التالي هو مثال لملف طابع زمني لصورة 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 إلىtmpfs
قبل تحرير ذاكرة الوصول العشوائي بحيث يمكن لـinit
الثانية قراءة هذا الملف لتعيين خصائص الطابع الزمني لصورةboot
.