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

ओवर-द-एयर (ओटीए) अपडेट लागू करने के लिए, बूटलोडर के पास बूट के दौरान रिकवरी रैम डिस्क को ऐक्सेस करने की सुविधा होनी चाहिए. अगर डिवाइस में, बिना बदलाव वाली 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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