في نظام التشغيل Android 12، تحتوي صورة boot العامة، والتي يُشار إليها باسم
Generic Kernel Image (GKI)،
على ملف ramdisk العام ونظام التشغيل GKI.
بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 13، تتم إزالة ملف ramdisk العام من صورة boot ووضعه في صورة init_boot
منفصلة. يؤدي هذا التغيير إلى ترك صورة boot مع ملف التمهيد
GKI فقط.
بالنسبة إلى ترقية الأجهزة التي تستمر في استخدام Android 12
أو إصدارات أقدم من نظام التشغيل، سيظل ملف ramdisk العام في مكانه بدون
حاجة إلى صورة init_boot جديدة.
لإنشاء ملف ramdisk عام، عليك نقل الموارد الخاصة بالمورّد خارج ملف ramdisk
كي لا يحتوي ملف ramdisk العام إلا على المرحلة الأولى init وملف
موقع يحتوي على معلومات الطابع الزمني.
على الأجهزة التي:
لا تستخدِم قسمًا مخصّصًا لـ
recovery، فسيتم نقل كل أجزاء الاسترداد من ملف ramdisk العام إلى ملف ramdisk لـvendor_boot.استخدِم قسمًا مخصّصًا لنظام التشغيل
recovery، ولا حاجة إلى إجراء أي تغيير في ملف ramdisk لنظام التشغيلrecoveryلأنّه مكتفٍ ذاتيًا.recovery
هندسة معمارية
توضِّح المخطّطات البيانية التالية البنية الأساسية للأجهزة التي تعمل بالإصدار
12 من نظام التشغيل Android والإصدارات الأحدث.
تحتوي الأجهزة التي تعمل بالإصدار 13 من نظام التشغيل Android على نسخة
init_boot جديدة تحتوي على ملف ramdisk العام.
تستخدم الأجهزة التي يتم ترقيتها من 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 (نظام التشغيل ramdisk المخصّص)
الشكل 3: الأجهزة التي تعمل بالإصدار 13 من نظام التشغيل Android أو التي تم ترقيتها إليه، والتي تتضمّن واجهة برمجة التطبيقات GKI وميزة الاسترداد المخصّصة وغير المستندة إلى ميزة A/B
راجِع هذا الشكل إذا كان الجهاز يحتوي على قسم باسم recovery بدون لاحقة
slot.
تشغيل الإصدار 12 من نظام التشغيل Android أو الترقية إليه بدون وضع استرداد مخصّص
الشكل 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 بدون لاحقة
slot.
الترقية إلى Android 12، واستخدام وضع الاسترداد كوضع التشغيل (recovery-as-ramdisk)
الشكل 7: الأجهزة التي يتم ترقيتها إلى Android 12، بدون GKI، ووضع الاسترداد كوضع تشغيل
الترقية إلى Android 12، وضع الاسترداد المخصّص (مساحة تخزين مؤقت مخصّصة)
الشكل 8: الأجهزة التي يتم ترقيتها إلى Android 12، بدون GKI، ووضع الاسترداد المخصّص
محتوى صور التشغيل
تحتوي صور التمهيد في Android على ما يلي:
صورة
init_bootتمت إضافتها للأجهزة التي تعمل بنظام التشغيل Android 13- إصدار العنوان V4
- صورة ذاكرة وصول عشوائي (RAM) عامة
صورة عامة (
boot)- إصدار العنوان V3 أو
V4
-
boot_signatureلشهادة boot.img الخاصة بـ GKI (الإصدار 4 فقط) ملف GKIboot.imgالمعتمَد غير موقَّع لميزة "التمهيد التحقق منه". على المصنّعين الأصليين للأجهزة توقيعboot.imgالمُنشئ مسبقًا باستخدام مفتاح AVB خاص بالجهاز. - عامة
cmdline(GENERIC_KERNEL_CMDLINE) - نواة GKI
-
- صورة ذاكرة وصول عشوائي (RAM) عامة
- لا تظهر هذه الميزة إلا في صور
bootمن Android 12 والإصدارات الأقدم.
- لا تظهر هذه الميزة إلا في صور
- إصدار العنوان V3 أو
V4
vendor_bootصورة (للحصول على التفاصيل، اطّلِع على أقسام بوت المورّد)vendor_bootالعنوانcmdlineخاص بالجهاز (BOARD_KERNEL_CMDLINE)
vendor_bootصورة ذاكرة وصول عشوائي (RAM)lib/modules- موارد الاسترداد (في حال عدم توفّر عملية استرداد مخصّصة)
- صورة واحدة (
dtb)
صورة واحدة (
recovery)- الإصدار 2 من العنوان
cmdlineخاص بالجهاز لاسترداد البيانات، إذا لزم الأمر- بالنسبة إلى قسم الاسترداد غير A/B، يجب أن تكون محتويات العنوان مستقلة. يُرجى الاطّلاع على صور الاسترداد. مثلاً:
- لا يتم تسلسل
cmdlineمعbootوvendor_bootcmdline. - يحدِّد العنوان DTBO للاسترداد، إذا لزم الأمر.
- بالنسبة إلى قسم استرداد A/B، يمكن تسلسل المحتوى أو الاستدلال عليه
من
bootوvendor_boot. مثلاً: - يتم تسلسل
cmdlineمعbootوvendor_bootcmdline. - يمكن استنتاج DTBO من عنوان
vendor_boot.
recoveryصورة ذاكرة وصول عشوائي (RAM)- مراجع حول الاسترداد
- بالنسبة إلى قسم الاسترداد غير المتوافق مع A/B، يجب أن تكون محتويات ملف ramdisk مستقلة، راجِع صور الاسترداد. مثلاً:
- يجب أن يحتوي
lib/modulesعلى جميع وحدات kernel المطلوبة لبدء التمهيد في وضع الاسترداد. - يجب أن يحتوي ملف ramdisk الخاص بعملية الاسترداد على
init. - بالنسبة إلى قسم الاسترداد A/B، يتمّ وضع ملف ramdisk الخاص بعملية الاسترداد في بداية ملفَي ramdisk الخاصَّين بالنظام العام و
vendor_boot، وبالتالي لا يلزم أن يكون ملف ramdisk الخاص بعملية الاسترداد مستقلاً. مثلاً: - قد لا يحتوي
lib/modulesإلا على وحدات إضافية للنواة مطلوبة لبدء تشغيل وضع الاسترداد، بالإضافة إلى وحدات النواة فيvendor_bootramdisk. - قد يكون الرابط الرمزي في
/initمتوفّرًا، ولكنّه يُخفَّض من شأنه مقارنةً بملف/initالثنائي في المرحلة الأولى من ملف التمهيد.
- الإصدار 2 من العنوان
محتوى صورة ذاكرة الوصول العشوائي (RAM) العام
يحتوي ملف ramdisk العام على المكوّنات التالية.
initsystem/etc/ramdisk/build.propro.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:يتم ضبطها، يتم إنشاء مفاتيح AVB في GSI لتعمل على
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb.لم يتم ضبطه، يتم إنشاء مفاتيح AVB في GSI لتعمل على
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb.
عندما يكون الحقل فارغًا، إذا كان
BOARD_RECOVERY_AS_ROOT:تم ضبطه، يتم إنشاء مفاتيح AVB في GSI لتعمل على
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb.لم يتم ضبطه، يتم إنشاء مفاتيح AVB في GSI لتعمل على
$ANDROID_PRODUCT_OUT/ramdisk/avb.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE: يتحكّم هذا المتغيّر في ما إذا كانت صورةrecoveryتحتوي على نواة أم لا. في الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android وتستخدم قسم A/Brecovery، يجب ضبط هذه المتغيّرة على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 المتسلسل.
التركيبات المسموح بها
| المكوّن أو المتغيّر | ترقية الجهاز بدون قسم الاسترداد | ترقية الجهاز باستخدام قسم الاسترداد | تشغيل الجهاز بدون قسم الاسترداد | تشغيل الجهاز باستخدام قسم الاسترداد A/B | تشغيل الجهاز باستخدام قسم الاسترداد غير 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 أيضًا ملفات 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(ب).
يجب ضبط قيمة
BOARD_USES_RECOVERY_AS_BOOTعلى "فارغ" واستخدام الإعدادات الجديدة على الأجهزة التي تعمل بنظام التشغيل Android 12. إذا كانت هذه الأجهزة:لا تستخدِم قسمًا مخصّصًا لـ
recovery، فالبنية كما هو موضّح في الشكل 1 وخيار إعداد الجهاز هو الخيار 1.استخدِم قسمًا مخصّصًا
recovery، وتكون البنية كما هو موضّح في الشكل 2(أ) أو الشكل 2(ب)، ويكون خيار إعداد الجهاز الخيار 2(أ) أو الخيار 2(ب).
وبما أنّ 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
ملفات bin وsymlinks لبدء التشغيل
يمكن أن يحتوي ملف ذاكرة الوصول العشوائي vendor_boot على رابط رمزي من /init إلى /system/bin/init،
وinit_second_stage.recovery في /system/bin/init. ومع ذلك، بما أنّه يتم تسلسل ملف التمهيد المؤقت
العام بعد ملف التمهيد المؤقت vendor_boot، يتم استبدال الرابط الرمزي/init. عند تشغيل الجهاز في وضع الاسترداد، يجب استخدام ملف ثنائي
/system/bin/init ليتيح بدء المرحلة الثانية. في ما يلي محتوى vendor_boot + وحدات التخزين المؤقت للذاكرة العشوائية العامة:
/init(من ملف ramdisk عام تم إنشاؤه منinit_first_stage)/system/bin/init(منvendor_ramdisk، تم إنشاؤه منinit_second_stage.recovery)
نقل ملفات fstab
انقل أي ملفات fstab تم تثبيتها على ذاكرة الوصول العشوائي (RAM) العامة إلى
vendor_ramdisk. على سبيل المثال، يمكنك الرجوع إلى هذا
التغيير.
تثبيت الوحدات
يمكنك تثبيت وحدات خاصة بالأجهزة على vendor_ramdisk (تخطّى
هذه الخطوة إذا لم يكن لديك أي وحدات خاصة بالأجهزة لتثبيتها).
استخدِم الصيغة
vendor_ramdiskللوحدة عند تثبيت الوحدة في/first_stage_ramdisk. من المفترض أن تكون هذه الوحدة متاحة بعد أن يبدّلinitالجذر إلى/first_stage_ramdiskولكن قبل أن يبدّلinitالجذر إلى/system. للاطّلاع على أمثلة، راجِع رموز تحقّق البيانات الوصفية والضغط الافتراضي لاختبار أ/ب.استخدِم الصيغة
recoveryللوحدة عند تثبيت الوحدة على/. يجب أن تكون هذه الوحدة متاحة قبل أن يبدّلinitالجذر إلى/first_stage_ramdisk. لمعرفة تفاصيل عن تثبيت الوحدات على/، يُرجى الاطّلاع على وحدة تحكّم مرحلة الأولى.
وحدة تحكّم المرحلة الأولى
بما أنّ وحدة تحكّم المرحلة الأولى تبدأ قبل أن يبدّل init الجذر إلى
/first_stage_ramdisk، عليك تثبيت الصيغة recovery من الوحدات.
يتم تلقائيًا تثبيت نوعَي الوحدة في ملف build/make/target/product/base_vendor.mk، لذا إذا كان ملف makefile للجهاز يرث
من هذا الملف، لن تحتاج إلى تثبيت نوع recovery صراحةً.
لتثبيت وحدات الاسترداد بشكل صريح، استخدِم ما يلي:
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
يضمن ذلك تثبيت linker وsh وtoybox على
$ANDROID_PRODUCT_OUT/recovery/root/system/bin، ثم تثبيته على
/system/bin ضمن vendor_ramdisk.
لإضافة الوحدات المطلوبة لوحدة تحكّم المرحلة الأولى (مثل adbd)، استخدِم الخطوات التالية:
PRODUCT_PACKAGES += adbd.recovery
يضمن ذلك تثبيت الوحدات المحدّدة في
$ANDROID_PRODUCT_OUT/recovery/root/system/bin، والتي يتم تثبيتها بعد ذلك في
/system/bin ضمن vendor_ramdisk.
المجاميع الاختبارية للبيانات الوصفية
لإتاحة التحقّق من صحة
البيانات الوصفية
أثناء مرحلة التثبيت الأولى، تُثبِّت الأجهزة التي لا تتوافق مع GKI إصدار ملف ramdisk
الخاص بالوحدات التالية. لإضافة إمكانية استخدام واجهة برمجة التطبيقات GKI، عليك نقل الوحدات إلى
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
على سبيل المثال، يمكنك الرجوع إلى هذه قائمة التغييرات.
ضغط A/B الافتراضي
لتفعيل ميزة ضغط A/B الافتراضي، يجب تثبيت snapuserd على
vendor_ramdisk. من المفترض أن يكتسب الجهاز الإعدادات من
virtual_ab_ota/compression.mk،
الذي يُثبِّت نوع vendor_ramdisk من snapuserd.
التغييرات في عملية التشغيل
لا تتغيّر عملية التمهيد إلى وضع الاسترداد أو إلى نظام التشغيل Android، مع الأخذ في الاعتبار الاستثناء التالي:
- يتم نقل ملف
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 الافتراضي
تثبيت ملفات make الخاصة بالمنتج
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck أثناء وقت التشغيل، تبدّل المرحلة الأولى init الجذر إلى /first_stage_ramdisk ثم تُنفِّذ/system/bin/e2fsck.
الخيار 2(أ): قسم مخصّص لاسترداد البيانات وقسم A/B
استخدِم هذا الخيار للأجهزة التي تتضمّن قسمَي A/B recovery، أي أنّه
يتضمّن الجهاز قسمَي recovery_a وrecovery_b partition. وتشمل هذه الأجهزة
أجهزة A/B وVirtual A/B التي يمكن تحديث قسم الاسترداد فيها، مع
الإعدادات التالية:
AB_OTA_PARTITIONS += recovery
يحتوي ملف vendor_boot ramdisk على أجزاء المصنّع لملف ramdisk ووحدات ملف kernel الخاصة بالمصنّع، بما في ذلك ما يلي:
ملفات
fstabالخاصة بالجهازlib/modules(تتضمّن وحدات نواة المورّد)
يحتوي ملف ramdisk على recovery على جميع موارد الاسترداد. على هذه الأجهزة، يتم اكتساب إعدادات
المنتج من
generic_ramdisk.mk.
ضبط قيم BOARD
اضبط القيم التالية للأجهزة التي تتضمّن قسم A/B recovery:
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
ملفات bin وsymlinks لبدء التشغيل
يمكن أن يحتوي ملف recovery ramdisk على رابط /init -> /system/bin/init تشعبي، وinit_second_stage.recovery عند /system/bin/init. ومع ذلك، بما أنّ ملف التمهيد
ramdisk يتم تسلسله بعد ملف ramdisk recovery، يتم
استبدال الرابط الرمزي /init. عند تشغيل الجهاز في وضع الاسترداد، يجب توفُّر /system/bin/init
الثنائي لدعم بدء المرحلة الثانية.
عند تشغيل الجهاز في recovery، تكون محتويات recovery +
vendor_boot + أقراص التخزين المؤقت العامة على النحو التالي:
/init(من قرص RAM، تم إنشاؤه منinit_first_stage)/system/bin/init(منrecoveryramdisk، تم إنشاؤه منinit_second_stage.recovery، وتم تنفيذه من/init)
عند تشغيل الجهاز على نظام التشغيل Android، تكون محتويات vendor_boot + ملف
ramdisks العام على النحو التالي:
/init(من ملف ramdisk عام تم إنشاؤه منinit_first_stage)
نقل ملفات fstab
انقل أي ملفات fstab تم تثبيتها على ذاكرة الوصول العشوائي (RAM) العامة إلى
vendor_ramdisk. على سبيل المثال، يمكنك الرجوع إلى هذا
التغيير.
تثبيت الوحدات
يمكنك اختياريًا تثبيت وحدات خاصة بالأجهزة على vendor_ramdisk (تخطّى
هذه الخطوة إذا لم يكن لديك أي وحدات خاصة بالأجهزة لتثبيتها). Init
لا يؤدي إلى تبديل الجذر. يتم تثبيت الإصدار vendor_ramdisk من الوحدات في ملف vendor_ramdisk. للحصول على أمثلة عن تثبيت الوحدات في
vendor_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. في حال تحميل 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 الافتراضي
لتفعيل ميزة "الضغط الافتراضي لاختبار أ/ب"، يجب تثبيت 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.
في ما يلي خطوات تشغيل وضع الاسترداد:
يبدأ مُحمِّل بدء التشغيل، ثم ينفِّذ ما يلي:
- تُرسِل عملية الاسترداد +
vendor_boot+ ذاكرة الوصول العشوائي العام إلى/. (إذا كان المصنّع الأصلي للجهاز يكرّر وحدات kernel في ذاكرة التخزين المؤقت لنظام الاسترداد عن طريق إضافتها إلىBOARD_RECOVERY_KERNEL_MODULES)، يكونvendor_bootاختياريًا). - تشغيل النواة من قسم
boot
- تُرسِل عملية الاسترداد +
يُثبِّت "النواة" ذاكرة الوصول العشوائي المؤقتة على
/ثم تنفِّذ/initمن ذاكرة الوصول العشوائي المؤقتة العامة.تبدأ مرحلة الإعداد الأولى، ثمّ تُجري ما يلي:
- يُستخدَم لضبط
IsRecoveryMode() == trueوForceNormalBoot() == false. - تحمِّل هذه الوحدة وحدات نواة المورِّد من
/lib/modules. - يتم استدعاء
DoFirstStageMount()ولكن يتم تخطّي عملية التثبيت بسببIsRecoveryMode() == true. (لا يُفرِّغ الجهاز ذاكرة التخزين المؤقت (لأنّ/لا يزال كما هو) ولكنه يستدعيSetInitAvbVersionInRecovery().) - بدء مرحلة الإعداد الثانية من
/system/bin/initمنrecoveryرام ديسك
- يُستخدَم لضبط
إتاحة e2fsck
يمكن أن ترث ملفات الإنشاء الخاصة بالأجهزة من:
virtual_ab_ota/launch_with_vendor_ramdisk.mkإذا كان الجهاز يتيح اختبار A/B الافتراضي ولكن لا يتيح ميزة الضغطvirtual_ab_ota/compression.mkإذا كان الجهاز يتيح ميزة ضغط A/B الافتراضي
تثبيت ملفات make الخاصة بالمنتج
$ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck في أثناء
التشغيل، تنفِّذ المرحلة الأولى init /system/bin/e2fsck.
الخيار 2(ب): قسم استرداد مخصّص وغير مخصّص لميزة A/B
استخدِم هذا الخيار للأجهزة التي تحتوي على قسم recovery غير A/B، أي أنّه
يحتوي الجهاز على قسم باسم recovery بدون إضافة خانة. وتشمل هذه الأجهزة
ما يلي:
- الأجهزة غير المزوّدة بميزة "التحديث التجريبي"
- أجهزة A/B وأجهزة A/B الافتراضية التي لا يمكن تعديل قسم الاسترداد فيها (هذا أمر غير معتاد).
يحتوي ملف vendor_boot ramdisk على أجزاء المصنّع لملف ramdisk ووحدات ملف
النواة الخاصة بالمصنّع، بما في ذلك ما يلي:
- ملفات
fstabالخاصة بالجهاز lib/modules(تتضمّن وحدات نواة المورّد)
يجب أن تكون صورة recovery مكتفية ذاتيًا. يجب أن يحتوي على
جميع الموارد المطلوبة لتشغيل وضع الاسترداد، بما في ذلك:
- صورة النواة
- صورة DTBO
- وحدات النواة في
lib/modules - بدء المرحلة الأولى كرابط رمزي
/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
ملفات bin وsymlinks لبدء التشغيل
يجب أن يحتوي ملف ذاكرة الوصول العشوائي recovery على رابط رمزي /init -> /system/bin/init وملف init_second_stage.recovery في /system/bin/init. عند تشغيل الجهاز في
وضع الاسترداد، يجب توفُّر الثنائي /system/bin/init لدعم كل من مرحلة التمهيد
الأولى والثانية.
عند تشغيل الجهاز في recovery، يتم نقل محتويات recovery ramdisks
على النحو التالي:
/init -> /system/bin/init(منrecoveryramdisk)/system/bin/init(منrecoveryramdisk، تم إنشاؤه منinit_second_stage.recovery، وتم تنفيذه من/init)
عند تشغيل الجهاز على نظام التشغيل Android، تكون محتويات vendor_boot + ملف
ramdisks العام على النحو التالي:
/init(من قرص RAM، تم إنشاؤه منinit_first_stage)
نقل ملفات fstab
انقل أي ملفات fstab تم تثبيتها على ذاكرة التخزين المؤقت النموذجية إلى ذاكرتَي التخزين المؤقت
vendor_ramdisk وrecovery. على سبيل المثال، يمكنك الرجوع إلى هذا
التغيير.
تثبيت الوحدات
يمكنك تثبيت الوحدات الخاصة بالجهاز على vendor_ramdisk و
recovery ramdisk (تخطّى
هذه الخطوة إذا لم يكن لديك أي وحدات خاصة بالجهاز لتثبيتها). init
لا يؤدي إلى تبديل الجذر. يتم تثبيت الإصدار vendor_ramdisk من الوحدات في ملف vendor_ramdisk. يتم تثبيت الصيغة recovery من الوحدات في
جذر ملف ramdisk في recovery. للحصول على أمثلة عن تثبيت الوحدات في ملف ذاكرة التخزين المؤقت للتشغيل
vendor_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
ramdisk بالطريقة نفسها المتّبعة في عملية الاسترداد الحالية.
يتم تحميل النواة من صورة recovery. في ما يلي خطوات التمهيد إلى وضع الاسترداد:
يبدأ مُحمِّل بدء التشغيل، ثم ينفِّذ ما يلي:
- تُرسِل وحدة تخزين عشوائي (RAM) لإعادة الاسترداد إلى
/. - تشغيل النواة من قسم
recovery
- تُرسِل وحدة تخزين عشوائي (RAM) لإعادة الاسترداد إلى
يُثبِّت نواة نظام التشغيل ملف ramdisk على
/ثم تنفِّذ/init، وهو رابط رمزي يؤدي إلى/system/bin/initمن ملف ramdiskrecovery.تبدأ مرحلة الإعداد الأولى، ثمّ تُجري ما يلي:
- يُستخدَم لضبط
IsRecoveryMode() == trueوForceNormalBoot() == false. - تحمِّل هذه الوحدة وحدات نواة المورِّد من
/lib/modules. - يتم استدعاء
DoFirstStageMount()ولكن يتم تخطّي عملية التثبيت بسببIsRecoveryMode() == true. (لا يُفرِّغ الجهاز ذاكرة التخزين المؤقت (لأنّ/لا يزال كما هو) ولكنه يستدعي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عمليات نسخ للملفات من ذاكرة التخزين المؤقت إلىtmpfsقبل تحرير ذاكرة التخزين المؤقت لكي تتمكّن الخطوة الثانيةinitمن قراءة هذا الملف لضبط سمات الطابع الزمني للصورةboot.