تنفيذ اختبار A/B الافتراضي - التعديلات

يمكنك اختيار التصحيحات التالية لحلّ المشاكل المعروفة التالية.

التحقّق من المساحة القابلة للتخصيص بشكل صحيح عند التثبيت من مصدر غير معروف

قد يتعذّر تثبيت حزمة كاملة عبر الهواء على جهاز A/B الافتراضي الذي يحتوي على super partition أصغر حجمًا من *2 * sum(size of update groups)*، ويظهر ما يلي في سجلّ الاسترداد /tmp/recovery.log:

The maximum size of all groups with suffix _b (...) has exceeded half of allocatable space for dynamic partitions ...

في ما يلي مثال على السجلّ:

[INFO:dynamic_partition_control_android.cc(1020)] Will overwrite existing partitions. Slot A may be unbootable until update finishes!
[...]
[ERROR:dynamic_partition_control_android.cc(803)] The maximum size of all groups with suffix _b (2147483648) has exceeded half of allocatable space for dynamic partitions 1073741824.

إذا واجهت هذه المشكلة، اختَر الإصدار CL 1399393 وأعِد إنشاء ملف التمهيد أو ملف الاسترداد وفلاشه إذا لم يستخدم الجهاز ملف الاسترداد لبدء التشغيل.

إصلاح خطأ في التقسيم أثناء الدمج

بعد تطبيق تحديث عبر الهواء، أثناء عملية دمج VAB، تؤدي المكالمة إلى update_engine_client --cancel إلى تعطُّل CleanupPreviousUpdateAction. هناك أيضًا خطأ محتمَل في المؤشر التلقائي عندما يأتي markSlotSuccessful متأخرًا.

تم حلّ هذه المشكلة من خلال إضافة الدالة StopActionInternal. تلغي CleanupPreviousUpdateAction المهام المعلّقة عند الحذف. ويحافظ على متتغيّر يتتبّع معرّف المهمة للمهمة المعلّقة في حلقة الرسائل. عند استخدام الإجراء destroy، يتم إلغاء المهمة المعلّقة لتجنُّب حدوث خطأ segfault.

تأكَّد من أنّ التغييرات التالية متوفّرة في شجرة مصادر Android 11 لحلّ SIGSEGV الأعطال في update_engine أثناء الدمج:

  • CL 1439792 (شرط أساسي لـ CL 1439372)
  • CL 1439372 (CleanupPreviousUpdateAction: إلغاء المهام المعلّقة عند الحذف)
  • CL 1663460 (إصلاح خطأ المؤشر العشوائي المحتمل عند تأخُّر markSlotSuccessful)

منع الدمج المبكر لـ update_engine

عند تشغيل جهاز (Android 11 والإصدارات الأحدث) وإكمال عملية التشغيل، يُجري update_engine مكالمة إلى ScheduleWaitMarkBootSuccessful()، ثم WaitForMergeOrSchedule(). يؤدي ذلك إلى بدء عملية الدمج. ومع ذلك، تتم إعادة تشغيل الجهاز ويعود إلى الفتحة القديمة. وبما أنّ عملية الدمج قد بدأت، يتعذّر على الجهاز التمهيد ويصبح غير قابل للاستخدام.

أضِف التغييرات التالية إلى شجرة المصدر. يُرجى العِلم أنّ الإصدار CL 1664859 اختياري.

  • CL 1439792 (شرط أساسي لـ CL 1439372)
  • CL 1439372 (CleanupPreviousUpdateAction: إلغاء المهام المعلّقة عند الحذف)
  • CL 1663460 (إصلاح خطأ المؤشر العشوائي المحتمل عند تأخُّر markSlotSuccessful)
  • CL 1664859 (اختياري - إضافة unittest بدلاً من CleanupPreviousUpdateAction)

التأكّد من ضبط dm-verity بشكلٍ صحيح

في الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث، يمكن ضبط الأجهزة عن غير قصد باستخدام خيارات dm-verity التالية:

  • CONFIG_DM_VERITY_AVB=y في النواة
  • تم ضبط أداة تحميل البرامج لتكون قادرة على استخدام أي وضع من أوضاع التحقّق من الصحة (مثل AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE) بدون AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO.

في حال ضبط إعدادات الجهاز هذه، يؤدي أي خطأ في عملية التحقّق إلى تعطُّل القسم vbmeta ، ما يجعل الأجهزة غير المزوّدة بميزة A/B غير قابلة للتشغيل. وبالمثل، إذا بدأ دمج، قد تصبح أجهزة A/B غير قابلة للاستخدام أيضًا. استخدِم وضع التحقّق AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO فقط.

  1. اضبط CONFIG_DM_VERITY_AVB=n في النواة.
  2. اضبط الأجهزة لاستخدام وضع AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO بدلاً من ذلك.

لمزيد من المعلومات، يُرجى الرجوع إلى مستندات verity: معالجة أخطاء dm-verity.

التأكّد من ضبط الملف المدمج بشكلٍ صحيح

إذا كنت بصدد إنشاء صور النظام وصور المورّدين بشكل منفصل، ثم استخدام merge_target_files لدمجهما، قد يتم إسقاط إعدادات اختبار A/B الافتراضي بشكل غير صحيح أثناء عملية الدمج. للتأكّد من صحة إعدادات A/B الافتراضية في الملف المستهدَف الذي تم دمجه، طبِّق التصحيحات التالية: CL 2084183 (دمج أزواج المفاتيح/القيم المتطابقة في معلومات التقسيم الديناميكي)

تعديل المكونات اللازمة

اعتبارًا من الإصدار 13 من نظام التشغيل Android، تم نقل snapuserd من ذاكرة الوصول العشوائي (ramdisk) الخاصة بالمورّد إلى ذاكرة وصول عشوائي (ramdisk) عامة. إذا كان جهازك يتم ترقيته إلى Android 13، من المحتمل أن يحتوي كل من ملف ramdisk الخاص بالمورّد وملف ramdisk العام على نسخة من snapuserd. في هذه الحالة، تتطلّب ميزة "الاختبار الافتراضي للإصدارات التجريبية" نسخة النظام من snapuserd. لضمان توفّر النسخة الصحيحة من snapuserd، طبِّق CL 2031243 (نسخ snapuserd إلى first_stage_ramdisk).