ओवर-द-एयर (ओटीए) अपडेट लागू करने के लिए, बूटलोडर के पास बूट के दौरान रिकवरी रैम डिस्क को ऐक्सेस करने की सुविधा होनी चाहिए. अगर डिवाइस में बिना बदलाव की गई एओएसपी रिकवरी इमेज का इस्तेमाल किया जाता है, तो बूटलोडर 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
कमांड का इस्तेमाल करके ऐसा किया जा सकता है. किसी स्लॉट के हिस्से में बदलाव करते समय, बूटलोडर "सही तरीके से चालू हुआ" को हटा देता है और स्लॉट के लिए फिर से कोशिश करने की संख्या रीसेट कर देता है.
बूटलोडर को यह भी तय करना होगा कि कौनसा स्लॉट लोड करना है. इस डायग्राम में, फ़ैसला लेने की प्रोसेस का उदाहरण दिया गया है.
![बूटलोडर स्लॉटिंग फ़्लो](https://source.android.google.cn/static/docs/core/architecture/bootloader/images/bootloader_slotting.png?hl=hi)
तय करें कि आपको किस स्लॉट की कोशिश करनी है.
slot-unbootable
के तौर पर मार्क किए गए स्लॉट को लोड करने की कोशिश न करें. यह स्लॉट, फ़ास्टबूट से लौटाए गए मान के मुताबिक होना चाहिए. साथ ही, इसे मौजूदा स्लॉट कहा जाता है.अगर मौजूदा स्लॉट पर
slot-successful
का निशान नहीं है और उसमेंslot-retry-count = 0
है, तो मौजूदा स्लॉट कोslot-unbootable
के तौर पर मार्क करें. इसके बाद, कोई ऐसा स्लॉट चुनें जिस परunbootable
का निशान न लगाया गया हो और जिस परslot-successful
का निशान लगा हो. यह स्लॉट अब चुना गया स्लॉट है. अगर कोई मौजूदा स्लॉट उपलब्ध नहीं है, तो रिकवरी के लिए बूट करें या उपयोगकर्ता को गड़बड़ी का सही मैसेज दिखाएं.सही
boot.img
चुनें और कर्नेल कमांड लाइन पर, सिस्टम पार्टिशन को सही करने का पाथ शामिल करें.कर्नेल कमांड लाइन
slot_suffix
पैरामीटर भरें.चालू करें. अगर
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
पार्टीशन, रेडियो को फ़्लैश करने के लिए भी होना चाहिए. ऐसा करने के लिए, इन दो में से किसी एक तरीके का इस्तेमाल किया जा सकता है:बूटलोडर से रेडियो फ़्लैश करता है. इस स्थिति में, अपडेट पूरा करने के लिए, रिकवरी पार्टिशन से वापस बूटलोडर में फिर से चालू किया जा सकता है.
रिकवरी इमेज में रेडियो फ़्लैश करता है.इस सुविधा को बाइनरी लाइब्रेरी या यूटिलिटी के तौर पर उपलब्ध कराया जा सकता है.