Mengimplementasikan A/B Virtual

Untuk menerapkan A/B virtual di perangkat baru, atau untuk menyesuaikan perangkat yang diluncurkan, Anda harus membuat perubahan pada kode khusus perangkat.

Flag build

Perangkat yang menggunakan A/B virtual harus dikonfigurasi sebagai perangkat A/B dan harus diluncurkan dengan partisi dinamis.

Untuk perangkat yang diluncurkan dengan A/B virtual, tetapkan perangkat tersebut untuk mewarisi konfigurasi dasar perangkat A/B virtual:

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)

Perangkat yang diluncurkan dengan A/B virtual hanya memerlukan ukuran papan dua kali lebih kecil untuk BOARD_SUPER_PARTITION_SIZE karena slot B tidak lagi ada di super. Artinya, BOARD_SUPER_PARTITION_SIZE harus lebih besar dari atau sama dengan sum(size of update groups) + overhead, yang pada gilirannya harus lebih besar dari atau sama dengan sum(size of partitions) + overhead.

Untuk Android 13 dan yang lebih tinggi, guna mengaktifkan snapshot terkompresi dengan A/B Virtual, teruskan konfigurasi dasar berikut:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)

Hal ini memungkinkan snapshot ruang pengguna dengan A/B Virtual saat menggunakan metode kompresi no-op. Kemudian, Anda dapat mengonfigurasi metode kompresi ke salah satu metode yang didukung,zstd dan lz4. Untuk Android 15, kompresi dapat disesuaikan lebih lanjut agar sesuai dengan kebutuhan perangkat. Untuk informasi lebih lanjut, lihat Penyesuaian kompresi.

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

Untuk Android 12, guna mengaktifkan snapshot terkompresi dengan A/B Virtual, teruskan konfigurasi dasar berikut:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)

Kompresi XOR

Untuk perangkat yang diupgrade ke Android 13 dan yang lebih tinggi, fitur kompresi XOR tidak diaktifkan secara default. Untuk mengaktifkan kompresi XOR, tambahkan kode berikut ke file .mk perangkat.

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

Kompresi XOR diaktifkan secara default untuk perangkat yang diwarisi dari android_t_baseline.mk.

Penggabungan ruang pengguna

Dalam Virtual A/B versi modern (Android T dan yang lebih baru), proses penggabungan snapshot terjadi sepenuhnya di userspace. Perubahan ini dimungkinkan oleh snapuserd dan dm-user. Perangkat yang diluncurkan dengan Android 13 dan yang lebih tinggi mengaktifkan penggabungan ruang pengguna secara default dan untuk perangkat lama yang melakukan upgrade, properti ini dapat disetel dengan perintah berikut:

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

HAL kontrol booting

HAL kontrol booting menyediakan antarmuka bagi klien OTA untuk mengontrol slot booting. A/B Virtual memerlukan upgrade versi kecil HAL kontrol booting karena API tambahan diperlukan untuk memastikan bootloader dilindungi selama flashing atau reset ke setelan pabrik. Lihat IBootControl.hal dan types.hal untuk definisi HAL versi terbaru.

// 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
}

Perubahan Fstab

Integritas partisi metadata sangat penting untuk proses booting, terutama tepat setelah update OTA diterapkan. Jadi, partisi metadata harus diperiksa sebelum first_stage_init memasangnya. Untuk memastikan hal ini terjadi, tambahkan flag fs_mgr check ke entri untuk /metadata. Berikut adalah contohnya:

/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check

Persyaratan kernel

Untuk mengaktifkan pengambilan snapshot, tetapkan CONFIG_DM_SNAPSHOT ke true.

Untuk perangkat yang menggunakan F2FS, sertakan flag f2fs: export FS_NOCOW_FL flag to user patch kernel untuk memperbaiki penyematan file. Sertakan patch kernel f2fs: support aligned pinned file juga.

A/B Virtual mengandalkan fitur yang ditambahkan di kernel versi 4.3: bit status overflow di target snapshot dan snapshot-merge. Semua perangkat yang diluncurkan dengan Android 9 dan yang lebih baru seharusnya sudah memiliki kernel versi 4.4 atau yang lebih baru.

Untuk mengaktifkan snapshot terkompresi, versi kernel minimum yang didukung adalah 4.19. Tetapkan CONFIG_DM_USER=m atau CONFIG_DM_USER=y. Jika menggunakan yang pertama (modul), modul harus dimuat di ramdisk tahap pertama. Hal ini dapat dilakukan dengan menambahkan baris berikut ke Makefile perangkat:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Perubahan alat fastboot

Android 11 membuat perubahan berikut pada protokol fastboot:

  • getvar snapshot-update-status — Menampilkan nilai yang dikomunikasikan HAL kontrol booting ke bootloader:
    • Jika statusnya MERGING, bootloader harus menampilkan merging.
    • Jika statusnya SNAPSHOTTED, bootloader harus menampilkan snapshotted.
    • Jika tidak, bootloader harus menampilkan none.
  • snapshot-update merge — Menyelesaikan operasi penggabungan, melakukan booting ke recovery/fastbootd jika perlu. Perintah ini hanya valid jika snapshot-update-status adalah merging, dan hanya didukung di fastbootd.
  • snapshot-update cancel — Menetapkan status penggabungan HAL kontrol booting ke CANCELLED. Perintah ini tidak valid saat perangkat terkunci.
  • erase atau wipeerase atau wipe dari metadata, userdata, atau partisi yang menyimpan status penggabungan untuk HAL kontrol booting harus memeriksa status penggabungan snapshot. Jika statusnya MERGING atau SNAPSHOTTED, perangkat harus membatalkan operasi.
  • set_active — Perintah set_active yang mengubah slot aktif harus memeriksa status penggabungan snapshot. Jika statusnya adalah MERGING, perangkat harus membatalkan operasi. Slot dapat diubah dengan aman dalam status SNAPSHOTTED.

Perubahan ini dirancang untuk mencegah perangkat tidak dapat di-boot secara tidak sengaja, tetapi dapat mengganggu alat otomatis. Jika perintah digunakan sebagai komponen untuk mem-flash semua partisi, seperti menjalankan fastboot flashall, sebaiknya gunakan alur berikut:

  1. Kueri getvar snapshot-update-status.
  2. Jika merging atau snapshotted, keluarkan snapshot-update cancel.
  3. Lanjutkan dengan langkah-langkah flashing.

Mengurangi persyaratan penyimpanan

Perangkat yang tidak memiliki alokasi penyimpanan A/B penuh di super, dan diharapkan menggunakan /data sesuai kebutuhan, sangat disarankan untuk menggunakan alat pemetaan blok. Alat pemetaan blok menjaga alokasi blok tetap konsisten di antara build, sehingga mengurangi penulisan yang tidak perlu ke snapshot. Hal ini didokumentasikan dalam Mengurangi Ukuran OTA.

Algoritma kompresi OTA

Paket OTA dapat disesuaikan untuk berbagai metrik performa. Android menyediakan beberapa metode kompresi yang didukung (lz4, zstd, dan none) yang memiliki pertimbangan antara waktu penginstalan, penggunaan ruang COW, waktu booting, dan waktu penggabungan snapshot. Opsi default yang diaktifkan untuk ab virtual dengan kompresi adalah lz4 compression method.

Menyesuaikan kompresi

Algoritma kompresi dapat disesuaikan lebih lanjut melalui dua metode: (tingkat kompresi) (jumlah kompresi yang dicapai dengan mengorbankan kecepatan) dan (faktor kompresi) (ukuran jendela yang dapat dikompresi maksimum). Tingkat kompresi tersedia untuk algoritma tertentu seperti zstd, dan mengubah tingkat ini akan menimbulkan pertukaran antara kecepatan dan rasio kompresi. Faktor kompresi menjelaskan ukuran jendela kompresi maksimum yang digunakan selama penginstalan OTA. Defaultnya ditetapkan pada 64k, tetapi dapat diganti dengan menyesuaikan parameter build PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR. Faktor kompresi yang didukung adalah 4k, 8k, 16k, 32k, 64k, 128k, dan 256k.

PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

OTA inkremental di Pixel 8 Pro

Waktu penginstalan tanpa tahap postinstall Penggunaan Ruang Kerja Sama Waktu booting setelah OTA Waktu penggabungan snapshot
lz4 18 mnt 15 dtk 2,5 GB 32,7 dtk 98,6 dtk
zstd 24 mnt 49 dtk 2,05 GB 36,3 dtk 133,2 dtk
none 16 mnt 42 dtk 4,76 GB 28,7 detik 76,6 dtk

OTA Penuh di Pixel 8 Pro

Waktu penginstalan tanpa tahap postinstall Penggunaan Ruang Kerja Sama Waktu booting setelah OTA Waktu penggabungan snapshot
lz4 15 mnt 11 dtk 4,16 GB 17,6 detik 82,2 detik
zstd 16 mnt 19 dtk 3,46 GB 21,0 detik 106,3 dtk
none 13 mnt 33 dtk 6,39 GB 18,5 detik 92,5 detik