डाइनैमिक पार्टीशन वाले ऐसे डिवाइसों के लिए OTA जो A/B डिवाइस नहीं हैं

Android 10 पर काम करता है डाइनैमिक पार्टीशन, यूज़रस्पेस पार्टीशन यह एक ऐसे सिस्टम का इस्तेमाल करता है जो ओवर-द-एयर (ओटीए) अपडेट के दौरान पार्टिशन बना सकता है, उनका साइज़ बदल सकता है, और उन्हें नष्ट कर सकता है.

इस पेज पर बताया गया है कि ओटीए क्लाइंट, बिना A/B डिवाइस.

नॉन-A/B डिवाइसों के लिए, डाइनैमिक पार्टिशन के लिए ओटीए अपडेट लागू होता है अपडेट पैकेज में updater का इस्तेमाल करके.

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

यह सेक्शन, डाइनैमिक सेटिंग के साथ लॉन्च होने वाले नॉन-A/B डिवाइसों पर लागू होता है पार्टिशन की सुविधा; ये डिवाइस Android से अपग्रेड हो जाते हैं 10 से ज़्यादा रिलीज़.

अपडेट पैकेज जनरेट करना

ओटीए अपडेट पैकेज, Google की ओर से जनरेट किए जाते हैं 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()]

फ़्लो अपडेट करना

पर्दे के पीछे, एडिट की गई फ़ाइल में ये फ़ंक्शन जोड़े गए हैं स्क्रिप्ट:

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

इंक्रीमेंटल ओटीए

इंक्रीमेंटल ओटीए अपडेट, इस लॉजिक का इस्तेमाल करते हैं:

  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), …)

इसके लिए op_list फ़ाइल इससे update_dynamic_partitions जनरेट हुआ है लॉजिक:

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

फ़ुल ओटीए

ओटीए के पूरे अपडेट में इस लॉजिक का इस्तेमाल किया जाता है:

  1. सभी मौजूदा ग्रुप और पार्टीशन मिटाना
  2. ग्रुप जोड़ें
  3. सेगमेंट जोड़ें

ज़्यादा जानकारी के लिए, इसकी मदद से update-script जनरेट किया गया है लॉजिक:

update_dynamic_partitions(op_list)

for each adding partition:
    block_image_update(map_partition(name), …)

इसके लिए op_list फ़ाइल इससे update_dynamic_partitions जनरेट हुआ है लॉजिक:

remove_all_groups
for each adding group:
    add_group
for each adding partition:
    add
for each adding partition:
    resize