قسم التمهيد العام

في 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 ، بدون استرداد مخصص

تشغيل / ترقية الجهاز ، GKI ، لا يوجد استرداد مخصص

الشكل 1. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 13 ، مع GKI ، بدون استرداد مخصص

ابدأ باستخدام Android 13 ، استرداد مخصص و A / B (ramdisk مخصص)

تشغيل / ترقية الجهاز ، GKI ، مخصص واسترداد A / B

الشكل 2. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 13 ، مع GKI ، مخصصة واستعادة A / B

الرجوع إلى هذا الرقم إذا كان الجهاز يحتوي على أقسام recovery_a و recovery_b .

ابدأ باستخدام Android 13 ، استرداد مخصص وغير A / B (ramdisk مخصص)

تشغيل / ترقية الجهاز ، GKI ، استرداد مخصص وغير A / B

الشكل 3. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 13 ، مع GKI ، استرداد مخصص وغير A / B

راجع هذا الرقم إذا كان الجهاز يحتوي على قسم يسمى recovery بدون لاحقة فتحة.

قم بتشغيل أو الترقية إلى Android 12 ، بدون استرداد مخصص

تشغيل / ترقية الجهاز ، GKI ، لا يوجد استرداد مخصص

الشكل 4. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 12 ، مع GKI ، بدون استرداد مخصص

إطلاق أو الترقية إلى Android 12 ، استرداد مخصص و A / B (ramdisk مخصص)

تشغيل / ترقية الجهاز ، GKI ، مخصص واسترداد A / B

الشكل 5. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 12 ، مع GKI ، مخصصة واستعادة A / B

الرجوع إلى هذا الرقم إذا كان الجهاز يحتوي على أقسام recovery_a و recovery_b .

إطلاق أو الترقية إلى Android 12 ، استرداد مخصص وغير A / B (ramdisk مخصص)

تشغيل / ترقية الجهاز ، GKI ، استرداد مخصص وغير A / B

الشكل 6. الأجهزة التي يتم تشغيلها أو ترقيتها إلى Android 12 ، مع GKI ، استرداد مخصص وغير A / B

راجع هذا الرقم إذا كان الجهاز يحتوي على قسم يسمى recovery بدون لاحقة فتحة.

الترقية إلى Android 12 ، Recovery-as-boot (recovery-as-ramdisk)

تشغيل / ترقية الجهاز ، بدون GKI ، الاسترداد كإقلاع

الشكل 7. ترقية الأجهزة إلى Android 12 ، بدون GKI ، الاسترداد كإقلاع

الترقية إلى Android 12 ، استرداد مخصص (ramdisk مخصص)

تشغيل / ترقية الجهاز ، لا يوجد GKI ، استرداد مخصص

الشكل 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 والإصدارات الأقدم
  • 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 الثنائي في صورة التمهيد.

محتويات صورة 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 على 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 أو الاسترداد) ، فهو ليس هدفًا كاملاً. للحصول على تكوينات بناء 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 . تكون عملية التمهيد لوضع الاسترداد كما يلي.

  1. يبدأ Bootloader ، ثم يقوم بما يلي:

    1. يدفع الاسترداد + vendor_boot + ramdisk العام إلى / . (إذا قام OEM بتكرار وحدات kernel النمطية في ذاكرة الوصول العشوائي للاسترداد عن طريق إضافتها إلى BOARD_RECOVERY_KERNEL_MODULES ) ، vendor_boot يكون اختياريًا.)
    2. يقوم بتشغيل النواة من قسم boot .
  2. يقوم Kernel بتحميل ramdisk إلى / ثم تنفيذ /init من ramdisk العام.

  3. تبدأ المرحلة الأولى ، ثم تقوم بما يلي:

    1. IsRecoveryMode() == true و ForceNormalBoot() == false .
    2. تحميل وحدات kernel الخاصة بالمورد من /lib/modules .
    3. يستدعي DoFirstStageMount() ولكنه يتخطى التركيب لأن IsRecoveryMode() == true . (لا يحرر الجهاز ramdisk (لأن / لا يزال هو نفسه) ولكنه يستدعي SetInitAvbVersionInRecovery() .)
    4. تبدأ المرحلة الثانية من " /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 . تكون عملية التمهيد لوضع الاسترداد كما يلي.

  1. يبدأ Bootloader ، ثم يقوم بما يلي:

    1. يدفع استرداد ramdisk إلى / .
    2. يقوم بتشغيل النواة من قسم recovery .
  2. يقوم Kernel بتحميل ramdisk إلى / ثم تنفيذ /init ، وهو ارتباط رمزي بـ /system/bin/init من ذاكرة الوصول العشوائية recovery .

  3. تبدأ المرحلة الأولى ، ثم تقوم بما يلي:

    1. IsRecoveryMode() == true و ForceNormalBoot() == false .
    2. تحميل وحدات kernel الخاصة بالمورد من /lib/modules .
    3. يستدعي DoFirstStageMount() ولكنه يتخطى التركيب لأن IsRecoveryMode() == true . (لا يحرر الجهاز ramdisk (لأن / لا يزال هو نفسه) ولكنه يستدعي SetInitAvbVersionInRecovery() .)
    4. تبدأ المرحلة الثانية من " /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 .