قسم التشغيل العام

في نظام التشغيل Android 12، تحتوي صورة boot العامة، والتي يُشار إليها باسم Generic Kernel Image (GKI)، على ملف ramdisk العام ونظام التشغيل GKI.

بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 13، تتم إزالة ملف ‎ramdisk العام من صورة boot ووضعه في صورة init_boot منفصلة. يؤدي هذا التغيير إلى إزالة كل المكونات من صورة boot باستثناء ملف التمهيد GKI.

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

لإنشاء ذاكرة وصول عشوائي (RAM) عامة، عليك نقل الموارد الخاصة بالمورّد خارج ذاكرة الوصول العشوائي (RAM) كي لا تحتوي ذاكرة الوصول العشوائي (RAM) العامة إلا على المرحلة الأولى 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 بدون وضع استرداد مخصّص

تشغيل/ترقية الجهاز، 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 (نظام التشغيل ramdisk المخصّص)

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

الشكل 3: الأجهزة التي تعمل بالإصدار 13 من نظام التشغيل Android أو التي تم ترقيتها إليه، والتي تتضمّن واجهة برمجة التطبيقات GKI وميزة الاسترداد المخصّصة وغير المستندة إلى ميزة A/B

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

تشغيل الإصدار 12 من نظام التشغيل Android أو الترقية إليه بدون وضع استرداد مخصّص

تشغيل/ترقية الجهاز، 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 (نظام التشغيل ramdisk المخصّص)

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

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

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

الترقية إلى Android 12، واستخدام وضع الاسترداد كوضع التشغيل (recovery-as-ramdisk)

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

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

الترقية إلى Android 12، وضع الاسترداد المخصّص (مساحة تخزين مؤقت مخصّصة)

تشغيل الجهاز أو ترقيته، بدون GKI، وضع الاسترداد المخصّص

الشكل 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 والإصدارات الأقدم.
  • vendor_boot صورة (للحصول على التفاصيل، يُرجى الاطّلاع على أقسام بوت المورّد)

    • vendor_boot العنوان
      • cmdline (BOARD_KERNEL_CMDLINE) الخاص بالجهاز
    • vendor_boot صورة ذاكرة وصول عشوائي (RAM)
      • lib/modules
      • موارد الاسترداد (في حال عدم توفّر فريق استرداد مخصّص)
    • صورة واحدة (dtb)
  • صورة واحدة (recovery)

    • الإصدار 2 من العنوان
      • cmdline خاص بالجهاز لاسترداد البيانات، إذا لزم الأمر
      • بالنسبة إلى قسم الاسترداد غير A/B، يجب أن تكون محتويات الرأس مستقلة، راجِع صور الاسترداد. مثلاً:
      • لا يتم تسلسل cmdline مع boot وvendor_boot cmdline.
      • يحدِّد العنوان DTBO للاسترداد، إذا لزم الأمر.
      • بالنسبة إلى قسم استرداد A/B، يمكن تسلسل المحتوى أو الاستدلال عليه من boot وvendor_boot. مثلاً:
      • يتم تسلسل cmdline مع boot وvendor_boot cmdline.
      • يمكن استنتاج DTBO من عنوان vendor_boot.
    • recovery صورة ذاكرة وصول عشوائي (RAM)
      • موارد الاسترداد
      • بالنسبة إلى قسم الاسترداد غير المتوافق مع A/B، يجب أن تكون محتويات ذاكرة التخزين المؤقت للنظام مستقلة. يُرجى الاطّلاع على صور الاسترداد. مثلاً:
      • يجب أن يحتوي lib/modules على جميع وحدات kernel المطلوبة لبدء التمهيد في وضع الاسترداد.
      • يجب أن يحتوي ملف ramdisk الخاص بعملية الاسترداد على init.
      • بالنسبة إلى قسم الاسترداد A/B، يتمّ وضع ملف ramdisk الخاص بعملية الاسترداد في بداية ملفَي ramdisk الخاصَّين بالنظام العام وvendor_boot، وبالتالي لا يلزم أن يكون ملف ramdisk الخاص بعملية الاسترداد مستقلاً. مثلاً:
      • قد لا يحتوي lib/modules إلا على وحدات إضافية للنواة مطلوبة لبدء تشغيل وضع الاسترداد، بالإضافة إلى وحدات النواة في vendor_boot ramdisk.
      • قد يكون الرابط الرمزي في /init متوفّرًا، ولكنّه يُخفَّض من شأنه مقارنةً بملف /init الثنائي في المرحلة الأولى من ملف التمهيد.

محتوى صورة ذاكرة الوصول العشوائي (RAM) العام

يحتوي ملف 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. يشير هذا المتغيّر إلى ما إذا كان الإصدار يستخدم ملف booted image مُعدّ مسبقًا. إذا تم ضبط هذا المتغيّر على 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/B recovery، يجب ضبط هذه المتغيّرة على 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 على true، وتكون البنية كما هو موضح في الشكل 3.

      • اضبط BOARD_USES_RECOVERY_AS_BOOT على فارغ، وتكون البنية كما هو موضّح في الشكل 4.

    • يمكن ضبط BOARD_USES_RECOVERY_AS_BOOT على فارغ. وإذا فعلوا ذلك، يعني ذلك أنّهم يستخدمون إعدادات جديدة. إذا كانت هذه الأجهزة:

  • على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android ضبط BOARD_USES_RECOVERY_AS_BOOT على "فارغ" واستخدام الإعدادات الجديدة. إذا كانت هذه الأجهزة:

وبما أنّ 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

يمكن أن يحتوي ملف ذاكرة الوصول العشوائي 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، مع الأخذ في الاعتبار الاستثناء التالي:

  • يتم نقل ملف ذاكرة الوصول العشوائي (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 الافتراضي

تثبيت ملفات 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

يمكن أن يحتوي ملف 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 (من recovery ramdisk، تم إنشاؤه من 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. في ما يلي خطوات تشغيل وضع الاسترداد:

  1. يبدأ مُحمِّل بدء التشغيل، ثم ينفِّذ ما يلي:

    1. تُرسِل عملية الاسترداد + vendor_boot + ذاكرة الوصول العشوائي (RAM) العامة إلى /. (إذا كان المصنّع الأصلي للجهاز يكرّر وحدات kernel في ذاكرة التخزين المؤقت لنظام الاسترداد عن طريق إضافتها إلى BOARD_RECOVERY_KERNEL_MODULES)، يكون vendor_boot اختياريًا).
    2. تشغيل النواة من قسم boot
  2. يُثبِّت "النواة" ذاكرة الوصول العشوائي المؤقتة على / ثم تنفِّذ /init من ذاكرة الوصول العشوائي المؤقتة العامة.

  3. تبدأ مرحلة الإعداد الأولى، ثمّ تُجري ما يلي:

    1. يُستخدَم لضبط IsRecoveryMode() == true وForceNormalBoot() == false.
    2. تحمِّل هذه الوحدة وحدات نواة المورِّد من /lib/modules.
    3. يتم استدعاء DoFirstStageMount() ولكن يتم تخطّي عملية التثبيت بسبب IsRecoveryMode() == true. (لا يُفرِّغ الجهاز ذاكرة التخزين المؤقت (لأنّ / لا يزال كما هو) ولكنه يستدعي SetInitAvbVersionInRecovery()).
    4. بدء مرحلة الإعداد الثانية من /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

يجب أن يحتوي ملف ذاكرة الوصول العشوائي recovery على رابط رمزي /init -> /system/bin/init وملف init_second_stage.recovery في /system/bin/init. عند تشغيل الجهاز في وضع الاسترداد، يجب توفُّر ملف /system/bin/init الثنائي لدعم كل من مرحلة التمهيد الأولى والثانية.

عند تشغيل الجهاز في recovery، يتم نقل محتويات recovery ramdisks على النحو التالي:

  • /init -> /system/bin/init (من recovery ذاكرة الوصول العشوائي المؤقت)
  • /system/bin/init (من recovery ramdisk، تم إنشاؤه من 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. في ما يلي خطوات التمهيد إلى وضع الاسترداد:

  1. يبدأ مُحمِّل بدء التشغيل، ثم ينفِّذ ما يلي:

    1. تُرسِل وحدة تخزين عشوائي (RAM) لإعادة الاسترداد إلى /.
    2. تشغيل النواة من قسم recovery
  2. يُثبِّت نواة نظام التشغيل ملف ramdisk في / ثم تنفِّذ /init، وهو رابط رمزي يؤدي إلى /system/bin/init من ملف ramdisk recovery.

  3. تبدأ مرحلة الإعداد الأولى، ثمّ تُجري ما يلي:

    1. يُستخدَم لضبط IsRecoveryMode() == true وForceNormalBoot() == false.
    2. تحمِّل هذه الوحدة وحدات نواة المورِّد من /lib/modules.
    3. يتم استدعاء DoFirstStageMount() ولكن يتم تخطّي عملية التثبيت بسبب IsRecoveryMode() == true. (لا يُفرِّغ الجهاز ذاكرة التخزين المؤقت (لأنّ / لا يزال كما هو) ولكنه يستدعي 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 قبل تحرير ملف ramdisk لكي تتمكّن الخطوة الثانية init من قراءة هذا الملف لضبط سمات الطابع الزمني للصورة boot.