Android 10 में डाइनैमिक पार्टीशन काम करते हैं. यह यूज़रस्पेस पार्टिशनिंग सिस्टम है. यह ओवर-द-एयर (ओटीए) अपडेट के दौरान, पार्टिशन बना सकता है, उनका साइज़ बदल सकता है, और उन्हें मिटा सकता है.
इस पेज पर बताया गया है कि OTA क्लाइंट, A/B डिवाइसों के लिए अपडेट के दौरान डाइनैमिक पार्टिशन का साइज़ कैसे बदलते हैं.
A/B डिवाइसों के अलावा, अन्य डिवाइसों पर डाइनैमिक पार्टीशन के लिए ओटीए अपडेट लागू किया जाता है. इसके लिए, अपडेट पैकेज में मौजूद updater
का इस्तेमाल किया जाता है.
लॉन्च डिवाइसों की जानकारी अपडेट करना
यह सेक्शन, डाइनैमिक पार्टीशन के साथ लॉन्च होने वाले नॉन-A/B डिवाइसों पर लागू होता है. ये डिवाइस, Android 10 से बाद के वर्शन वाली रिलीज़ में अपग्रेड होते हैं.
अपडेट पैकेज जनरेट करना
ओटीए अपडेट पैकेज,
ota_from_target_files
स्क्रिप्ट से जनरेट होते हैं. यह स्क्रिप्ट,
build/make/tools/releasetools
में मौजूद होती है. डिफ़ॉल्ट रूप से, स्क्रिप्ट एक पैकेज जनरेट करती है, जो system
और
vendor
पार्टीशन को अपडेट करती है. अगर product
, product_services
या odm
जैसे अन्य डाइनैमिक
पार्टिशन मौजूद हैं, तो उनके
अपडेट,
डिवाइस के हिसाब से बने कोड में जनरेट होने
चाहिए.
अपडेट जनरेट करने के लिए, एक्सटेंड किए गए Python मॉड्यूल में, FullOTA_GetBlockDifferences()
और
IncrementalOTA_GetBlockDifferences()
लागू करें. ये दोनों फ़ंक्शन, BlockDifference
ऑब्जेक्ट की सूची दिखाते हैं. हर ऑब्जेक्ट में, अपडेट पैच के बारे में जानकारी होती है, जिसे किसी partition पर लागू किया जाएगा. इन दोनों फ़ंक्शन से मिले सेगमेंट में, मैन्युअल रूप से बदलाव नहीं किया जाना चाहिए. इसके अलावा, *_InstallBegin()
या *_InstallEnd()
जैसे किसी अन्य फ़ंक्शन में इनकी पुष्टि नहीं की जानी चाहिए.
अपडेट जनरेट होने का उदाहरण:
# device/yoyodyne/tardis/releasetools.py import os from common import BlockDifference, EmptyImage, GetUserImage # The joined list of user image partitions of source and target builds. # - Items should be added to the list if new dynamic partitions are added. # - Items should not be removed from the list even if dynamic partitions are # deleted. When generating an incremental OTA package, this script needs to # know that an image is present in source build but not in target build. USERIMAGE_PARTITIONS = [ "product", "odm", ] def GetUserImages(input_tmp, input_zip): return {partition: GetUserImage(partition, input_tmp, input_zip) for partition in USERIMAGE_PARTITIONS if os.path.exists(os.path.join(input_tmp, "IMAGES", partition + ".img"))} def FullOTA_GetBlockDifferences(info): images = GetUserImages(info.input_tmp, info.input_zip) return [BlockDifference(partition, image) for partition, image in images.items()] def IncrementalOTA_GetBlockDifferences(info): source_images = GetUserImages(info.source_tmp, info.source_zip) target_images = GetUserImages(info.target_tmp, info.target_zip) # Use EmptyImage() as a placeholder for partitions that will be deleted. for partition in source_images: target_images.setdefault(partition, EmptyImage()) # Use source_images.get() because new partitions are not in source_images. return [BlockDifference(partition, target_image, source_images.get(partition)) for partition, target_image in target_images.items()]
फ़्लो अपडेट करें
बैकग्राउंड में, edify स्क्रिप्ट में ये फ़ंक्शन जोड़े जाते हैं:
unmap_partition(name)
- अगर पार्टीशन को मैप किया गया है, तो उसे अनमैप करें. ऐसा न करने पर, कुछ भी न करें.
- अगर फ़ंक्शन सही तरीके से काम करता है, तो
t
स्ट्रिंग दिखाएं. अगर फ़ंक्शन काम नहीं करता है, तो कोई स्ट्रिंग न दिखाएं.
map_partition(name)
- अगर पार्टीशन पहले से मैप नहीं किया गया है, तो उसे मैप करें.
- मैप किए गए ब्लॉक डिवाइस का एब्सोल्यूट पाथ दिखाता है. अगर मैप नहीं हो पाता है, तो खाली स्ट्रिंग दिखाता है.
update_dynamic_partitions(op_list)
- डायनैमिक पार्टीशन मेटाडेटा पर, दी गई ऑपरेशन सूची लागू करें. अगर ज़रूरी हो, तो पार्टीशन को अनमैप करें.
-
अगर फ़ंक्शन सही तरीके से काम करता है, तो
t
दिखाएं. अगर फ़ंक्शन काम नहीं करता है, तो खाली स्ट्रिंग दिखाएं.
op_list
के लिए
update_dynamic_partitions
आर्ग्युमेंट, अपडेट पैकेज में मौजूद किसी फ़ाइल पर ले जाता है. फ़ाइल की हर लाइन में कोई कार्रवाई की जानकारी होती है. अगर कोई भी कार्रवाई पूरी नहीं होती है, तो update_dynamic_partitions
तुरंत एक खाली स्ट्रिंग दिखाता है. ये ऑपरेशन हैं:
resize partition-name size
- पार्टीशन को अनमैप करें. इसके बाद, उसका साइज़ size पर सेट करें.
remove partition_name
- पार्टीशन को अनमैप करें. इसके बाद, उसे हटाएं.
add partition-name group-name
- चुने गए ग्रुप में नया सेगमेंट जोड़ें.
- अगर ग्रुप मौजूद नहीं है या सेगमेंट पहले से मौजूद है, तो प्रोसेस को रोकें.
move partition-name group-name
- पार्टीशन को दिए गए ग्रुप में ले जाएं.
- अगर ग्रुप या पार्टीशन मौजूद नहीं है, तो प्रोसेस को रोकें.
-
add_group group-name maximum-size
- दिए गए नाम और ज़्यादा से ज़्यादा साइज़ वाला ग्रुप जोड़ें.
- अगर ग्रुप पहले से मौजूद है, तो प्रोसेस को रोक दें.
- maximum_size के 0 होने का मतलब है कि ग्रुप में मौजूद सेगमेंट के साइज़ पर कोई पाबंदी नहीं है. यह पक्का करने के लिए ज़्यादा जांच की ज़रूरत है कि ग्रुप में मौजूद पार्टिशन, डिवाइस में उपलब्ध जगह से ज़्यादा न हों.
-
resize_group group-name maximum-size
- ग्रुप का साइज़, तय किए गए ज़्यादा से ज़्यादा साइज़ पर सेट करें.
- अगर ग्रुप मौजूद नहीं है, तो प्रोसेस को रोकें.
- 0 के maximum_size का मतलब है कि ग्रुप में सेगमेंट के लिए कोई साइज़ तय नहीं है. यह पक्का करने के लिए अतिरिक्त जांच की ज़रूरत होती है कि ग्रुप में मौजूद सेगमेंट में, डिवाइस के लिए उपलब्ध स्टोरेज की सीमा पार न हो.
remove_group group-name
- किसी ग्रुप को हटाना.
- अगर ग्रुप में कोई सेगमेंट है, तो रद्द करें.
remove_all_groups
- डिवाइस मैपर से सभी पार्टीशन को अनमैप करें.
- सभी पार्टीशन और ग्रुप हटाएं.
इंक्रीमेंटल ओटीए
इंक्रीमेंटल ओटीए अपडेट में इस लॉजिक का इस्तेमाल किया जाता है:
- पार्टीशन को छोटा करना/पार्टिशन मिटाना/पार्टिशन को ग्रुप से बाहर ले जाना (ताकि ग्रुप को छोटा करने के लिए ज़रूरत के मुताबिक जगह हो)
- ग्रुप को छोटा करें (ताकि ग्रुप बढ़ाने के लिए ज़रूरत के मुताबिक जगह हो)
- ग्रुप को बड़ा करना (ताकि हमारे पास, डिवाइस को बड़ा करने/डिवाइस में डिवाइस के हिस्से जोड़ने के लिए ज़रूरत के मुताबिक जगह हो)
- पार्टीशन बढ़ाना/पार्टिशन जोड़ना/पार्टिशन को नए ग्रुप में ले जाना
ज़्यादा जानकारी के लिए, update-script
को इस लॉजिक के आधार पर जनरेट
किया जाता है:
for each shrinking partition: block_image_update(map_partition(name), …) update_dynamic_partitions(op_list) for each growing / adding partition: block_image_update(map_partition(name), …)
update_dynamic_partitions
के लिए op_list
फ़ाइल, इस लॉजिक के हिसाब से जनरेट की गई है:
for each deleting partition: remove for each partition that changes groups: move to "default" for each shrinking partition: resize for each shrinking / removing group: resize_group / remove_group for each growing / adding group: resize_group / add_group for each adding partition: add for each growing / adding partition: resize for each partition that changes groups: move to target group
फ़ुल ओटीए
ओटीए के ज़रिए पूरे सिस्टम को अपडेट करने के लिए, इस लॉजिक का इस्तेमाल किया जाता है:
- सभी मौजूदा ग्रुप और पार्टीशन मिटाना
- ग्रुप जोड़ें
- पार्टीशन जोड़ना
ज़्यादा जानकारी के लिए, update-script
को इस
लॉजिक के साथ जनरेट किया जाता है:
update_dynamic_partitions(op_list) for each adding partition: block_image_update(map_partition(name), …)
update_dynamic_partitions
के लिए op_list
फ़ाइल, इस लॉजिक के साथ जनरेट की जाती है:
remove_all_groups for each adding group: add_group for each adding partition: add for each adding partition: resize