वर्चुअल A/B पैच लागू करें

यहां दी गई समस्याओं को हल करने के लिए, इन पैच को चुनें.

साइडलोड करते समय, डिवाइस में स्टोरेज के लिए बची जगह की सही जानकारी देखना

किसी वर्चुअल A/B डिवाइस पर पूरा OTA पैकेज साइडलोड करने पर, ऐसा हो सकता है कि वह काम न करे. ऐसा तब होता है, जब डिवाइस का सुपर पार्टिशन, *2 * sum(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 मिटाने पर, पूरे नहीं किए गए टास्क रद्द हो जाते हैं. यह एक वैरिएबल बनाए रखता है, जो मैसेज लूप में मौजूद पूरे नहीं किए गए टास्क का आईडी ट्रैक करता है. टास्क को नष्ट करने पर, सेगफ़ॉल्ट से बचने के लिए, बाकी बचे टास्क को रद्द कर दिया जाता है.

मर्ज के दौरान SIGSEGV update_engine में होने वाली क्रैश की समस्या को ठीक करने के लिए, पक्का करें कि आपके Android 11 सोर्स ट्री में ये बदलाव किए गए हों:

  • CL 1439792 (CL 1439372 के लिए ज़रूरी शर्त)
  • CL 1439372 (CleanupPreviousUpdateAction: मिटाने पर बचे हुए टास्क रद्द करें)
  • CL 1663460 (markSlotSuccessful देर से आने पर, वाइल्ड पॉइंटर से जुड़ी संभावित गड़बड़ी को ठीक करना)

अपडेट_इंजन को समय से पहले मर्ज होने से रोकें

जब कोई डिवाइस (Android 11 और उसके बाद के वर्शन) बूट होता है और बूट पूरा हो जाता है, तो update_engine, ScheduleWaitMarkBootSuccessful() और WaitForMergeOrSchedule() को कॉल करता है. इससे मर्ज करने की प्रोसेस शुरू हो जाती है. हालांकि, डिवाइस फिर से पुराने स्लॉट पर रीबूट हो जाता है. मर्ज की प्रोसेस पहले ही शुरू हो चुकी है, इसलिए डिवाइस को बूट नहीं किया जा सकता और वह काम नहीं करेगा.

अपने सोर्स ट्री में ये बदलाव जोड़ें. ध्यान दें कि CL 1664859 को शामिल करना ज़रूरी नहीं है.

  • CL 1439792 (CL 1439372 के लिए ज़रूरी शर्त)
  • CL 1439372 (CleanupPreviousUpdateAction: मिटाने पर, पूरे नहीं किए गए टास्क रद्द करना)
  • CL 1663460 (markSlotSuccessful देर से आने पर, वाइल्ड पॉइंटर से जुड़ी संभावित गड़बड़ी को ठीक करना)
  • CL 1664859 (ज़रूरी नहीं - CleanupPreviousUpdateAction के लिए unittest जोड़ें)

पक्का करें कि dm-verity का कॉन्फ़िगरेशन सही हो

Android 11 और उसके बाद वाले वर्शन में, डिवाइस गलती से नीचे दिए गए dm-verity विकल्पों के साथ कॉन्फ़िगर किए जा सकते हैं:

  • कर्नेल में CONFIG_DM_VERITY_AVB=y
  • वह बूटलोडर जिसे AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO के बिना किसी भी वेरिटी मोड (जैसे कि AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE) का इस्तेमाल करने के लिए कॉन्फ़िगर किया गया है.

डिवाइस के इस कॉन्फ़िगरेशन में, पुष्टि करने से जुड़ी किसी भी गड़बड़ी की वजह से vbmeta partition खराब हो जाता है. साथ ही, 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 मोड का इस्तेमाल करने के लिए कॉन्फ़िगर करें.

ज़्यादा जानकारी के लिए, पुष्टि करने से जुड़ा दस्तावेज़ देखें: dm-verity से जुड़ी गड़बड़ियों को ठीक करना.

पुष्टि करें कि मर्ज की गई फ़ाइल सही तरीके से कॉन्फ़िगर की गई है

अगर सिस्टम इमेज और वेंडर इमेज को अलग-अलग बनाया जा रहा है, तो उन्हें मर्ज करने के लिए merge_target_files का इस्तेमाल करने पर, वर्चुअल A/B कॉन्फ़िगरेशन, मर्ज करने की प्रोसेस के दौरान गलत तरीके से हट सकते हैं. यह पुष्टि करने के लिए कि मर्ज की गई टारगेट फ़ाइल में वर्चुअल A/B कॉन्फ़िगरेशन सही हैं, ये पैच लागू करें: CL 2084183 (डाइनैमिक पार्टीशन की जानकारी में एक जैसे कीवर्ड/वैल्यू पेयर को मर्ज करें)

ज़रूरी कॉम्पोनेंट अपडेट करना

Android 13 वर्शन के बाद से, snapuserd को वेंडर रैम डिस्क से जेनरिक रैम डिस्क में ले जाया गया. अगर आपके डिवाइस को Android 13 पर अपग्रेड किया जा रहा है, तो हो सकता है कि वेंडर रैम डिस्क और सामान्य रैम डिस्क, दोनों में snapuserd की कॉपी मौजूद हो. इस स्थिति में, वर्चुअल A/B को snapuserd की सिस्टम कॉपी की ज़रूरत होती है. यह पक्का करने के लिए कि snapuserd की सही कॉपी मौजूद है, CL 2031243 को लागू करें (snapuserd को first_stage_ramdisk में कॉपी करें).