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 و بالاتر، برای فعال کردن عکس‌های فوری فشرده با 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)

با استفاده از روش فشرده‌سازی بدون عملیات، عکس‌های فوری فضای کاربران را با A/B مجازی فعال می‌کند. سپس می توانید روش فشرده سازی را به یکی از روش های پشتیبانی شده، 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 امکان پذیر شده است. دستگاه‌هایی که با اندروید 13 و بالاتر راه‌اندازی می‌شوند به‌طور پیش‌فرض ادغام فضای کاربر فعال است و برای ارتقای دستگاه‌های قدیمی‌تر، این ویژگی را می‌توان با موارد زیر تنظیم کرد:

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

الزامات هسته

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

برای دستگاه‌هایی که از F2FS استفاده می‌کنند، f2fs را اضافه کنید: برای رفع پین کردن فایل، پرچم FS_NOCOW_FL را به وصله هسته کاربر صادر کنید . f2fs را نیز اضافه کنید: از وصله هسته فایل پین شده تراز شده نیز پشتیبانی کنید .

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

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

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

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

اندروید 11 تغییرات زیر را در پروتکل fastboot اعمال می کند:

  • getvar snapshot-update-status - مقداری را که کنترل بوت HAL به بوت لودر ارسال کرده است برمی‌گرداند:
    • اگر حالت MERGING باشد، بوت لودر باید merging برگرداند.
    • اگر وضعیت SNAPSHOTTED باشد، بوت لودر باید 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 را به صورت فوق‌العاده ندارند، و انتظار دارند در صورت لزوم /data استفاده کنند، اکیداً توصیه می‌شود از ابزار نقشه‌برداری بلوک استفاده کنند. ابزار نگاشت بلوک، تخصیص بلوک را بین ساخت‌ها ثابت نگه می‌دارد و نوشتن‌های غیر ضروری را در عکس فوری کاهش می‌دهد. این در زیر کاهش اندازه OTA مستند شده است.

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

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

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

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

PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

OTA افزایشی در Pixel 8 Pro

زمان نصب بدون مرحله پس از نصب استفاده از فضای گاو ارسال زمان بوت OTA زمان ادغام عکس فوری
lz4 18 دقیقه 15 ثانیه 2.5 گیگابایت 32.7 ثانیه 98.6 ثانیه
zstd 24 دقیقه و 49 ثانیه 2.05 گیگابایت 36.3 ثانیه 133.2 ثانیه
هیچ کدام 16 دقیقه و 42 ثانیه 4.76 گیگابایت 28.7 ثانیه 76.6 ثانیه

Full OTA در Pixel 8 Pro

زمان نصب بدون مرحله پس از نصب استفاده از فضای گاو ارسال زمان بوت OTA زمان ادغام عکس فوری
lz4 15 دقیقه 11 ثانیه 4.16 گیگابایت 17.6 ثانیه 82.2 ثانیه
zstd 16 دقیقه 19 ثانیه 3.46 گیگابایت 21.0 ثانیه 106.3 ثانیه
هیچ کدام 13 دقیقه و 33 ثانیه 6.39 گیگابایت 18.5 ثانیه 92.5 ثانیه