नॉन-एबी अपडेट, ओटीए का एक पुराना तरीका है. इसका इस्तेमाल, Android के पुराने वर्शन (Android 6 और इससे पहले के वर्शन) वाले डिवाइसों पर किया जाता है. इन डिवाइसों में एक खास रिकवरी पार्टीशन होता है. इसमें डाउनलोड किए गए अपडेट पैकेज को अनपैक करने और अन्य पार्टीशन पर अपडेट लागू करने के लिए ज़रूरी सॉफ़्टवेयर होता है.
A/B पार्टीशन के बिना काम करने वाले पुराने Android डिवाइसों में, आम तौर पर फ़्लैश स्टोरेज में ये पार्टीशन होते हैं:
- बूट
- इसमें Linux kernel और कम से कम रूट फ़ाइल सिस्टम (RAM डिस्क में लोड किया गया) शामिल होता है. यह सिस्टम और अन्य सेगमेंट को माउंट करता है. साथ ही, सिस्टम सेगमेंट में मौजूद रनटाइम को शुरू करता है.
- सिस्टम
- इसमें सिस्टम ऐप्लिकेशन और लाइब्रेरी शामिल होती हैं, जिनका सोर्स कोड Android Open Source Project (AOSP) पर उपलब्ध होता है. सामान्य ऑपरेशन के दौरान, इस पार्टीशन को सिर्फ़ पढ़ने के लिए माउंट किया जाता है. इसका कॉन्टेंट सिर्फ़ ओटीए अपडेट के दौरान बदलता है.
- वेंडर
- इसमें ऐसे सिस्टम ऐप्लिकेशन और लाइब्रेरी शामिल हैं जिनका सोर्स कोड, Android Open Source Project (AOSP) पर उपलब्ध नहीं है. सामान्य ऑपरेशन के दौरान, इस पार्टीशन को सिर्फ़ पढ़ने के लिए माउंट किया जाता है. इसका कॉन्टेंट सिर्फ़ ओटीए अपडेट के दौरान बदलता है.
- userdata
- उपयोगकर्ता के इंस्टॉल किए गए ऐप्लिकेशन वगैरह से सेव किए गए डेटा को स्टोर करता है. आम तौर पर, ओटीए अपडेट की प्रोसेस में इस सेगमेंट का इस्तेमाल नहीं किया जाता.
- कैश मेमोरी
- कुछ ऐप्लिकेशन के लिए, कुछ समय के लिए डेटा सेव करने की जगह. इस पार्टिशन को ऐक्सेस करने के लिए, ऐप्लिकेशन को खास अनुमतियां चाहिए. साथ ही, डाउनलोड किए गए ओटीए अपडेट पैकेज को सेव करने के लिए भी इसका इस्तेमाल किया जाता है. अन्य प्रोग्राम इस जगह का इस्तेमाल इस उम्मीद के साथ करते हैं कि फ़ाइलें कभी भी मिट सकती हैं. कुछ ओटीए पैकेज के इंस्टॉल होने पर, हो सकता है कि यह पार्टीशन पूरी तरह मिट जाए. कैश मेमोरी में, ओटीए अपडेट के अपडेट लॉग भी होते हैं.
- रिकवरी
- इसमें एक दूसरा पूरा Linux सिस्टम होता है. इसमें एक कर्नेल और रिकवरी के लिए खास बाइनरी होती है. यह बाइनरी, पैकेज को पढ़ती है और दूसरे पार्टिशन को अपडेट करने के लिए, उसके कॉन्टेंट का इस्तेमाल करती है.
- अन्य
- यह एक छोटा पार्टीशन है. इसका इस्तेमाल रिकवरी मोड में किया जाता है. इससे यह जानकारी सेव की जाती है कि ओटीए पैकेज लागू होने के दौरान डिवाइस को फिर से चालू करने पर, रिकवरी मोड क्या कर रहा है.
ओटीए अपडेट की लाइफ़
ओटीए अपडेट करने के लिए, यह तरीका अपनाएं:
- डिवाइस, ओटीए सर्वर के साथ नियमित तौर पर चेक इन करता है. साथ ही, उसे अपडेट उपलब्ध होने की सूचना मिलती है. इसमें, अपडेट पैकेज का यूआरएल और उपयोगकर्ता को दिखाने के लिए जानकारी वाली स्ट्रिंग शामिल होती है.
-
डाउनलोड किए गए डेटा को कैश मेमोरी या डेटा पार्टीशन में अपडेट करें. साथ ही,
/system/etc/security/otacerts.zip
में मौजूद सर्टिफ़िकेट की मदद से, क्रिप्टोग्राफ़िक हस्ताक्षर की पुष्टि करें. उपयोगकर्ता को अपडेट इंस्टॉल करने के लिए कहा जाता है. - डिवाइस, रिकवरी मोड में रीबूट हो जाता है. इस मोड में, बूट पार्टिशन के केरल के बजाय, रिकवरी पार्टिशन के केरल और सिस्टम को बूट किया जाता है.
-
रिकवरी बाइनरी को init शुरू करता है. यह
/cache/recovery/command
में कमांड-लाइन आर्ग्युमेंट ढूंढता है, जो इसे डाउनलोड किए गए पैकेज पर ले जाता है. -
रिकवरी, पैकेज के क्रिप्टोग्राफ़िक हस्ताक्षर की पुष्टि,
/res/keys
(रिकवरी पार्टीशन में मौजूद रैम डिस्क का हिस्सा) में मौजूद सार्वजनिक कुंजियों के आधार पर करती है. - डेटा को पैकेज से खींचा जाता है और ज़रूरत के हिसाब से बूट, सिस्टम, और/या वेंडर के partition को अपडेट करने के लिए इस्तेमाल किया जाता है. सिस्टम पार्टीशन में बची हुई नई फ़ाइलों में से किसी एक में, नए रिकवरी पार्टीशन का कॉन्टेंट होता है.
-
डिवाइस सामान्य तरीके से रीस्टार्ट हो जाता है.
- इसके बाद, अपडेट किया गया नया बूट पार्टीशन लोड हो जाता है. साथ ही, यह नए सिस्टम पार्टीशन में बाइनरी को माउंट और एक्सीक्यूट करना शुरू कर देता है.
-
सामान्य स्टार्टअप के दौरान, सिस्टम रिकवरी पार्टिशन के कॉन्टेंट की तुलना, ज़रूरी कॉन्टेंट से करता है. ज़रूरी कॉन्टेंट को पहले
/system
में फ़ाइल के तौर पर सेव किया जाता है. अगर दोनों कॉन्टेंट अलग-अलग होते हैं, तो रिकवरी पार्टिशन को ज़रूरी कॉन्टेंट के साथ फिर से फ़्लैश किया जाता है. (इसके बाद, रीबूट करने पर रिकवरी पार्टिशन में पहले से ही नया कॉन्टेंट मौजूद होता है. इसलिए, इसे फिर से फ़्लैश करने की ज़रूरत नहीं होती.)
सिस्टम अपडेट हो गया है! अपडेट लॉग,
/cache/recovery/last_log.#
में देखे जा सकते हैं.
पैकेज अपडेट करना
अपडेट पैकेज एक .zip
फ़ाइल होती है, जिसमें एक्ज़ीक्यूटेबल बाइनरी
META-INF/com/google/android/update-binary
शामिल होता है. पैकेज पर हस्ताक्षर की पुष्टि करने के बाद, recovery
इस बाइनरी को /tmp
में निकालता है और बाइनरी को चलाता है. इसके लिए, वह ये आर्ग्युमेंट पास करता है:
- बाइनरी एपीआई वर्शन नंबर अपडेट करें. अगर अपडेट किए गए बाइनरी में पास किए गए आर्ग्युमेंट बदलते हैं, तो यह संख्या बढ़ जाती है.
- कमांड पाइप का फ़ाइल डिस्क्रिप्टर. अपडेट प्रोग्राम, रिकवरी बाइनरी को निर्देश भेजने के लिए इस पाइप का इस्तेमाल कर सकता है. ऐसा ज़्यादातर यूज़र इंटरफ़ेस में बदलाव करने के लिए किया जाता है. जैसे, उपयोगकर्ता को प्रोग्रेस दिखाना.
-
अपडेट पैकेज
.zip
फ़ाइल का फ़ाइल नाम.
अपडेट पैकेज, अपडेट बाइनरी के तौर पर स्टैटिक तौर पर लिंक की गई किसी भी बाइनरी का इस्तेमाल कर सकता है. ओटीए पैकेज बनाने वाले टूल, अपडेटर प्रोग्राम (bootable/recovery/updater
) का इस्तेमाल करते हैं. यह प्रोग्राम, एक आसान स्क्रिप्टिंग भाषा उपलब्ध कराता है, जिससे इंस्टॉलेशन से जुड़े कई काम किए जा सकते हैं. डिवाइस पर चल रही किसी भी दूसरी बाइनरी को बदला जा सकता है.
अपडेटर बाइनरी, edify सिंटैक्स, और पहले से मौजूद फ़ंक्शन के बारे में ज़्यादा जानने के लिए, ओटीए पैकेज के बारे में जानकारी देखें.
पिछली रिलीज़ से माइग्रेट करना
Android 2.3/3.0/4.0 रिलीज़ से माइग्रेट करते समय, डिवाइस के हिसाब से काम करने वाली सभी सुविधाओं को, पहले से तय नामों वाले C फ़ंक्शन के सेट से C++ ऑब्जेक्ट में बदल दिया जाता है. नीचे दी गई टेबल में, पुराने फ़ंक्शन और नए तरीके दिए गए हैं. ये दोनों एक जैसे काम करते हैं:
C फ़ंक्शन | C++ का तरीका |
---|---|
device_recovery_start() | Device::RecoveryStart() |
device_toggle_display() device_reboot_now() |
RecoveryUI::CheckKey() (RecoveryUI::IsKeyPressed() भी) |
device_handle_key() | Device::HandleMenuKey() |
device_perform_action() | Device::InvokeMenuItem() |
device_wipe_data() | Device::WipeData() |
device_ui_init() | ScreenRecoveryUI::Init() |
पुराने फ़ंक्शन को नए तरीकों में बदलना आसान होना चाहिए. अपने नए डिवाइस सबक्लास का इंस्टेंस बनाने और उसे दिखाने के लिए, नया make_device()
फ़ंक्शन जोड़ना न भूलें.