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

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

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

پس‌زمینه

یک پارتیشن 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 برای بخش‌ها مطابقت دارند. در این صفحه، جایگاه‌های فراداده «فراداده S» (منبع) و «فراداده T» (هدف) نامیده می‌شوند. به‌طور مشابه، پارتیشن‌ها به‌صورت system_s، vendor_t، و غیره نامیده می‌شوند.

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

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

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

  • فراداده 0
    • گروه foo_a
      • پارتیشن system_a
      • پارتیشن product_services_a
      • بخش‌های دیگر به‌روزرسانی‌شده توسط Foo
    • گروه bar_a
      • پارتیشن vendor_a
      • پارتیشن product_a
      • سایر بخش‌ها توسط Bar به‌روزرسانی شد
    • گروه foo_b (باقی‌مانده از ارتقای قبلی)
    • گروه bar_b (باقی‌مانده از ارتقای قبلی)
  • فراداده ۱
    • گروه foo_a (باقیمانده از ارتقای قبلی)
    • گروه bar_a (باقی‌مانده از ارتقای قبلی)
    • گروه 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. بار کردن حدود پارتیشن‌های پویای منبع از فراداده 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;
}