تنفيذ التصحيحات الافتراضية 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 (دمج أزواج المفتاح/الفالة المتماثلة في معلومات القسم الديناميكي)

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

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