build/make/tools/releasetools
में उपलब्ध ota_from_target_files
टूल का इस्तेमाल करके, उन डिवाइसों के लिए पूरे और इंक्रीमेंटल ओटीए पैकेज बनाए जा सकते हैं जो A/B सिस्टम अपडेट या नॉन-A/B सिस्टम अपडेट का इस्तेमाल करते हैं. यह टूल, Android बिल्ड सिस्टम से जनरेट हुई target-files.zip
फ़ाइल को इनपुट के तौर पर इस्तेमाल करता है.
Android 11 या इसके बाद के वर्शन पर काम करने वाले डिवाइसों के लिए, अलग-अलग एसकेयू वाले कई डिवाइसों के लिए एक ओटीए पैकेज बनाया जा सकता है. इसके लिए, टारगेट डिवाइसों को डाइनैमिक फ़िंगरप्रिंट इस्तेमाल करने के लिए कॉन्फ़िगर करना होगा. साथ ही, ओटीए मेटाडेटा को अपडेट करना होगा, ताकि प्री और पोस्टकंडिशन एंट्री में डिवाइस का नाम और फ़िंगरप्रिंट शामिल किया जा सके.
Android 8.0 ने नॉन-ए/बी डिवाइसों के लिए, फ़ाइल पर आधारित OTA पैकेज बंद कर दिए हैं. इसलिए, इन डिवाइसों को ब्लॉक पर आधारित OTA पैकेज का इस्तेमाल करना होगा. Android 7.x या इससे पुराने वर्शन पर काम करने वाले डिवाइसों के लिए, ब्लॉक-आधारित ओटीए पैकेज जनरेट करने के लिए, --block
पैरामीटर को --block
विकल्प पास करें.ota_from_target_files
पूरे अपडेट बनाना
पूरा अपडेट, एक OTA पैकेज होता है. इसमें डिवाइस की फ़ाइनल स्थिति (सिस्टम, बूट, और रिकवरी पार्टीशन) की पूरी जानकारी होती है. जब तक डिवाइस पैकेज को पाने और लागू करने में सक्षम है, तब तक पैकेज, डिवाइस की मौजूदा स्थिति से कोई फ़र्क़ नहीं पड़ता. उदाहरण के लिए, यहां दी गई कमांड, target-files.zip
डिवाइस के लिए target-files.zip
संग्रह बनाने के लिए, रिलीज़ टूल का इस्तेमाल करती हैं.tardis
. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output
make dist
, $OUT
में पूरा OTA पैकेज बनाता है. इससे मिलने वाली .zip
फ़ाइल में, tardis
डिवाइस के लिए OTA पैकेज बनाने से जुड़ी सभी ज़रूरी चीज़ें होती हैं.
ota_from_target_files
को Python बाइनरी के तौर पर भी बनाया जा सकता है. साथ ही, इसे कॉल करके पूरे या इंक्रीमेंटल पैकेज बनाए जा सकते हैं.
ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip
ota_from_target_files
पाथ को $PATH
में सेट अप किया गया है. साथ ही, इससे मिलने वाला Python बाइनरी, out/
डायरेक्ट्री में मौजूद है.
ota_update.zip
अब टेस्ट डिवाइसों पर भेजने के लिए तैयार है. इस पर टेस्ट कुंजी से हस्ताक्षर किया गया है. उपयोगकर्ता के डिवाइसों के लिए, अपनी निजी कुंजियां जनरेट करें और उनका इस्तेमाल करें. इसके बारे में ज़्यादा जानकारी के लिए, रिलीज़ के लिए बिल्ड पर साइन करना लेख पढ़ें.
इंक्रीमेंटल अपडेट बनाना
इंक्रीमेंटल अपडेट, एक OTA पैकेज होता है. इसमें डिवाइस पर मौजूद डेटा के लिए बाइनरी पैच होते हैं. इंक्रीमेंटल अपडेट वाले पैकेज, आम तौर पर छोटे होते हैं. ऐसा इसलिए, क्योंकि इनमें उन फ़ाइलों को शामिल करने की ज़रूरत नहीं होती जिनमें बदलाव नहीं किया गया है. इसके अलावा, बदली गई फ़ाइलें अक्सर अपने पिछले वर्शन से बहुत मिलती-जुलती होती हैं. इसलिए, पैकेज में सिर्फ़ दो फ़ाइलों के बीच के अंतर की एन्कोडिंग शामिल करने की ज़रूरत होती है.
इंक्रीमेंटल अपडेट पैकेज को सिर्फ़ उन डिवाइसों पर इंस्टॉल किया जा सकता है जिनमें पैकेज बनाने के लिए इस्तेमाल किया गया सोर्स बिल्ड मौजूद हो. इंक्रीमेंटल अपडेट बनाने के लिए, आपको पिछली बिल्ड की target_files.zip
फ़ाइल (वह फ़ाइल जिसे आपको अपडेट करना है) के साथ-साथ नई बिल्ड की target_files.zip
फ़ाइल की ज़रूरत होगी. उदाहरण के लिए, यहां दी गई कमांड, tardis
डिवाइस के लिए इंक्रीमेंटल अपडेट बनाने के लिए, रिलीज़ टूल का इस्तेमाल करती हैं.
ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip
यह बिल्ड, पिछले बिल्ड से काफ़ी मिलता-जुलता है. साथ ही, इंक्रीमेंटल अपडेट पैकेज (incremental_ota_update.zip
), पूरे अपडेट के मुकाबले काफ़ी छोटा है. यह करीब 1 एमबी का है, जबकि पूरा अपडेट 60 एमबी का होता है.
इंक्रीमेंटल पैकेज को सिर्फ़ उन डिवाइसों पर डिस्ट्रिब्यूट करें जिन पर ठीक वही पिछला बिल्ड चल रहा है जिसे इंक्रीमेंटल पैकेज के शुरुआती पॉइंट के तौर पर इस्तेमाल किया गया था. आपको PREVIOUS-tardis-target_files.zip
या PREVIOUS-tardis-img.zip
में मौजूद इमेज को फ़्लैश करना होगा. ये दोनों इमेज make dist
की मदद से बनाई गई हैं और इन्हें fastboot update
की मदद से फ़्लैश किया जाएगा. इसके बजाय, PRODUCT_OUT
डायरेक्ट्री में मौजूद इमेज को फ़्लैश न करें. ये इमेज make
की मदद से बनाई गई हैं और इन्हें fastboot flashall
की मदद से फ़्लैश किया जाएगा. किसी ऐसे डिवाइस पर इंक्रीमेंटल पैकेज इंस्टॉल करने की कोशिश करने पर, इंस्टॉलेशन से जुड़ी गड़बड़ी होती है जिस पर कोई और बिल्ड मौजूद है. अपडेट इंस्टॉल न होने पर, डिवाइस पहले की तरह काम करता रहता है (पुराना सिस्टम चलता रहता है). पैकेज, अपडेट की जाने वाली सभी फ़ाइलों की पिछली स्थिति की पुष्टि करता है. इससे यह पक्का होता है कि डिवाइस को अपग्रेड नहीं किया गया है.
उपयोगकर्ता को बेहतर अनुभव देने के लिए, हर तीन से चार इंक्रीमेंटल अपडेट के बाद, पूरा अपडेट उपलब्ध कराएं. इससे लोगों को नई रिलीज़ के बारे में पता चलता है. साथ ही, उन्हें इंक्रीमेंटल अपडेट को इंस्टॉल करने के लंबे प्रोसेस से नहीं गुज़रना पड़ता.
एक से ज़्यादा एसकेयू के लिए, ओटीए पैकेज बनाना
Android 11 या इसके बाद के वर्शन में, अलग-अलग एसकेयू वाले कई डिवाइसों के लिए, एक ही ओटीए पैकेज का इस्तेमाल किया जा सकता है. इसके लिए, टारगेट डिवाइसों को डाइनैमिक फ़िंगरप्रिंट का इस्तेमाल करने के लिए कॉन्फ़िगर करना होगा. साथ ही, ओटीए मेटाडेटा को अपडेट करना होगा. इसके लिए, ओटीए टूल का इस्तेमाल करना होगा. इससे, डिवाइस का नाम और फ़िंगरप्रिंट, प्री और पोस्ट कंडीशन एंट्री में शामिल किया जा सकेगा.
SKU के बारे में जानकारी
एसकेयू का फ़ॉर्मैट, बिल्ड पैरामीटर की वैल्यू को मिलाकर बनाया जाता है. साथ ही, यह आम तौर पर मौजूदा build_fingerprint
पैरामीटर का ऐसा सबसेट होता है जिसके बारे में जानकारी नहीं दी जाती.
ओईएम, सीडीडी से मंज़ूरी पा चुके किसी भी बिल्ड पैरामीटर को एसकेयू के लिए इस्तेमाल कर सकते हैं. साथ ही, उन एसकेयू के लिए एक ही इमेज का इस्तेमाल कर सकते हैं. उदाहरण के लिए, इस एसकेयू के कई वैरिएंट हैं:
SKU = <product><device><modifierA><modifierB><modifierC>
modifierA
डिवाइस का लेवल है. जैसे, Pro, Premium या PlusmodifierB
हार्डवेयर का वैरिएंट है. जैसे, रेडियोmodifierC
वह क्षेत्र है जहां यह सुविधा उपलब्ध है. यह सामान्य हो सकता है, जैसे कि NA, EMEA या CHN. इसके अलावा, यह देश या भाषा के हिसाब से भी हो सकता है, जैसे कि JPN, ENG या CHN
कई ओईएम, एक से ज़्यादा एसकेयू के लिए एक ही इमेज का इस्तेमाल करते हैं. इसके बाद, डिवाइस बूट होने के बाद रनटाइम में प्रॉडक्ट का फ़ाइनल नाम और डिवाइस फ़िंगरप्रिंट निकालते हैं. इस प्रोसेस से, प्लैटफ़ॉर्म डेवलपमेंट की प्रोसेस आसान हो जाती है. इससे, मामूली बदलाव वाले डिवाइसों के साथ-साथ अलग-अलग प्रॉडक्ट के नाम वाले डिवाइसों को भी सामान्य इमेज (जैसे, tardis
और tardispro
) शेयर करने की सुविधा मिलती है.
डाइनैमिक फ़िंगरप्रिंट का इस्तेमाल करना
फ़िंगरप्रिंट, बिल्ड पैरामीटर का एक तय किया गया कॉम्बिनेशन होता है. जैसे, ro.product.brand
, ro.product.name
, और ro.product.device
. किसी डिवाइस का फ़िंगरप्रिंट, सिस्टम पार्टीशन फ़िंगरप्रिंट से लिया जाता है. इसका इस्तेमाल, डिवाइस पर चल रही इमेज (और बाइट) के यूनीक आइडेंटिफ़ायर के तौर पर किया जाता है. डाइनैमिक फ़िंगरप्रिंट बनाने के लिए, डिवाइस की build.prop
फ़ाइल में डाइनैमिक लॉजिक का इस्तेमाल करें. इससे डिवाइस बूट होने के समय, बूटलोडर वैरिएबल की वैल्यू मिल जाएगी. इसके बाद, उस डेटा का इस्तेमाल करके डिवाइस के लिए डाइनैमिक फ़िंगरप्रिंट बनाएं.
उदाहरण के लिए, tardis
और tardispro
डिवाइसों के लिए डाइनैमिक फ़िंगरप्रिंट इस्तेमाल करने के लिए, यहां दी गई फ़ाइलों को अपडेट करें.
odm/etc/build_std.prop
फ़ाइल को अपडेट करके, उसमें यह लाइन शामिल करें.ro.odm.product.device=tardis
odm/etc/build_pro.prop
फ़ाइल को अपडेट करके, उसमें यह लाइन शामिल करें.ro.odm.product.device=tardispro
odm/etc/build.prop
फ़ाइल को अपडेट करके, उसमें ये लाइनें शामिल करें.ro.odm.product.device=tardis import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
ये लाइनें, ro.boot.product.hardware.sku
बूटलोडर प्रॉपर्टी (जो सिर्फ़ पढ़ने के लिए होती है) की वैल्यू के आधार पर, डिवाइस का नाम, फ़िंगरप्रिंट, और ro.build.fingerprint
वैल्यू को डाइनैमिक तरीके से सेट करती हैं.
ओटीए पैकेज का मेटाडेटा अपडेट करना
ओटीए पैकेज में एक मेटाडेटा फ़ाइल (META-INF/com/android/metadata
) होती है. इसमें पैकेज के बारे में जानकारी होती है. जैसे, ओटीए पैकेज की प्रीकंडिशन और पोस्टकंडिशन. उदाहरण के लिए, यहां दिया गया कोड, tardis
डिवाइस को टारगेट करने वाले किसी ओटीए पैकेज की मेटाडेटा फ़ाइल है.
post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis
pre-device
, pre-build-incremental
, और pre-build
वैल्यू से यह तय होता है कि OTA पैकेज इंस्टॉल करने से पहले, डिवाइस की स्थिति कैसी होनी चाहिए. post-build-incremental
और post-build
वैल्यू से यह तय होता है कि ओटीए पैकेज इंस्टॉल होने के बाद, डिवाइस की स्थिति क्या होगी. pre-
और post-
फ़ील्ड की वैल्यू, बिल्ड की इन प्रॉपर्टी से मिलती हैं.
pre-device
वैल्यू,ro.product.device
बिल्ड प्रॉपर्टी से ली गई है.pre-build-incremental
औरpost-build-incremental
वैल्यू,ro.build.version.incremental
बिल्ड प्रॉपर्टी से मिलती हैं.pre-build
औरpost-build
वैल्यू,ro.build.fingerprint
बिल्ड प्रॉपर्टी से मिलती हैं.
Android 11 या इसके बाद के वर्शन पर काम करने वाले डिवाइसों पर, ओटीए टूल में --boot_variable_file
फ़्लैग का इस्तेमाल किया जा सकता है. इससे, उस फ़ाइल का पाथ तय किया जा सकता है जिसमें डिवाइस के डाइनैमिक फ़िंगरप्रिंट को बनाने के लिए इस्तेमाल किए गए रनटाइम वैरिएबल की वैल्यू शामिल होती हैं. इसके बाद, इस डेटा का इस्तेमाल ओटीए मेटाडेटा को अपडेट करने के लिए किया जाता है. इससे pre-
और post-
शर्तों में डिवाइस का नाम और फ़िंगरप्रिंट शामिल किया जाता है. इसके लिए, पाइप वर्ण | को डेलिमिटर के तौर पर इस्तेमाल किया जाता है. --boot_variable_file
फ़्लैग का सिंटैक्स और ब्यौरा यहां दिया गया है.
- सिंटैक्स:
--boot_variable_file <path>
- ब्यौरा: यह उस फ़ाइल का पाथ तय करता है जिसमें
ro.boot.*
प्रॉपर्टी की संभावित वैल्यू शामिल होती हैं. इस कुकी का इस्तेमाल, संभावित रनटाइम फ़िंगरप्रिंट का हिसाब लगाने के लिए किया जाता है. ऐसा तब होता है, जब इंपोर्ट स्टेटमेंट से कुछro.product.*
प्रॉपर्टी बदल दी जाती हैं. फ़ाइल में हर लाइन में एक प्रॉपर्टी होनी चाहिए. साथ ही, हर लाइन का फ़ॉर्मैट यह होना चाहिए:prop_name=value1,value2
.
उदाहरण के लिए, जब प्रॉपर्टी ro.boot.product.hardware.sku=std,pro
होती है, तब tardis
और tardispro
डिवाइसों के लिए ओटीए मेटाडेटा यहां दिखाया गया है.
post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro
Android 10 पर काम करने वाले डिवाइसों पर इस सुविधा को चालू करने के लिए, रेफ़रंस
इंप्लीमेंटेशन देखें.
यह बदलाव वाली सूची, build.prop
फ़ाइल में मौजूद import
स्टेटमेंट को शर्तों के हिसाब से पार्स करती है. इससे प्रॉपर्टी के बदले गए मान को पहचाना जा सकता है और ओटीए के फ़ाइनल मेटाडेटा में दिखाया जा सकता है.