اختَر التصحيحات التالية لحلّ المشاكل المعروفة التالية.
التحقّق من المساحة القابلة للتخصيص بشكل صحيح عند التثبيت الجانبي
قد يتعذّر التثبيت الجانبي لحزمة 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 وأعِد الإنشاء وأعِد التثبيت لقسم التشغيل أو قسم الاسترداد إذا كان الجهاز لا يستخدم الاسترداد كعملية تشغيل.
حلّ خطأ تجزئة أثناء الدمج
بعد تطبيق تحديث عبر الأثير (OTA)، أثناء عملية دمج 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(). سيؤدي ذلك إلى بدء عملية الدمج. ومع ذلك، تتم إعادة تشغيل الجهاز إلى الفتحة القديمة. وبما أنّ عملية الدمج قد بدأت، يتعذّر تشغيل الجهاز ويصبح غير قابل للاستخدام.
أضِف التغييرات التالية إلى شجرة المصدر. يُرجى العِلم أنّ رقم الطلب 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 فقط.
- اضبط
CONFIG_DM_VERITY_AVB=nفي النواة. - يمكنك ضبط الأجهزة لاستخدام وضع
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 من vendor ramdisk إلى generic ramdisk. إذا كان جهازك سيتم ترقيته إلى Android 13، من المحتمل أن يحتوي كل من ملف ramdisk الخاص بالمورّد وملف ramdisk العام على نسخة من snapuserd. في هذه الحالة، تتطلّب ميزة "الاختبار الافتراضي أثناء التشغيل" توفّر نسخة snapuserd من النظام. لضمان توفّر نسخة snapuserd الصحيحة، طبِّق CL
2031243
(انسخ snapuserd إلى first_stage_ramdisk).