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