برای پیادهسازی A/B مجازی روی یک دستگاه جدید یا برای بهروزرسانی دستگاه راهاندازیشده، باید تغییراتی در کد مخصوص دستگاه ایجاد کنید.
ساخت پرچم
دستگاههایی که از A/B مجازی استفاده میکنند باید به عنوان یک دستگاه A/B پیکربندی شوند و باید با پارتیشنهای پویا راهاندازی شوند .
برای دستگاههایی که با A/B مجازی راهاندازی میشوند، آنها را طوری تنظیم کنید که پیکربندی پایه دستگاه A/B مجازی را به ارث ببرند:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
دستگاههایی که با A/B مجازی راهاندازی میشوند، فقط به نصف اندازه برد برای BOARD_SUPER_PARTITION_SIZE نیاز دارند، زیرا اسلاتهای B دیگر در super نیستند. یعنی، BOARD_SUPER_PARTITION_SIZE باید بزرگتر یا مساوی sum(size of update groups) + overhead باشد، که به نوبه خود، باید بزرگتر یا مساوی sum(size of partitions) + overhead باشد.
برای اندروید ۱۳ و بالاتر، برای فعال کردن اسنپشاتهای فشرده با Virtual A/B، پیکربندی پایه زیر را به ارث ببرید:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)
این کار امکان گرفتن اسنپشات از فضای کاربری با Virtual A/B را در حین استفاده از روش فشردهسازی بدون عملیات فراهم میکند. سپس میتوانید روش فشردهسازی را روی یکی از روشهای پشتیبانیشده، zstd و lz4 پیکربندی کنید. برای اندروید ۱۵، فشردهسازی را میتوان بیشتر برای مطابقت با نیازهای دستگاه سفارشیسازی کرد. برای اطلاعات بیشتر، به بخش تنظیم دقیق فشردهسازی مراجعه کنید.
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
برای اندروید ۱۲، برای فعال کردن اسنپشاتهای فشرده با Virtual A/B، پیکربندی پایه زیر را به ارث ببرید:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
فشردهسازی XOR
برای دستگاههایی که به اندروید ۱۳ و بالاتر ارتقا مییابند، ویژگی فشردهسازی XOR به طور پیشفرض فعال نیست. برای فعال کردن فشردهسازی XOR، موارد زیر را به فایل .mk دستگاه اضافه کنید.
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true
فشردهسازی XOR به طور پیشفرض برای دستگاههایی که از android_t_baseline.mk ارثبری میکنند، فعال است.
ادغام فضای کاربری
در نسخه مدرن Virtual A/B (اندروید T و بعد از آن)، فرآیند ادغام snapshot کاملاً در فضای کاربری اتفاق میافتد. این تغییر توسط snapuserd و dm-user امکانپذیر است. دستگاههایی که با اندروید ۱۳ و بالاتر راهاندازی میشوند، ادغام فضای کاربری را به طور پیشفرض فعال دارند و برای ارتقاء دستگاههای قدیمیتر، این ویژگی را میتوان با موارد زیر تنظیم کرد:
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
کنترل بوت HAL
کنترل بوت HAL رابطی را برای کلاینتهای OTA فراهم میکند تا اسلاتهای بوت را کنترل کنند. A/B مجازی نیاز به یک ارتقاء جزئی نسخه از کنترل بوت HAL دارد زیرا APIهای اضافی برای اطمینان از محافظت از بوت لودر در طول فلش کردن یا تنظیم مجدد کارخانه مورد نیاز است. برای آخرین نسخه تعریف HAL به IBootControl.hal و types.hal مراجعه کنید.
// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };
// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
setSnapshotMergeStatus(MergeStatus status)
generates (bool success);
getSnapshotMergeStatus()
generates (MergeStatus status);
}
// Recommended implementation
Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
// Write value to persistent storage
// e.g. misc partition (using libbootloader_message)
// bootloader rejects wipe when status is SNAPSHOTTED
// or MERGING
}
تغییرات Fstab
یکپارچگی پارتیشن متادیتا برای فرآیند بوت ضروری است، به خصوص درست پس از اعمال بهروزرسانی OTA. بنابراین، پارتیشن متادیتا باید قبل از اینکه first_stage_init آن را مونت کند، بررسی شود. برای اطمینان از این اتفاق، پرچم check fs_mgr را به ورودی /metadata اضافه کنید. در زیر مثالی ارائه شده است:
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
الزامات هسته
برای فعال کردن snapshoting، CONFIG_DM_SNAPSHOT را روی true تنظیم کنید.
برای دستگاههایی که از F2FS استفاده میکنند، پرچم f2fs: export FS_NOCOW_FL را به پچ هسته کاربر اضافه کنید تا پین شدن فایل را برطرف کنید. پچ هسته فایل پین شده تراز شده f2fs: support را نیز اضافه کنید.
A/B مجازی به ویژگیهای اضافه شده در هسته نسخه ۴.۳ متکی است: بیت وضعیت سرریز در اهداف snapshot و snapshot-merge . همه دستگاههایی که با اندروید ۹ و بالاتر عرضه میشوند، باید از قبل هسته نسخه ۴.۴ یا بالاتر داشته باشند.
برای فعال کردن اسنپشاتهای فشرده، حداقل نسخه کرنل پشتیبانیشده ۴.۱۹ است. تنظیمات CONFIG_DM_USER=m یا CONFIG_DM_USER=y را تنظیم کنید. در صورت استفاده از حالت اول (یک ماژول)، ماژول باید در ramdisk مرحله اول بارگذاری شود. این کار را میتوان با اضافه کردن خط زیر به Makefile دستگاه انجام داد:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
تغییرات ابزار فستبوت
اندروید ۱۱ تغییرات زیر را در پروتکل فستبوت ایجاد میکند:
-
getvar snapshot-update-status— مقداری را که کنترل بوت HAL به بوت لودر ارسال کرده است، برمیگرداند:- اگر وضعیت در
MERGINGباشد، بوتلودر بایدmergingبرگرداند. - اگر وضعیت
SNAPSHOTTEDباشد، بوتلودر بایدsnapshottedبرگرداند. - در غیر این صورت، بوت لودر باید
noneبرگرداند.
- اگر وضعیت در
-
snapshot-update merge— عملیات ادغام را تکمیل میکند و در صورت لزوم به recovery/fastbootd بوت میشود. این دستور فقط در صورتی معتبر است کهsnapshot-update-statusmergingباشد و فقط در fastbootd پشتیبانی میشود. -
snapshot-update cancel— وضعیت ادغام کنترل بوت HAL را رویCANCELLEDتنظیم میکند. این دستور هنگام قفل بودن دستگاه نامعتبر است. -
eraseیاwipe-eraseیاwipemetadata،userdataیا پارتیشنی که وضعیت ادغام را برای کنترل بوت نگه میدارد. HAL باید وضعیت ادغام snapshot را بررسی کند. اگر وضعیتMERGINGیاSNAPSHOTTEDباشد، دستگاه باید عملیات را متوقف کند. -
set_active— دستورset_activeکه اسلات فعال را تغییر میدهد، باید وضعیت ادغام اسنپشات را بررسی کند. اگر وضعیت در حالتMERGINGباشد، دستگاه باید عملیات را متوقف کند. اسلات را میتوان با خیال راحت در حالتSNAPSHOTTEDتغییر داد.
این تغییرات برای جلوگیری از بوت نشدن تصادفی دستگاه طراحی شدهاند، اما میتوانند برای ابزارهای خودکار اختلال ایجاد کنند. هنگامی که از این دستورات به عنوان جزئی از فلش کردن تمام پارتیشنها استفاده میشود، مانند اجرای fastboot flashall ، توصیه میشود از روند زیر استفاده کنید:
- کوئری
getvar snapshot-update-status. - اگر
mergingیاsnapshottedهستید،snapshot-update cancelاجرا کنید. - مراحل فلش کردن را ادامه دهید.
کاهش نیازهای ذخیرهسازی
به دستگاههایی که فضای ذخیرهسازی A/B کامل در super ندارند و انتظار دارند در صورت لزوم از /data استفاده کنند، اکیداً توصیه میشود از ابزار نگاشت بلوک استفاده کنند. ابزار نگاشت بلوک، تخصیص بلوک را بین ساختها ثابت نگه میدارد و نوشتنهای غیرضروری در snapshot را کاهش میدهد. این موضوع در بخش کاهش اندازه OTA مستند شده است.
الگوریتمهای فشردهسازی OTA
بستههای OTA را میتوان برای معیارهای عملکرد مختلف تنظیم کرد. اندروید چندین روش فشردهسازی پشتیبانیشده ( lz4 ، zstd و none ) را ارائه میدهد که بین زمان نصب، استفاده از فضای COW، زمان بوت و زمان ادغام snapshot، تعادل برقرار میکنند. گزینه پیشفرض فعالشده برای ab مجازی با فشردهسازی، lz4 compression method است.
فشردهسازی با تنظیم دقیق
الگوریتمهای فشردهسازی را میتوان از طریق دو روش بیشتر سفارشیسازی کرد: ( سطح فشردهسازی ) (میزان فشردهسازی حاصلشده با هزینه سرعت) و ( ضریب فشردهسازی ) (حداکثر اندازه پنجره قابل فشردهسازی). سطح فشردهسازی برای الگوریتمهای خاصی مانند zstd در دسترس است و تغییر سطح، باعث ایجاد تعادل بین سرعت و نسبت فشردهسازی میشود. ضریب فشردهسازی، حداکثر اندازه پنجره فشردهسازی مورد استفاده در طول نصب OTA را توصیف میکند. مقدار پیشفرض روی ۶۴ کیلوبایت تنظیم شده است، اما میتوان با سفارشیسازی پارامتر ساخت PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR آن را لغو کرد. ضرایب فشردهسازی پشتیبانیشده ۴k، ۸k، ۱۶k، ۳۲k، ۶۴k، ۱۲۸k و ۲۵۶k هستند.
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
OTA افزایشی در پیکسل ۸ پرو
| زمان نصب بدون مرحله پس از نصب | استفاده از فضای گاو | زمان بوت شدن پس از OTA | زمان ادغام اسنپشات | |
|---|---|---|---|---|
| lz4 | ۱۸ دقیقه و ۱۵ ثانیه | ۲.۵ گیگابایت | ۳۲.۷ ثانیه | ۹۸.۶ ثانیه |
| زستد | ۲۴ دقیقه و ۴۹ ثانیه | ۲.۰۵ گیگابایت | ۳۶.۳ ثانیه | ۱۳۳.۲ ثانیه |
| هیچ کدام | ۱۶ دقیقه و ۴۲ ثانیه | ۴.۷۶ گیگابایت | ۲۸.۷ ثانیه | ۷۶.۶ ثانیه |
OTA کامل روی پیکسل ۸ پرو
| زمان نصب بدون مرحله پس از نصب | استفاده از فضای گاو | زمان بوت شدن پس از OTA | زمان ادغام اسنپشات | |
|---|---|---|---|---|
| lz4 | ۱۵ دقیقه و ۱۱ ثانیه | ۴.۱۶ گیگابایت | ۱۷.۶ ثانیه | ۸۲.۲ ثانیه |
| زستد | ۱۶ دقیقه و ۱۹ ثانیه | ۳.۴۶ گیگابایت | ۲۱.۰ ثانیه | ۱۰۶.۳ ثانیه |
| هیچ کدام | ۱۳ دقیقه و ۳۳ ثانیه | ۶.۳۹ گیگابایت | ۱۸.۵ ثانیه | ۹۲.۵ ثانیه |