ডায়নামিক পার্টিশন সহ A/B ডিভাইসের জন্য OTA

Android 10-এ ডায়নামিক পার্টিশন কাজ করে, এটি একটি ইউজারস্পেস পার্টিশনিং সিস্টেম যা ওভার-দ্য-এয়ার (OTA) আপডেট চলাকালীন পার্টিশন তৈরি, ছোট-বড় ও নষ্ট করতে পারে।

এই পৃষ্ঠায় A/B ডিভাইসের জন্য আপডেট চলাকালীন কীভাবে ডায়নামিক পার্টিশন রিসাইজ করতে হয় তা বর্ণনা করা হয়েছে। এই ডিভাইসগুলি ডায়নামিক পার্টিশন সাপোর্ট সহ লঞ্চ করা হয়েছে এবং Android 9 এবং এর আগের ভার্সনে চলে।

ব্যাকগ্রাউন্ড

ডিভাইসে একটি super পার্টিশন আছে। এই পার্টিশন স্লট সাফিক্স করা নেই। ব্লক করা ডিভাইসটি অবশ্যই fstab-এ blk_device এন্ট্রির /misc সাথে থাকতে হবে। যেমন, fstab ফাইলে যদি এগুলি থাকে:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

তারপরে super-এর জন্য ব্লক ডিভাইসকে /dev/block/bootdevice/by-name/super-এ থাকতে হবে, কিন্তু super পার্টিশনকে fstab ফাইলে তালিকাভুক্ত করার প্রয়োজন নেই।

super পার্টিশনে, দুটি মেটাডেটা স্লট আছে, যেগুলির নম্বর হল ০ ও ১। এগুলি পার্টিশনের A/B স্লটের সাথে সম্পর্কিত। এই পৃষ্ঠায়, মেটাডেটা স্লটকে মেটাডেটা S (সোর্স) ও মেটাডেটা T (টার্গেট) বলা হয়। একইভাবে, পার্টিশনগুলিকে system_s, vendor_t ইত্যাদি হিসেবে উল্লেখ করা হয়।

আপগ্রেড করার আগে, মেটাডেটা S-এ ব্যবহৃত ডায়নামিক পার্টিশনের তথ্য থাকে (সাধারণত, system_s, vendor_s, product_s এবং আরও অনেক কিছু)। আপডেট চলাকালীন সিস্টেম এইসব পার্টিশনের এক্সটেন্ড রিড করে, তাই সেগুলি মুছে দেওয়া যায় না।

পার্টিশন আপডেট গ্রুপের অন্তর্গত। আরও জানতে ডায়নামিক পার্টিশন প্রয়োগ করা দেখুন।

ডিভাইসে মেটাডেটার একটি উদাহরণ নিচে দেওয়া হল।

  • মেটাডেটা ০
    • গ্রুপ foo_a
      • পার্টিশন system_a
      • পার্টিশন product_services_a
      • Foo-এর মাধ্যমে আপডেট করা অন্যান্য পার্টিশন
    • গ্রুপ bar_a
      • পার্টিশন vendor_a
      • পার্টিশন product_a
      • Bard-এর মাধ্যমে আপডেট করা অন্যান্য পার্টিশন
    • গ্রুপ foo_b (আগের আপগ্রেড থেকে অবশিষ্ট)
    • গ্রুপ bar_b (আগের আপগ্রেড থেকে অবশিষ্ট)
  • মেটাডেটা ১
    • গ্রুপ foo_a (আগের আপগ্রেড থেকে অবশিষ্ট)
    • গ্রুপ bar_a (আগের আপগ্রেড থেকে অবশিষ্ট)
    • গ্রুপ foo_b
      • পার্টিশন system_b
      • পার্টিশন product_services_b
      • Foo-এর দ্বারা আপডেট করা অন্যান্য পার্টিশন
    • গ্রুপ bar_b
      • পার্টিশন vendor_b
      • পার্টিশন product_b
      • Bard-এর মাধ্যমে আপডেট করা অন্যান্য পার্টিশন

আপনার ডিভাইসে মেটাডেটা ডাম্প করতে, আপনি lpdump টুল (সোর্স কোড system/extras/partition_tools-এর অধীনে) ব্যবহার করতে পারবেন। যেমন:

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

ফ্লো আপডেট করা

  1. super পার্টিশন মেটাডেটা ইনিশিয়ালাইজ করুন।
    1. Metadata থেকে সোর্স ডায়নামিক পার্টিশনের এক্সটেন্ড লোড করুন S. ধরা যাক, লোড করা মেটাডেটা হল M.
    2. M থেকে টার্গেট গ্রুপ ও পার্টিশন (যেমন, foo_t, bar_t) সরিয়ে দিন যাতে M-এ শুধু _s সাফিক্স সহ পার্টিশন ও গ্রুপ থাকে।
    3. আপডেট ম্যানিফেস্টে থাকা dynamic_partition_metadata ফিল্ড অনুযায়ী টার্গেট গ্রুপ ও পার্টিশন যোগ করুন।
      প্রতিটি পার্টিশনের সাইজ new_partition_info-এ পাওয়া যাবে।
    4. মেটাডেটা T-তে M লিখুন।
    5. ডিভাইস ম্যাপারে যোগ করা পার্টিশনকে লেখার উপযুক্ত হিসেবে ম্যাপ করুন।
  2. ব্লক করা ডিভাইসে আপডেট প্রয়োগ করুন।
    1. প্রয়োজন হলে, ডিভাইস ম্যাপারে সোর্স পার্টিশনকে শুধুমাত্র রিড-অনলি হিসেবে ম্যাপ করুন। সাইডলোডিংয়ের জন্য এটি প্রয়োজনীয় কারণ আপডেট করার আগে সোর্স পার্টিশন ম্যাপ করা হয় না।
    2. টার্গেট স্লটে থাকা সব ব্লক ডিভাইসে সম্পূর্ণ বা ডেল্টা আপডেট প্রয়োগ করুন।
    3. পোস্ট-ইনস্টল স্ক্রিপ্ট চালানোর জন্য পার্টিশন মাউন্ট করুন এবং তারপরে পার্টিশন আনমাউন্ট করুন।
  3. টার্গেট পার্টিশন আনম্যাপ করুন।

আপডেট করার আগে ও পরে, নিম্নলিখিত সিস্টেম প্রপার্টির নিজ নিজ ভ্যালু থাকা উচিত:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

আপডেট ম্যানিফেস্টে গ্রুপ ও পার্টিশন যোগ করা

ডায়নামিক পার্টিশন সহ A/B ডিভাইসে OTA আপডেট করার সময়, অথবা ডায়নামিক পার্টিশনের জন্য সহায়তা যোগ করা হচ্ছে এমন A/B ডিভাইসে, আপডেট ম্যানিফেস্টে আপনাকে গ্রুপ ও পার্টিশন যোগ করতে হবে। নিচের স্নিপেটে ডায়নামিক পার্টিশন কাজ করানোর জন্য আপডেট মেনিফেস্ট সংক্রান্ত অতিরিক্ত তথ্য দেখানো হয়েছে। প্রতিটি ফিল্ডের বিস্তারিত ডকুমেন্টেশনের জন্য update_metadata.proto দেখুন।

message DeltaArchiveManifest {
    optional DynamicPartitionMetadata dynamic_partition_metadata;
}

message DynamicPartitionMetadata {
    repeated DynamicPartitionGroup groups;
}

message DynamicPartitionGroup {
    required string name;
    optional uint64 size; // maximum size of group
    repeated string partition_names;
}