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

في 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، دون الحاجة إلى استرداد مخصص

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

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

التشغيل باستخدام Android 13، واسترداد مخصص واسترداد A/B (قرص ذاكرة الوصول العشوائي المخصص)

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

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

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

التشغيل باستخدام Android 13، واسترداد مخصص وغير A/B (قرص ذاكرة الوصول العشوائي المخصص)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

الترقية إلى Android 12، استرداد مخصص (ذاكرة الوصول العشوائي المخصصة)

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

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

محتويات صور التمهيد

تحتوي صور تمهيد Android على ما يلي.

  • تمت إضافة صورة init_boot للأجهزة التي تعمل بنظام التشغيل Android 13

    • إصدار الرأس V4
    • صورة ramdisk العامة
  • صورة boot العامة

    • إصدار الرأس V3 أو V4
      • boot_signature لشهادة GKI boot.img (الإصدار 4 فقط). لم يتم توقيع GKI boot.img المعتمد للتشغيل الذي تم التحقق منه. لا يزال يتعين على مصنعي المعدات الأصلية التوقيع على ملف boot.img الذي تم إنشاؤه مسبقًا باستخدام مفتاح AVB الخاص بالجهاز.
      • cmdline عام ( GENERIC_KERNEL_CMDLINE )
      • نواة جي كي آي
    • صورة ramdisk العامة
      • يتم تضمينه فقط في صور boot من Android 12 والإصدارات الأقدم
  • صورة 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 الثنائية في صورة التمهيد.

محتويات صورة 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

يمكن أن يحتوي قرص الذاكرة 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

يمكن أن يحتوي قرص 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 . عملية التمهيد لوضع الاسترداد هي كما يلي.

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

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

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

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

يجب أن يحتوي قرص 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 . عملية التمهيد لوضع الاسترداد هي كما يلي.

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

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

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

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