اندروید 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
جریان به روز رسانی
- فراداده پارتیشن
super
را راه اندازی کنید.- وسعت های پارتیشن های دینامیک منبع را از Metadata S بارگیری کنید. فرض کنید M ابرداده بارگذاری شده باشد.
- گروهها و پارتیشنهای هدف (مثلا
foo_t
،bar_t
) را از M حذف کنید تا M فقط شامل پارتیشنها و گروههایی با پسوند_s
باشد. - گروهها و پارتیشنهای هدف را مطابق فیلد
dynamic_partition_metadata
در مانیفست بهروزرسانی اضافه کنید.
اندازه هر پارتیشن را می توان درnew_partition_info
یافت. - M را در فراداده T بنویسید.
- پارتیشنهای اضافهشده را روی نقشهبردار دستگاه بهعنوان قابل نوشتن ترسیم کنید.
- به روز رسانی را روی دستگاه های بلوک اعمال کنید.
- در صورت لزوم، پارتیشنهای منبع را روی نقشهبردار دستگاه بهصورت فقط خواندنی نگاشت کنید. این برای بارگذاری جانبی ضروری است زیرا پارتیشن های منبع قبل از به روز رسانی نقشه برداری نمی شوند.
- بهروزرسانی کامل یا دلتا را برای همه دستگاههای بلوک در شکاف هدف اعمال کنید.
- پارتیشنها را برای اجرای اسکریپت پس از نصب نصب کنید و سپس پارتیشنها را جدا کنید.
- پارتیشن های مورد نظر را از نقشه بردارید.
قبل و بعد از بهروزرسانی، ویژگیهای سیستم زیر باید مقادیر مربوطه را داشته باشند:
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; }