वर्चुअल 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 देर से आने पर, वाइल्ड पॉइंटर से जुड़ी संभावित गड़बड़ी को ठीक करना)

update_engine को समय से पहले मर्ज होने से रोकना

जब कोई डिवाइस (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 पार्टीशन खराब हो जाता है. साथ ही, 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 में कॉपी करें).