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

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

रिकवरी टूल और बूटलोडर की मदद से बातचीत के लिए इस्तेमाल होने वाले ब्लॉक के कॉन्टेंट के बारे में जानकारी के लिए, bootable/recovery/bootloader_message/bootloader_message.h.

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

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

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

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

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

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

बूट कंट्रोल एचएएल के साथ काम करता है

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

स्लॉट के साथ काम करता है

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

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

  • slot-retry-count वैल्यू को पॉज़िटिव वैल्यू (आम तौर पर 3) पर रीसेट किया जाता है. बूट कंट्रोल एचएएल 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 वगैरह).

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

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

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

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

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

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

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

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