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

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

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

پس زمینه

یک پارتیشن 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 ، دو اسلات ابرداده با شماره 0 و 1 وجود دارد که مربوط به اسلات 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
      • سایر پارتیشن های به روز شده توسط Foo
    • گروه bar_a
      • پارتیشن vendor_a
      • Partition product_a
      • سایر پارتیشن های به روز شده توسط Bar
    • گروه foo_b (بازمانده از ارتقای قبلی)
    • گروه bar_b (بازمانده از ارتقای قبلی)
  • فراداده 1
    • گروه foo_a (بازمانده از ارتقای قبلی)
    • Group bar_a (leftover from previous upgrade)
    • گروه foo_b
      • system_b پارتیشن_ب
      • پارتیشن product_services_b
      • سایر پارتیشن های به روز شده توسط Foo
    • گروه 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. وسعت های پارتیشن های دینامیک منبع را از Metadata 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. پارتیشن‌ها را برای اجرای اسکریپت پس از نصب نصب کنید و سپس پارتیشن‌ها را جدا کنید.
  3. پارتیشن های مورد نظر را از نقشه بردارید.

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

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

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

هنگام انجام به‌روزرسانی 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;
}