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, 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 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 informasi selengkapnya, lihat Menyesuaikan kompresi.

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 ruang pengguna

Dalam Virtual A/B versi modern (Android T dan yang lebih baru), proses penggabungan ringkasan 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

HAL kontrol boot 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.

Virtual A/B mengandalkan 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 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 diperlukan. 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 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. Saat perintah digunakan sebagai komponen flashing 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 langkah-langkah flashing.

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, sehingga mengurangi penulisan yang tidak perlu ke snapshot. Hal ini didokumentasikan di bagian 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 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

Algoritme kompresi dapat disesuaikan lebih lanjut melalui dua metode: (compression level) (jumlah kompresi yang dicapai dengan mengorbankan kecepatan) dan (compression factor) (ukuran jendela maksimum yang dapat dikompresi). 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. Setelan default ditetapkan ke 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 detik 106,3 detik
none 13 mnt 33 dtk 6,39 GB 18,5 detik 92,5 detik