پیاده‌سازی آزمایش مجازی A/B

برای پیاده‌سازی 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 دیگر در سوپر نیستند. یعنی، BOARD_SUPER_PARTITION_SIZE باید بزرگ‌تر یا مساوی با مجموعه(اندازه گروه‌های به‌روزرسانی) + سربار باشد، که به نوبه خود باید بزرگ‌تر یا مساوی با مجموعه(اندازه پارتیشن‌ها) + سربار باشد.

برای Android 13 و بالاتر، برای فعال کردن نماعکس‌های فشرده با «مجازی 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 هنگام استفاده از روش فشرده‌سازی no-op فعال می‌کند. سپس می‌توانید روش فشرده‌سازی را روی یکی از روش‌های پشتیبانی‌شده، zstd و lz4، پیکربندی کنید. برای Android 15، فشرده‌سازی را می‌توان بیشتر سفارشی‌سازی کرد تا با نیازهای دستگاه مطابقت داشته باشد. برای اطلاعات بیشتر، تنظیم دقیق فشرده‌سازی را ببینید.

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

برای Android 12، برای فعال کردن عکس‌های آنی فشرده‌شده با 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

برای دستگاه‌هایی که به Android 13 و بالاتر ارتقا می‌یابند، ویژگی فشرده‌سازی XOR به‌طور پیش‌فرض فعال نیست. برای فعال کردن فشرده‌سازی XOR، موارد زیر را به فایل .mk دستگاه اضافه کنید.

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true

فشرده‌سازی XOR به‌طور پیش‌فرض برای دستگاه‌هایی که از android_t_baseline.mk ارث‌بری می‌کنند فعال است.

ادغام فضای کاربر

در نسخه مدرن Virtual A/B (Android T و نسخه‌های جدیدتر)، فرایند ادغام عکس آنی کاملاً در فضای کاربر اتفاق می‌افتد. این تغییر با کمک snapuserd و dm-user امکان‌پذیر شده است. دستگاه‌هایی که با Android 13 و بالاتر عرضه می‌شوند، به‌طور پیش‌فرض ادغام فضای کاربر را فعال کرده‌اند و برای ارتقای دستگاه‌های قدیمی‌تر، این ویژگی را می‌توان با موارد زیر تنظیم کرد:

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true

لایه انتزاع سخت‌افزار کنترل راه‌اندازی

boot control 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

الزامات هسته

برای فعال کردن عکس آنی، CONFIG_DM_SNAPSHOT را روی true تنظیم کنید.

برای دستگاه‌هایی که از F2FS استفاده می‌کنند، وصله هسته f2fs: export FS_NOCOW_FL flag to user را برای رفع مشکل سنجاق کردن فایل اضافه کنید. وصله هسته f2fs: support aligned pinned file را نیز اضافه کنید.

A/B مجازی به ویژگی‌های اضافه‌شده در نسخه هسته ۴.۳ متکی است: بیت وضعیت سرریز در هدف‌های snapshot و snapshot-merge. همه دستگاه‌هایی که با Android نسخه ۹ و بالاتر عرضه می‌شوند باید ازقبل نسخه هسته ۴.۴ یا بالاتر داشته باشند.

برای فعال کردن عکس‌های آنی فشرده‌شده، حداقل نسخه هسته پشتیبانی‌شده ۴.۱۹ است. CONFIG_DM_USER=m یا CONFIG_DM_USER=y را تنظیم کنید. اگر از مورد اول (یک ماژول) استفاده می‌کنید، ماژول باید در دیسک مجازی مرحله اول بار شود. این کار را می‌توانید با افزودن خط زیر به Makefile دستگاه انجام دهید:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

تغییرات ابزار Fastboot

‫Android 11 تغییرات زیر را در پروتکل fastboot ایجاد می‌کند:

  • getvar snapshot-update-status — مقداری را که boot control HAL به راه‌انداز سیستم اعلام کرده است برمی‌گرداند:
    • اگر وضعیت MERGING باشد، bootloader باید merging را برگرداند.
    • اگر وضعیت SNAPSHOTTED باشد، bootloader باید snapshotted را برگرداند.
    • درغیراین‌صورت، بارکننده باید none را برگرداند.
  • snapshot-update merge — عملیات ادغام را تکمیل می‌کند، درصورت لزوم به بازیابی/fastbootd بوت می‌شود. این فرمان فقط درصورتی معتبر است که snapshot-update-status merging باشد و فقط در fastbootd پشتیبانی می‌شود.
  • snapshot-update cancel — وضعیت ادغام HAL کنترل راه‌اندازی را روی CANCELLED تنظیم می‌کند. وقتی دستگاه قفل باشد، این فرمان نامعتبر است.
  • erase یا wipe — erase یا wipe از metadata، userdata، یا بخش‌بندی‌ای که وضعیت ادغام را برای HAL کنترل راه‌اندازی نگه می‌دارد باید وضعیت ادغام عکس آنی را بررسی کند. اگر وضعیت MERGING یا SNAPSHOTTED باشد، دستگاه باید عملیات را متوقف کند.
  • set_active — فرمان set_active که جایگاه فعال را تغییر می‌دهد باید وضعیت ادغام لحظه‌ای را بررسی کند. اگر وضعیت MERGING باشد، دستگاه باید عملیات را لغو کند. جایگاه را می‌توان به‌طور ایمن در وضعیت SNAPSHOTTED تغییر داد.

این تغییرات برای جلوگیری از غیرقابل‌راه‌اندازی شدن تصادفی دستگاه طراحی شده است، اما می‌تواند برای ابزارهای خودکارسازی‌شده اختلال ایجاد کند. وقتی از فرمان‌ها به‌عنوان جزء چشمک زدن همه پارتیشن‌ها استفاده می‌شود، مثلاً اجرای fastboot flashall، توصیه می‌شود از جریان زیر استفاده کنید:

  1. پُرسمان getvar snapshot-update-status.
  2. اگر merging یا snapshotted، snapshot-update cancel را صادر کنید.
  3. مراحل چشمک زدن را ادامه دهید.

کاهش دادن الزامات فضای ذخیره‌سازی

به دستگاه‌هایی که فضای ذخیره‌سازی کامل A/B در super به آن‌ها اختصاص داده نشده است و انتظار می‌رود درصورت لزوم از /data استفاده کنند، اکیداً توصیه می‌شود از ابزار نگاشت بلوک استفاده کنند. ابزار نگاشت بلوک تخصیص بلوک را بین ساخت‌ها یکسان نگه می‌دارد و نوشتن‌های غیرضروری در نمای لحظه‌ای را کاهش می‌دهد. این موضوع در کاهش اندازه OTA مستند شده است.

الگوریتم‌های فشرده‌سازی OTA

بسته‌های OTA را می‌توان برای سنجه‌های عملکرد مختلف تنظیم کرد. ‫Android چندین روش فشرده‌سازی پشتیبانی‌شده (lz4، zstd، و none) ارائه می‌دهد که بین زمان نصب، استفاده از فضای COW، زمان راه‌اندازی، و زمان ادغام تصویر لحظه‌ای معاوضه دارند. گزینه پیش‌فرض فعال‌شده برای ab مجازی با فشرده‌سازی lz4 compression method است.

درحال تنظیم دقیق فشرده‌سازی

الگوریتم‌های فشرده‌سازی را می‌توان ازطریق دو روش بیشتر سفارشی‌سازی کرد: (سطح فشرده‌سازی) (مقدار فشرده‌سازی که با هزینه سرعت به‌دست می‌آید) و (عامل فشرده‌سازی) (حداکثر اندازه پنجره فشرده‌سازی‌پذیر). سطح فشرده‌سازی برای برخی‌از الگوریتم‌ها مثل zstd دردسترس است و تغییر سطح باعث ایجاد موازنه بین سرعت و نسبت فشرده‌سازی می‌شود. عامل فشرده‌سازی حداکثر اندازه پنجره فشرده‌سازی را که درطول نصب OTA استفاده می‌شود توصیف می‌کند. مقدار پیش‌فرض روی ۶۴ هزار تنظیم شده است، اما با سفارشی‌سازی پارامتر ساخت PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR می‌توانید آن را ملغی کنید. عوامل فشرده‌سازی پشتیبانی‌شده 4k،‏ 8k،‏ 16k،‏ 32k،‏ 64k،‏ 128k، و 256k.

PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

به‌روزرسانی تدریجی ازطریق هوا در Pixel 8 Pro

زمان نصب بدون مرحله پس‌از نصب استفاده از فضای COW زمان راه‌اندازی پس‌از «به‌روزرسانی ازطریق هوا» زمان ادغام عکس آنی
lz4 ‫۱۸ دقیقه ۱۵ ثانیه ‫۲٫۵ گیگابایت ‫۳۲٫۷ ثانیه ‫۹۸٫۶ ثانیه
zstd ‫۲۴ دقیقه ۴۹ ثانیه ‫۲٫۰۵ گیگابایت ‫۳۶٫۳ ثانیه ‫۱۳۳.۲ ثانیه
هیچ‌کدام ۱۶ دقیقه ۴۲ ثانیه ‫۴٫۷۶ گیگابایت ۲۸٫۷ ثانیه ‫۷۶٫۶ ثانیه

OTA کامل در Pixel 8 Pro

زمان نصب بدون مرحله پس‌از نصب استفاده از فضای COW زمان راه‌اندازی پس‌از «به‌روزرسانی ازطریق هوا» زمان ادغام عکس آنی
lz4 ‫۱۵ دقیقه ۱۱ ثانیه ‫۴٫۱۶ گیگابایت ‫۱۷٫۶ ثانیه ‫۸۲٫۲ ثانیه
zstd ‫۱۶ دقیقه و ۱۹ ثانیه ۳٫۴۶ گیگابایت ‫۲۱.۰ ثانیه ۱۰۶٫۳ ثانیه
هیچ‌کدام ‫۱۳ دقیقه ۳۳ ثانیه ‫۶٫۳۹ گیگابایت ‫۱۸٫۵ ثانیه ‫۹۲٫۵ ثانیه