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 menampilkanmerging
. - Jika statusnya
SNAPSHOTTED
, bootloader harus menampilkansnapshotted
. - Jika tidak, bootloader harus menampilkan
none
.
- Jika statusnya
snapshot-update merge
— Menyelesaikan operasi penggabungan, melakukan booting ke recovery/fastbootd jika perlu. Perintah ini hanya valid jikasnapshot-update-status
adalahmerging
, dan hanya didukung di fastbootd.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 statusnya adalahMERGING
, perangkat harus membatalkan operasi. Slot dapat diubah dengan aman dalam statusSNAPSHOTTED
.
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:
- Kueri
getvar snapshot-update-status
. - Jika
merging
atausnapshotted
, keluarkansnapshot-update cancel
. - 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 |