गतिशील विभाजन वाले गैर-ए/बी उपकरणों के लिए ओटीए

एंड्रॉइड 10 गतिशील विभाजन का समर्थन करता है, एक उपयोगकर्ता स्थान विभाजन प्रणाली जो ओवर-द-एयर (ओटीए) अपडेट के दौरान विभाजन बना सकती है, आकार बदल सकती है और नष्ट कर सकती है।

यह पृष्ठ वर्णन करता है कि गैर-ए/बी उपकरणों के लिए अद्यतन के दौरान ओटीए क्लाइंट गतिशील विभाजन का आकार कैसे बदलते हैं।

गैर-ए/बी उपकरणों के लिए, डायनामिक विभाजन के लिए ओटीए अपडेट अपडेट पैकेज के अंदर updater उपयोग करके लागू किया जाता है।

लॉन्च डिवाइस अपडेट करें

यह अनुभाग गैर-ए/बी उपकरणों पर लागू होता है जो गतिशील विभाजन समर्थन के साथ लॉन्च होते हैं; ये डिवाइस एंड्रॉइड 10 से उच्चतर रिलीज़ में अपग्रेड होते हैं।

अद्यतन पैकेज जनरेट करें

ओटीए अपडेट पैकेज build/make/tools/releasetools के अंतर्गत स्थित ota_from_target_files स्क्रिप्ट द्वारा जेनरेट किए जाते हैं। डिफ़ॉल्ट रूप से, स्क्रिप्ट एक पैकेज उत्पन्न करती है जो system और vendor विभाजन को अद्यतन करती है। यदि अतिरिक्त गतिशील विभाजन हैं, जैसे कि product , product_services , या odm , तो उनके अपडेट डिवाइस-विशिष्ट कोड में उत्पन्न होने चाहिए।

अद्यतन उत्पन्न करने के लिए, विस्तारित पायथन मॉड्यूल में, FullOTA_GetBlockDifferences() और IncrementalOTA_GetBlockDifferences() लागू करें। ये दो फ़ंक्शन BlockDifference ऑब्जेक्ट्स की एक सूची लौटाते हैं, प्रत्येक अपडेट पैच का वर्णन करता है जिसे एक विभाजन पर लागू किया जाएगा। इन दो फ़ंक्शंस द्वारा लौटाए गए विभाजन को मैन्युअल रूप से संशोधित नहीं किया जाना चाहिए या कहीं और सत्यापित नहीं किया जाना चाहिए, उदाहरण के लिए *_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()]

अद्यतन प्रवाह

पर्दे के पीछे, निम्नलिखित फ़ंक्शन संपादन स्क्रिप्ट में जोड़े जाते हैं:

  • unmap_partition(name)
    • यदि विभाजन मैप किया गया है तो उसे अनमैप करें, अन्यथा कुछ न करें।
    • सफलता पर स्ट्रिंग t लौटाएँ, या विफलता पर खाली स्ट्रिंग लौटाएँ।
  • map_partition(name)
    • यदि विभाजन पहले से मैप नहीं किया गया है तो उसे मैप करें।
    • सफलता पर मैप किए गए ब्लॉक डिवाइस का पूर्ण पथ लौटाएं, या विफलता पर एक खाली स्ट्रिंग लौटाएं।
  • update_dynamic_partitions(op_list)
    • डायनामिक विभाजन मेटाडेटा पर दी गई ऑपरेशन सूची लागू करें, यदि आवश्यक हो तो विभाजन को अनमैपिंग करें।
    • सफलता पर t लौटाएँ, या विफलता पर एक खाली स्ट्रिंग।

update_dynamic_partitions के लिए op_list तर्क अद्यतन पैकेज में एक फ़ाइल को इंगित करता है। फ़ाइल की प्रत्येक पंक्ति एक ऑपरेशन निर्दिष्ट करती है। यदि कोई ऑपरेशन विफल हो जाता है, 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
    • दिए गए अधिकतम आकार में समूह का आकार बदलें।
    • यदि समूह मौजूद नहीं है तो निरस्त करें।
    • maximum_size 0 का मतलब है कि समूह में विभाजन पर कोई आकार सीमा नहीं है। यह सुनिश्चित करने के लिए अतिरिक्त परीक्षण की आवश्यकता है कि समूह में विभाजन डिवाइस पर उपलब्ध स्थान से अधिक न हो।
  • remove_group group-name
    • एक समूह हटाएँ.
    • यदि समूह में विभाजन हैं तो निरस्त करें।
  • remove_all_groups
    • डिवाइस मैपर से सभी विभाजनों को अनमैप करें।
    • सभी विभाजन और समूह हटाएँ.

वृद्धिशील ओटीए

वृद्धिशील OTA अद्यतन निम्नलिखित तर्क का उपयोग करते हैं:

  1. विभाजनों को छोटा करें/विभाजन हटाएं/विभाजन को समूह से बाहर ले जाएं (ताकि समूहों को छोटा करने के लिए पर्याप्त जगह हो)
  2. समूहों को छोटा करें (ताकि समूहों को विकसित करने के लिए पर्याप्त जगह हो)
  3. समूह बढ़ाएँ (ताकि हमारे पास विभाजन बढ़ाने/जोड़ने के लिए पर्याप्त जगह हो)
  4. विभाजन बढ़ाएँ/विभाजन जोड़ें/विभाजन को नए समूह में ले जाएँ

विस्तार से, 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

पूर्ण ओटीए

पूर्ण OTA अपडेट निम्नलिखित तर्क का उपयोग करते हैं:

  1. सभी मौजूदा समूहों और विभाजनों को हटा दें
  2. समूह जोड़ें
  3. विभाजन जोड़ें

विस्तार से, 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