OTA برای دستگاه های غیر A/B با پارتیشن های پویا

اندروید 10 از پارتیشن‌های پویا پشتیبانی می‌کند، یک سیستم پارتیشن‌بندی فضای کاربران که می‌تواند پارتیشن‌ها را در طول به‌روزرسانی‌های هوایی (OTA) ایجاد، تغییر اندازه و از بین ببرد.

این صفحه نحوه تغییر اندازه پارتیشن‌های پویا توسط کلاینت‌های OTA را در طول به‌روزرسانی برای دستگاه‌های غیرA/B توضیح می‌دهد.

برای دستگاه‌های غیر A/B، به‌روزرسانی OTA برای پارتیشن‌های پویا با استفاده از updater داخل بسته به‌روزرسانی اعمال می‌شود.

دستگاه های راه اندازی را به روز کنید

این بخش برای دستگاه های غیر A/B که با پشتیبانی از پارتیشن های پویا راه اندازی می شوند، اعمال می شود. این دستگاه ها از اندروید 10 به نسخه های بالاتر ارتقا می یابند.

تولید بسته های به روز رسانی

بسته‌های به‌روزرسانی OTA توسط اسکریپت ota_from_target_files که در زیر build/make/tools/releasetools قرار دارد تولید می‌شوند. به طور پیش فرض، اسکریپت بسته ای تولید می کند که system و پارتیشن های vendor را به روز می کند. اگر پارتیشن‌های پویا اضافی مانند product ، product_services یا odm وجود دارد، به‌روزرسانی‌های آن‌ها باید در کد مخصوص دستگاه ایجاد شوند.

برای تولید به روز رسانی، در ماژول توسعه یافته Python، 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()]

جریان به روز رسانی

در پشت صحنه، توابع زیر به اسکریپت 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
    • اندازه گروه را به حداکثر اندازه داده شده تغییر دهید.
    • اگر گروه وجود نداشته باشد، لغو شود.
    • maximum_size 0 به این معنی است که هیچ محدودیتی برای اندازه پارتیشن ها در گروه وجود ندارد. برای اطمینان از اینکه پارتیشن‌های گروه از فضای موجود در دستگاه تجاوز نمی‌کنند، آزمایش بیشتری لازم است.
  • remove_group group-name
    • حذف یک گروه
    • اگر پارتیشن هایی در گروه وجود داشته باشد لغو شود.
  • remove_all_groups
    • نقشه همه پارتیشن‌ها را از نقشه‌بردار دستگاه خارج کنید.
    • تمام پارتیشن ها و گروه ها را حذف کنید.

OTA افزایشی

به روز رسانی 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), …)

فایل 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

OTA کامل

به روز رسانی کامل OTA از منطق زیر استفاده می کند:

  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