ओटीए अपडेट लागू करना

ओवर-द-एयर (OTA) अपडेट लागू करने के लिए, बूटलोडर को बूट के दौरान रिकवरी रैम डिस्क को ऐक्सेस करना होगा. अगर डिवाइस में, बिना बदलाव वाली AOSP रिकवरी इमेज का इस्तेमाल किया जाता है, तो बूटलोडर, misc पार्टिशन पर मौजूद पहले 32 बाइट पढ़ता है. अगर वहां मौजूद डेटा, boot-recovery से मेल खाता है, तो बूटलोडर, recovery इमेज में बूट होता है. इस तरीके से, रिकवरी से जुड़े किसी भी काम को पूरा किया जा सकता है. जैसे, ओटीए लागू करना या डेटा हटाना.

रिकवरी और बूटलोडर के ज़रिए कम्यूनिकेशन के लिए इस्तेमाल किए जाने वाले फ़्लैश में ब्लॉक के कॉन्टेंट के बारे में जानकारी पाने के लिए, bootable/recovery/bootloader_message/bootloader_message.h पर जाएं.

A/B अपडेट वाले डिवाइस

A/B अपडेट का इस्तेमाल करने वाले डिवाइसों पर, ओटीए अपडेट की सुविधा काम करे, इसके लिए पक्का करें कि डिवाइस का बूटलोडर इन शर्तों को पूरा करता हो.

सामान्य शर्तें

  • ओटीए के ज़रिए अपडेट किए गए सभी पार्टीशन को अपडेट किया जा सकता है. हालांकि, ऐसा तब किया जा सकता है, जब मुख्य सिस्टम बूट हो गया हो और रिकवरी मोड में अपडेट न किया गया हो.

  • system पार्टीशन को बूट करने के लिए, बूटलोडर, कर्नल कमांड लाइन पर यह वैल्यू पास करता है: ro root=/dev/[node] rootwait init=/init.

  • Android फ़्रेमवर्क की यह ज़िम्मेदारी है कि वह एचएएल से markBootSuccessful को कॉल करे. बूटलोडर को कभी भी किसी पार्टीशन को 'सफलतापूर्वक बूट किया गया' के तौर पर मार्क नहीं करना चाहिए.

बूट कंट्रोल HAL के लिए सहायता

बूटलोडर को boot_control एचएएल के साथ काम करना चाहिए. इसके बारे में hardware/libhardware/include/hardware/boot_control.h में बताया गया है. अपडेटर, बूट कंट्रोल HAL से क्वेरी करता है. इसके बाद, इस्तेमाल न किए जा रहे बूट स्लॉट को अपडेट करता है. साथ ही, HAL का इस्तेमाल करके चालू स्लॉट को बदलता है और अपडेट किए गए ऑपरेटिंग सिस्टम में रीबूट करता है. ज़्यादा जानकारी के लिए, बूट कंट्रोल HAL लागू करना लेख पढ़ें.

स्लॉट के लिए सहायता

बूटलोडर में, पार्टीशन और स्लॉट से जुड़ी सुविधाएं होनी चाहिए. जैसे:

  • पार्टिशन के नामों में ऐसा सफ़िक्स शामिल होना चाहिए जिससे यह पता चले कि कौनसे पार्टिशन, बूटलोडर के किसी स्लॉट से जुड़े हैं. ऐसे हर पार्टीशन के लिए, एक वैरिएबल has-slot:partition base name होता है. इसकी वैल्यू yes होती है. स्लॉट के नाम, वर्णमाला के क्रम में a, b, c वगैरह होते हैं. ये _a, _b, _c वगैरह सफ़िक्स वाले पार्टीशन से जुड़े होते हैं. बूटलोडर को ऑपरेटिंग सिस्टम को यह बताना चाहिए कि किस स्लॉट को बूट किया गया है. इसके लिए, कमांड लाइन प्रॉपर्टी androidboot.slot_suffix का इस्तेमाल किया जाता है. इस प्रॉपर्टी को, Android 12 या उसके बाद के वर्शन पर लॉन्च होने वाले डिवाइसों के लिए, bootconfig के ज़रिए सेट किया जाता है.

  • slot-retry-count वैल्यू को पॉज़िटिव वैल्यू (आम तौर पर 3) पर रीसेट किया जाता है. ऐसा, बूट कंट्रोल HAL के ज़रिए setActiveBootSlot कॉलबैक या fastboot set_active कमांड के ज़रिए किया जाता है. किसी ऐसे पार्टीशन में बदलाव करते समय जो किसी स्लॉट का हिस्सा है, बूटलोडर "सक्सेसफ़ुली बूटेड" को मिटा देता है और स्लॉट के लिए फिर से कोशिश करने की संख्या को रीसेट कर देता है.

बूटलोडर को यह भी तय करना चाहिए कि कौनसे स्लॉट को लोड करना है. इस इमेज में, फ़ैसला लेने की प्रोसेस का एक उदाहरण दिखाया गया है.

बूटलोडर स्लॉटिंग फ़्लो
पहली इमेज. बूटलोडर स्लॉटिंग फ़्लो
  1. तय करें कि किस स्लॉट के लिए कोशिश करनी है. slot-unbootable के तौर पर मार्क किए गए स्लॉट को लोड करने की कोशिश न करें. यह स्लॉट, फ़ास्टबूट से मिली वैल्यू के मुताबिक होना चाहिए. इसे मौजूदा स्लॉट कहा जाता है.

  2. अगर मौजूदा स्लॉट को slot-successful के तौर पर मार्क नहीं किया गया है और उसमें slot-retry-count = 0 मौजूद है, तो मौजूदा स्लॉट को slot-unbootable के तौर पर मार्क करें. इसके बाद, unbootable के तौर पर मार्क नहीं किए गए और slot-successful के तौर पर मार्क किए गए किसी दूसरे स्लॉट को चुनें. अब यह स्लॉट चुना गया स्लॉट है. अगर कोई मौजूदा स्लॉट उपलब्ध नहीं है, तो रिकवरी मोड में बूट करें या उपयोगकर्ता को गड़बड़ी का मैसेज दिखाएं.

  3. सही boot.img चुनें और कर्नल कमांड लाइन पर सही सिस्टम पार्टीशन का पाथ शामिल करें.

  4. कर्नेल कमांड लाइन slot_suffix पैरामीटर को पॉप्युलेट करें.

  5. बूट करें. अगर slot-successful के तौर पर मार्क नहीं किया गया है, तो slot-retry-count की वैल्यू कम करें.

fastboot यूटिलिटी यह तय करती है कि फ़्लैश कमांड चलाने पर, किस पार्टिशन को फ़्लैश करना है. उदाहरण के लिए, fastboot flash system system.img कमांड चलाने पर, सबसे पहले current-slot वैरिएबल के लिए क्वेरी की जाती है. इसके बाद, सिस्टम में मौजूद नतीजे को एक साथ जोड़कर, उस पार्टीशन का नाम जनरेट किया जाता है जिसे फ़्लैश किया जाना चाहिए (system_a, system_b वगैरह).

fastboot set_active कमांड या बूट कंट्रोल HAL setActiveBootSlot कमांड का इस्तेमाल करके, मौजूदा स्लॉट सेट करते समय, बूटलोडर को मौजूदा स्लॉट अपडेट करना चाहिए. साथ ही, slot-unbootable और slot-successful को मिटाना चाहिए और फिर से कोशिश करने की संख्या को रीसेट करना चाहिए. slot-unbootable को मिटाने का यही एक तरीका है.

ऐसे डिवाइस जिनमें A/B अपडेट की सुविधा नहीं है

जिन डिवाइसों पर A/B अपडेट का इस्तेमाल नहीं किया जाता है उन पर ओटीए अपडेट की सुविधा काम करे, इसके लिए (अपडेट किए जा सकने वाले नॉन-ए/बी डिवाइस देखें), पक्का करें कि डिवाइस का बूटलोडर इन शर्तों को पूरा करता हो.

  • recovery पार्टीशन में ऐसी इमेज होनी चाहिए जो किसी काम करने वाले पार्टीशन (cache, userdata) से सिस्टम इमेज को पढ़ सके और उसे system पार्टीशन में लिख सके.

  • बूटलोडर में, सीधे रिकवरी मोड में बूट करने की सुविधा होनी चाहिए.

  • अगर रेडियो इमेज अपडेट करने की सुविधा काम करती है, तो recovery पार्टीशन में भी रेडियो को फ़्लैश करने की सुविधा होनी चाहिए. ऐसा इनमें से किसी एक तरीके से किया जा सकता है:

    • बूटलोडर, रेडियो को फ़्लैश करता है. इस मामले में, अपडेट पूरा करने के लिए, रिकवरी पार्टीशन से बूटलोडर में वापस रीबूट किया जा सकता है.

    • रिकवरी इमेज, रेडियो को फ़्लैश करती है. यह सुविधा, बाइनरी लाइब्रेरी या यूटिलिटी के तौर पर उपलब्ध कराई जा सकती है.