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 menampilkanmerging
. - Jika statusnya
SNAPSHOTTED
, bootloader harus menampilkansnapshotted
. - Jika tidak, bootloader harus menampilkan
none
.
- Jika statusnya
snapshot-update merge
— Menyelesaikan operasi penggabungan, yang melakukan booting ke pemulihan/fastbootd jika diperlukan. Perintah ini hanya valid jikasnapshot-update-status
adalahmerging
, dan hanya didukung dalam mode fastboot.snapshot-update cancel
— Menetapkan status penggabungan HAL kontrol booting keCANCELLED
. Perintah ini tidak valid saat perangkat terkunci.erase
atauwipe
—erase
atauwipe
darimetadata
,userdata
, atau partisi yang menyimpan status penggabungan untuk HAL kontrol booting harus memeriksa status penggabungan snapshot. Jika statusnyaMERGING
atauSNAPSHOTTED
, perangkat harus membatalkan operasi.set_active
— Perintahset_active
yang mengubah slot aktif harus memeriksa status penggabungan snapshot. Jika statusnyaMERGING
, perangkat harus membatalkan operasi. Slot dapat diubah dengan aman dalam statusSNAPSHOTTED
.
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:
- Kueri
getvar snapshot-update-status
. - Jika
merging
atausnapshotted
, terbitkansnapshot-update cancel
. - 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 |