ओवर-द-एयर (ओटीए) अपडेट लागू करने के लिए, बूटलोडर के पास बूट के दौरान रिकवरी रैम डिस्क को ऐक्सेस करने की सुविधा होनी चाहिए. अगर डिवाइस में, बिना बदलाव वाली 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 में बदलाव करने पर, बूटलोडर "बूट हो गया" को हटा देता है और स्लॉट के लिए फिर से कोशिश करने की संख्या को रीसेट कर देता है.
बूटलोडर को यह भी तय करना चाहिए कि किस स्लॉट को लोड करना है. इस इमेज में, फ़ैसला लेने की प्रोसेस का उदाहरण दिया गया है.
यह तय करना कि किस स्लॉट को आज़माना है.
slot-unbootable
मार्क किए गए स्लॉट को लोड करने की कोशिश न करें. यह स्लॉट, fastboot से मिली वैल्यू के हिसाब से होना चाहिए. इसे मौजूदा स्लॉट कहा जाता है.अगर मौजूदा स्लॉट को
slot-successful
के तौर पर मार्क नहीं किया गया है और उस परslot-retry-count = 0
है, तो मौजूदा स्लॉट कोslot-unbootable
के तौर पर मार्क करें. इसके बाद, कोई ऐसा स्लॉट चुनें जिस परunbootable
का निशान न लगा हो औरslot-successful
का निशान लगा हो. यह स्लॉट अब चुना गया स्लॉट होगा. अगर कोई मौजूदा स्लॉट उपलब्ध नहीं है, तो रिकवरी मोड में बूट करें या उपयोगकर्ता को गड़बड़ी का कोई काम का मैसेज दिखाएं.सही
boot.img
चुनें और कर्नेल कमांड लाइन पर, सिस्टम पार्टिशन को सही करने का पाथ शामिल करें.kernel कमांड लाइन
slot_suffix
पैरामीटर को पॉप्युलेट करें.बूट करें. अगर
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
पार्टीशन से रेडियो को फ़्लैश भी किया जा सकता है. ऐसा करने के लिए, इन दो में से किसी एक तरीके का इस्तेमाल किया जा सकता है:बूटलोडर, रेडियो को फ़्लैश करता है. इस मामले में, अपडेट पूरा करने के लिए, रिकवरी पार्टिशन से फिर से बूटलोडर में रीबूट किया जा सकता है.
रिकवरी इमेज, रेडियो को फ़्लैश करती है. यह सुविधा, बाइनरी लाइब्रेरी या यूटिलिटी के तौर पर दी जा सकती है.