Mengimplementasikan A/B Virtual

Untuk menerapkan A/B virtual di perangkat baru, atau untuk melakukan retrofit pada 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, setel 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 setengah ukuran board untuk BOARD_SUPER_PARTITION_SIZE karena slot B tidak lagi dalam 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 baru, guna mengaktifkan snapshot yang dikompresi dengan Virtual A/B, warisi 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 Virtual A/B saat menggunakan metode kompresi tanpa operasi. 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 mengetahui informasi selengkapnya, lihat Kompresi tuning presisi.

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

Untuk Android 12, guna mengaktifkan snapshot terkompresi dengan Virtual A/B, warisi 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 baru, 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 mewarisi dari android_t_baseline.mk.

Penggabungan userspace

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

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

HAL kontrol booting

Boot control HAL menyediakan antarmuka bagi klien OTA untuk mengontrol slot booting. A/B virtual memerlukan upgrade versi minor HAL kontrol booting karena API tambahan diperlukan untuk memastikan bootloader dilindungi selama flashing atau reset pabrik. Lihat IBootControl.hal dan types.hal untuk mengetahui versi terbaru definisi 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
}

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 pembuatan snapshot, tetapkan CONFIG_DM_SNAPSHOT ke true.

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

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

Untuk mengaktifkan snapshot yang dikompresi, 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 oleh 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, yang melakukan booting ke pemulihan/fastbootd jika diperlukan. Perintah ini hanya valid jika snapshot-update-status adalah merging, dan hanya didukung dalam mode fastboot.
  • 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 MERGING, perangkat harus membatalkan operasi. Slot dapat diubah dengan aman dalam status SNAPSHOTTED.

Perubahan ini dirancang untuk mencegah perangkat tidak dapat di-booting secara tidak sengaja, tetapi dapat mengganggu alat otomatis. Jika perintah ini 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, terbitkan snapshot-update cancel.
  3. Lanjutkan dengan melakukan flash.

Mengurangi persyaratan penyimpanan

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

Algoritma kompresi OTA

Paket OTA dapat disesuaikan untuk metrik performa yang berbeda. Android menyediakan beberapa metode kompresi yang didukung (lz4, zstd, dan none) yang memiliki kompromi 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 kompresi maksimum). Tingkat kompresi tersedia untuk algoritma tertentu seperti zstd, dan mengubah tingkat akan menimbulkan kompromi 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 4k, 8k, 16k, 32k, 64k, 128k, dan 256k.

PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

OTA inkremental di Pixel 8 Pro

Waktu penginstalan tanpa fase pasca-penginstalan Penggunaan Ruang COW Waktu booting pasca-OTA Waktu penggabungan snapshot
lz4 18 menit 15 detik 2,5 GB 32,7 detik 98,6 detik
zstd 24 mnt 49 dtk 2,05 GB 36,3 detik 133,2 detik
none 16 mnt 42 dtk 4,76 GB 28,7 detik 76,6 detik

OTA Lengkap di Pixel 8 Pro

Waktu penginstalan tanpa fase pasca-penginstalan Penggunaan Ruang COW Waktu booting pasca-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 dtk 106,3 detik
none 13 mnt 33 dtk 6,39 GB 18,5 detik 92,5 detik