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

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

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

پیشینه

یک پارتیشن super روی دستگاه وجود دارد. این پارتیشن پسوند اسلات ندارد. دستگاه بلوک باید همراه با ورودی blk_device برای /misc در fstab وجود داشته باشد. برای مثال، اگر فایل fstab موارد زیر را فهرست کند:

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

سپس دستگاه بلوکی مربوط به super باید در /dev/block/bootdevice/by-name/super وجود داشته باشد، اما نیازی نیست که پارتیشن super در فایل fstab فهرست شده باشد.

در پارتیشن super ، دو اسلات فراداده وجود دارد که با شماره‌های ۰ و ۱ شماره‌گذاری شده‌اند و مربوط به اسلات‌های A/B برای پارتیشن‌ها هستند. در این صفحه، اسلات‌های فراداده، Metadata S (منبع) و Metadata T (هدف) نامیده می‌شوند. به طور مشابه، پارتیشن‌ها با نام‌های system_s ، vendor_t و غیره شناخته می‌شوند.

قبل از ارتقا، Metadata S شامل اطلاعات مربوط به پارتیشن‌های پویای مورد استفاده (معمولاً system_s ، vendor_s ، product_s و غیره) است. سیستم در طول به‌روزرسانی، فضای ذخیره‌سازی این پارتیشن‌ها را می‌خواند، بنابراین نمی‌توان آنها را حذف کرد.

پارتیشن‌ها به گروه‌های به‌روزرسانی تعلق دارند. برای جزئیات بیشتر به پیاده‌سازی پارتیشن‌های پویا مراجعه کنید.

نمونه‌ای از فراداده‌ها روی یک دستگاه به شرح زیر است.

  • فراداده 0
    • گروه foo_a
      • system_a پارتیشن_a
      • پارتیشن‌بندی product_services_a
      • پارتیشن‌های دیگر توسط فو به‌روزرسانی شدند
    • نوار گروهی_a
      • vendor_a پارتیشن_a
      • product_a پارتیشن_a
      • پارتیشن‌های دیگر توسط Bar به‌روزرسانی شدند
    • گروه foo_b (باقیمانده از ارتقاء قبلی)
    • گروه bar_b (باقیمانده از ارتقاء قبلی)
  • فراداده ۱
    • گروه foo_a (باقیمانده از ارتقاء قبلی)
    • گروه bar_a (باقیمانده از ارتقاء قبلی)
    • گروه foo_b
      • system_b پارتیشن_ب
      • پارتیشن بندی product_services_b
      • پارتیشن‌های دیگر توسط فو به‌روزرسانی شدند
    • bar_b گروه
      • vendor_b پارتیشن_ب
      • product_b پارتیشن_ب
      • پارتیشن‌های دیگر توسط Bar به‌روزرسانی شدند

شما می‌توانید از ابزار 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. محدوده‌های مربوط به پارتیشن‌های پویای منبع را از فراداده S بارگذاری کنید. فرض کنید M فراداده بارگذاری شده باشد.
    2. گروه‌ها و پارتیشن‌های هدف (برای مثال، foo_t ، bar_t ) را از M حذف کنید تا M فقط شامل پارتیشن‌ها و گروه‌هایی با پسوند _s باشد.
    3. گروه‌های هدف و پارتیشن‌ها را طبق فیلد dynamic_partition_metadata در فایل به‌روزرسانی مانیفست اضافه کنید.
      اندازه هر پارتیشن را می‌توان در new_partition_info یافت.
    4. M را در متادیتای T بنویسید.
    5. پارتیشن‌های اضافه شده را روی نگاشتگر دستگاه به عنوان قابل نوشتن نگاشت کنید.
  2. به‌روزرسانی را روی دستگاه‌های بلوک اعمال کنید.
    1. در صورت لزوم، پارتیشن‌های منبع را در نگاشت‌گر دستگاه به صورت فقط خواندنی نگاشت کنید. این برای بارگذاری جانبی ضروری است زیرا پارتیشن‌های منبع قبل از به‌روزرسانی نگاشت نمی‌شوند.
    2. یک به‌روزرسانی کامل یا دلتا را روی تمام دستگاه‌های بلوک در اسلات هدف اعمال کنید.
    3. برای اجرای اسکریپت پس از نصب، پارتیشن‌ها را mount کنید و سپس پارتیشن‌ها را unmount کنید.
  3. پارتیشن‌های هدف را از حالت نگاشت خارج کنید.

قبل و بعد از به‌روزرسانی، ویژگی‌های سیستم زیر باید مقادیر مربوطه را داشته باشند:

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

اضافه کردن گروه‌ها و پارتیشن‌ها به فایل به‌روزرسانی manifest

هنگام انجام به‌روزرسانی OTA روی یک دستگاه A/B با پارتیشن‌های پویا، یا یک دستگاه 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;
}