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

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

التحقّق من المساحة القابلة للتخصيص بشكل صحيح عند التثبيت الجانبي

قد يتعذّر التثبيت الجانبي لحزمة OTA كاملة على جهاز Virtual A/B يحتوي على قسم فائق أصغر من *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 وأعِد الإنشاء وأعِد تثبيت ذاكرة ROM لقسم الإقلاع أو قسم الاسترداد إذا كان الجهاز لا يستخدم الاسترداد كإقلاع.

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

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

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

تأكَّد من أنّ التغييرات التالية متوفّرة في شجرة المصدر لنظام 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 في النواة
  • برنامج إقلاع الذي تم إعداده لاستخدام أي وضع من أوضاع verity (مثل AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE) بدون AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO

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

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

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

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

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

تعديل المكوّنات الضرورية

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