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

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

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

بالنسبة إلى ترقية الأجهزة التي تستمر في استخدام Android 12 أو إصدارات أقدم من kernel، سيظل ملف 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: سيتم تشغيل الأجهزة التي تعمل بالإصدار 13 من نظام التشغيل Android أو ترقيتها إلى الإصدار 13 من نظام التشغيل Android، والتي لا تتضمّن أي عمليات استرداد مخصَّصة.

بدء التشغيل باستخدام Android 13 ووضع الاسترداد المخصّص ووضع A/B (مساحة تخزين مؤقتة مخصّصة)

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

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

راجِع هذا الشكل إذا كان الجهاز يتضمّن قسمَي recovery_a وrecovery_b.

إطلاق الموقع الإلكتروني بالإصدار 13 من نظام التشغيل Android، بشكل مخصّص واسترداد البيانات من خلال نظام التشغيل A/B (قرص RAMD مخصَّص)

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

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

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

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

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

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

تشغيل نظام التشغيل Android 12 أو الترقية إليه، وبدء وضع الاسترداد المخصّص ووضع الاسترداد (A/B) (شريحة ذاكرة وصول عشوائي مخصّصة)

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

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

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

تشغيل أو ترقية نظام التشغيل Android 12، المخصص والمخصص لاسترداد البيانات من النوع A/B (قرص RAM مخصَّص)

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

الشكل 6: الأجهزة التي سيتم إطلاقها أو ترقيتها إلى الإصدار 12 من نظام التشغيل Android، والتي تتضمّن مفاتيح التشفير 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
    • صورة ramdisk عامة
      • لا يتم تضمينه إلا في صور يبلغ عددها 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 على جميع وحدات النواة المطلوبة لتشغيل وضع الاسترداد.
      • يجب أن يحتوي ملف 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. يتحكّم هذا المتغيّر في ما إذا كان سيتم إنشاء موارد استرداد ذاكرة الوصول العشوائي على الجهاز 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 على فارغ. وإذا فعلوا ذلك، يعني ذلك أنّهم يستخدمون إعدادات جديدة. في حال كانت هذه الأجهزة:

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

وبما أنّ aosp_arm64 ينشئ GKI فقط (وليس vendor_boot أو الاسترداد)، فهو ليس هدفًا كاملاً. للاطّلاع على 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 الثنائي لإتاحة تنفيذ المرحلة الثانية. في ما يلي محتوى 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، وبالتالي إذا كان ملف التصميم للجهاز موروثًا من ذلك الملف، لن تحتاج إلى تثبيت الصيغة 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

استخدِم هذا الخيار للأجهزة المزوّدة بأقسام A/B recovery، أي أنّ الجهاز يحتوي على recovery_a وrecovery_b partition. وتشمل هذه الأجهزة أجهزة A/B وVirtual A/B التي يمكن تحديث قسم الاسترداد فيها، مع الإعدادات التالية:

AB_OTA_PARTITIONS += recovery

يحتوي ملف vendor_boot ramdisk على أجزاء المصنّع لملف ramdisk ووحدات ملف النواة الخاصة بالمصنّع، بما في ذلك ما يلي:

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

عند تشغيل الجهاز في recovery، سيكون محتوى recovery + vendor_boot + الملفات الشخصية العامة كما يلي:

  • /init (من ذاكرة الوصول العشوائي المؤقت، تم إنشاؤها من 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 + ذاكرة التخزين المؤقت العامة مماثلة لعملية الاسترداد الحالية، ولكن يتم تحميل النواة من صورة boot بدلاً من صورة recovery. في ما يلي خطوات تشغيل وضع الاسترداد:

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

    1. تُرسِل عملية الاسترداد + vendor_boot + ذاكرة الوصول العشوائي العامة إلى /. (إذا نسخ المصنّع الأصلي للجهاز وحدات kernel في ذاكرة RAMD المخصَّصة لاسترداد البيانات من خلال إضافتها إلى 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 الافتراضي.

تثبِّت ملفات الإنشاء الخاصة بالمنتج $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 ramdisk)
  • /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 متغيّر قرص ذاكرة التخزين المؤقت للوحدات التالية: لإتاحة استخدام 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.