ডায়নামিক পার্টিশন সহ নন-এ/বি ডিভাইসগুলির জন্য ওটিএ

অ্যান্ড্রয়েড ১০ ডাইনামিক পার্টিশন সমর্থন করে, যা একটি ইউজারস্পেস পার্টিশনিং সিস্টেম এবং এটি ওভার-দ্য-এয়ার (OTA) আপডেটের সময় পার্টিশন তৈরি, আকার পরিবর্তন এবং ধ্বংস করতে পারে।

এই পৃষ্ঠায় বর্ণনা করা হয়েছে কিভাবে OTA ক্লায়েন্টরা নন-A/B ডিভাইসগুলির জন্য আপডেটের সময় ডাইনামিক পার্টিশনের আকার পরিবর্তন করে।

নন-এ/বি ডিভাইসগুলোর ক্ষেত্রে, ডাইনামিক পার্টিশনের জন্য ওটিএ আপডেটটি আপডেট প্যাকেজের ভেতরে থাকা updater ব্যবহার করে প্রয়োগ করা হয়।

লঞ্চ ডিভাইস আপডেট করুন

এই বিভাগটি সেইসব নন-এ/বি ডিভাইসের জন্য প্রযোজ্য যেগুলো ডাইনামিক পার্টিশন সাপোর্ট সহ লঞ্চ হয়; এই ডিভাইসগুলো অ্যান্ড্রয়েড ১০ থেকে উচ্চতর সংস্করণে আপগ্রেড হয়।

আপডেট প্যাকেজ তৈরি করুন

OTA আপডেট প্যাকেজগুলো 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()]

প্রবাহ আপডেট করুন

নেপথ্যে, edify স্ক্রিপ্টে নিম্নলিখিত ফাংশনগুলো যোগ করা হয়:

  • unmap_partition(name)
    • পার্টিশনটি ম্যাপ করা থাকলে আনম্যাপ করুন, অন্যথায় কিছু করবেন না।
    • সফল হলে t স্ট্রিংটি, অথবা ব্যর্থ হলে একটি খালি স্ট্রিং ফেরত দিন।
  • map_partition(name)
    • পার্টিশনটি আগে থেকে ম্যাপ করা না থাকলে, ম্যাপ করুন।
    • সফল হলে ম্যাপ করা ব্লক ডিভাইসটির অ্যাবসোলিউট পাথ ফেরত দিন, অথবা ব্যর্থ হলে একটি খালি স্ট্রিং ফেরত দিন।
  • update_dynamic_partitions(op_list)
    • ডায়নামিক পার্টিশন মেটাডেটার উপর প্রদত্ত অপারেশন তালিকাটি প্রয়োগ করুন, প্রয়োজনে পার্টিশন আনম্যাপ করুন।
    • সফল হলে t , অথবা ব্যর্থ হলে একটি খালি স্ট্রিং ফেরত দেবে।

update_dynamic_partitions ফাংশনের op_list আর্গুমেন্টটি `update` প্যাকেজের একটি ফাইলকে নির্দেশ করে। ফাইলটির প্রতিটি লাইন একটি অপারেশন নির্দিষ্ট করে। যদি কোনো অপারেশন ব্যর্থ হয়, 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), …)

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