Untuk menerapkan A/B virtual pada perangkat baru, atau untuk memasang kembali perangkat yang diluncurkan, Anda harus membuat perubahan pada kode khusus perangkat.
Bangun bendera
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 agar mewarisi konfigurasi basis perangkat A/B virtual:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
Perangkat yang diluncurkan dengan A/B virtual hanya membutuhkan setengah ukuran papan untuk BOARD_SUPER_PARTITION_SIZE
karena slot B tidak lagi dalam ukuran 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 mengaktifkan snapshot terkompresi dengan Virtual A/B, sebagai gantinya mewarisi konfigurasi dasar berikut:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
Kontrol boot HAL
Kontrol boot HAL menyediakan antarmuka bagi klien OTA untuk mengontrol slot boot. Virtual A/B memerlukan pemutakhiran versi kecil dari HAL kontrol boot karena API tambahan diperlukan untuk memastikan bootloader terlindungi selama flashing/reset pabrik. Lihat IBootControl.hal dan types.hal untuk versi terbaru dari 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 boot, terutama setelah pembaruan OTA diterapkan. Jadi, partisi metadata harus diperiksa sebelum first_stage_init
memasangnya. Untuk memastikan hal ini terjadi, tambahkan tanda check
fs_mgr ke entri untuk /metadata
. Berikut ini memberikan contoh:
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
Persyaratan kernel
Untuk mengaktifkan snapshotting, setel CONFIG_DM_SNAPSHOT
ke true
.
Untuk perangkat yang menggunakan F2FS, sertakan f2fs: export flag FS_NOCOW_FL ke patch kernel pengguna untuk memperbaiki pin file. Sertakan f2fs: mendukung patch kernel file yang disematkan juga.
Virtual A/B bergantung pada fitur yang ditambahkan di kernel versi 4.3: bit status overflow dalam 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. Setel CONFIG_DM_USER=m
atau CONFIG_DM_USER=y
. Jika menggunakan yang pertama (modul), modul harus dimuat di ramdisk tahap pertama. Ini dapat dicapai dengan menambahkan baris berikut ke perangkat Makefile:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
Perkuatan pada perangkat yang ditingkatkan ke Android 11
Saat memutakhirkan ke Android 11, perangkat yang diluncurkan dengan partisi dinamis dapat secara opsional memasang kembali A/B virtual. Proses pembaruan sebagian besar sama dengan peluncuran perangkat dengan A/B virtual, dengan beberapa perbedaan kecil:
Lokasi file COW — Untuk perangkat peluncuran, klien OTA menggunakan semua ruang kosong yang tersedia di partisi super sebelum menggunakan ruang di
/data
. Untuk perangkat retrofit, selalu ada cukup ruang di partisi super sehingga file COW tidak pernah dibuat di/data
.Tanda fitur waktu pembuatan — Untuk perkuatan perangkat virtual A/B,
PRODUCT_VIRTUAL_AB_OTA
danPRODUCT_VIRTUAL_AB_OTA_RETROFIT
disetel ketrue
, seperti yang ditunjukkan di bawah ini:(call inherit-product, \
(SRC_TARGET_DIR)/product/virtual_ab_ota_retrofit.mk)
Ukuran partisi super — Perangkat yang diluncurkan dengan A/B virtual dapat memotong
BOARD_SUPER_PARTITION_SIZE
dua karena slot B tidak ada di partisi super. Perangkat perkuatan virtual A/B mempertahankan ukuran partisi super lama, sehinggaBOARD_SUPER_PARTITION_SIZE
lebih besar dari atau sama dengan 2 * sum(ukuran grup pembaruan) + overhead , yang pada gilirannya lebih besar dari atau sama dengan 2 * sum(ukuran partisi) + overhead .
Perubahan bootloader
Selama langkah penggabungan pembaruan, /data
menyimpan satu-satunya contoh OS Android secara keseluruhan. Setelah migrasi dimulai, system
asli , vendor
, dan partisi product
tidak lengkap hingga penyalinan selesai. Jika perangkat dikembalikan ke setelan pabrik selama proses ini, baik dengan pemulihan atau melalui dialog Pengaturan sistem, maka perangkat tidak akan dapat di-boot.
Sebelum menghapus /data
, selesaikan penggabungan dalam pemulihan atau kembalikan tergantung pada status perangkat:
- Jika build baru berhasil di-boot sebelumnya, selesaikan migrasi.
- Jika tidak, kembalikan ke slot lama:
- Untuk partisi dinamis, putar kembali ke keadaan sebelumnya.
- Untuk partisi statis, setel slot aktif ke slot lama.
Bootloader dan fastbootd
dapat menghapus partisi /data
jika perangkat tidak terkunci. Sementara fastbootd
dapat memaksa migrasi untuk diselesaikan, bootloader tidak bisa. Bootloader tidak tahu apakah penggabungan sedang berlangsung atau tidak, atau blok apa di /data
yang merupakan partisi OS. Perangkat harus mencegah pengguna secara tidak sadar membuat perangkat tidak dapat dioperasikan (bricking) dengan melakukan hal berikut:
- Terapkan HAL kontrol boot sehingga bootloader dapat membaca nilai yang ditetapkan oleh metode
setSnapshotMergeStatus()
. - Jika status penggabungan adalah
MERGING
, atau jika status penggabungan adalahSNAPSHOTTED
dan slot telah berubah menjadi slot yang baru diperbarui, maka permintaan untuk menghapusmetadata
userdata
atau partisi yang menyimpan status penggabungan harus ditolak di bootloader. - Terapkan perintah
fastboot snapshot-update cancel
sehingga pengguna dapat memberi sinyal ke bootloader bahwa mereka ingin melewati mekanisme perlindungan ini. - Ubah alat atau skrip flash khusus untuk mengeluarkan
fastboot snapshot-update cancel
flash seluruh perangkat. Ini aman untuk dikeluarkan karena mem-flash seluruh perangkat menghilangkan OTA. Tooling dapat mendeteksi perintah ini saat runtime dengan mengimplementasikanfastboot getvar snapshot-update-status
. Perintah ini membantu membedakan antara kondisi kesalahan.
Contoh
struct VirtualAbState {
uint8_t StructVersion;
uint8_t MergeStatus;
uint8_t SourceSlot;
};
bool ShouldPreventUserdataWipe() {
VirtualAbState state;
if (!ReadVirtualAbState(&state)) ...
return state.MergeStatus == MergeStatus::MERGING ||
(state.MergeStatus == MergeStatus::SNAPSHOTTED &&
state.SourceSlot != CurrentSlot()));
}
Perubahan alat fastboot
Android 11 membuat perubahan berikut pada protokol fastboot:
-
getvar snapshot-update-status
— Mengembalikan nilai yang dikomunikasikan oleh HAL kontrol boot ke bootloader:- Jika
MERGING
, bootloader harus mengembalikanmerging
. - Jika
SNAPSHOTTED
, bootloader harus mengembalikansnapshotted
. - Jika tidak, bootloader harus mengembalikan
none
.
- Jika
-
snapshot-update merge
— Menyelesaikan operasi penggabungan, boot ke recovery/fastbootd jika perlu. Perintah ini hanya valid jikasnapshot-update-status
merging
, dan hanya didukung di fastbootd. -
snapshot-update cancel
— Mengatur status penggabungan HAL kontrol boot keCANCELLED
. Perintah ini tidak valid saat perangkat terkunci. -
erase
atauwipe
—erase
atauwipe
metadata
,userdata
pengguna , atau partisi yang memegang status penggabungan untuk kontrol boot HAL 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 dengan aman diubah dalam statusSNAPSHOTTED
.
Perubahan ini dirancang untuk mencegah secara tidak sengaja membuat perangkat tidak dapat di-boot, tetapi dapat mengganggu perkakas otomatis. Ketika perintah digunakan sebagai komponen untuk mem-flash semua partisi, seperti menjalankan fastboot flashall
, disarankan untuk menggunakan alur berikut:
- Kueri
getvar snapshot-update-status
. - Jika
merging
atau di-snapshotted
, terbitkansnapshot-update cancel
. - Lanjutkan dengan langkah-langkah flashing.
Mengurangi persyaratan penyimpanan
Perangkat yang tidak memiliki penyimpanan A/B penuh yang dialokasikan di super, dan diharapkan menggunakan /data
seperlunya, sangat disarankan untuk menggunakan alat pemetaan blok. Alat pemetaan blok menjaga alokasi blok tetap konsisten di antara build, mengurangi penulisan yang tidak perlu ke snapshot. Ini didokumentasikan di bawah Mengurangi Ukuran OTA .