Để triển khai A/B ảo trên một thiết bị mới hoặc để trang bị thêm cho một thiết bị đã ra mắt, bạn phải thay đổi mã dành riêng cho thiết bị.
Cờ dựng
Những thiết bị sử dụng A/B ảo phải được định cấu hình làm thiết bị A/B và phải khởi chạy bằng các phân vùng động.
Đối với các thiết bị khởi chạy bằng tính năng A/B ảo, hãy đặt các thiết bị đó kế thừa cấu hình cơ sở của thiết bị A/B ảo:
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)
Các thiết bị chạy bằng A/B ảo chỉ cần kích thước bảng bằng một nửa cho BOARD_SUPER_PARTITION_SIZE
vì các khe B không còn ở chế độ siêu dữ liệu nữa. Tức là BOARD_SUPER_PARTITION_SIZE
phải lớn hơn hoặc bằng sum(size of update groups) + overhead, và giá trị này phải lớn hơn hoặc bằng sum(size of partitions) + overhead.
Đối với Android 13 trở lên, để bật ảnh chụp nhanh được nén bằng Virtual A/B, hãy kế thừa cấu hình cơ sở sau:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)
Điều này cho phép chụp nhanh không gian người dùng bằng Virtual A/B trong khi sử dụng phương thức nén không hoạt động. Sau đó, bạn có thể định cấu hình phương thức nén thành một trong các phương thức được hỗ trợ, zstd
và lz4
. Đối với Android 15, bạn có thể tuỳ chỉnh thêm quy trình nén để phù hợp với nhu cầu của thiết bị. Để biết thêm thông tin, hãy xem phần Tinh chỉnh mức nén.
PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Đối với Android 12, để bật ảnh chụp nhanh nén bằng Virtual A/B, hãy kế thừa cấu hình cơ sở sau:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
$(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)
Nén XOR
Đối với các thiết bị nâng cấp lên Android 13 trở lên, theo mặc định, tính năng nén XOR sẽ không được bật. Để bật tính năng nén XOR, hãy thêm nội dung sau vào tệp .mk
của thiết bị.
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true
Theo mặc định, chế độ nén XOR được bật cho các thiết bị kế thừa từ android_t_baseline.mk
.
Hợp nhất không gian người dùng
Trong phiên bản hiện đại của Virtual A/B (Android T trở lên), quy trình hợp nhất ảnh chụp nhanh diễn ra hoàn toàn trong không gian người dùng. Thay đổi này được thực hiện nhờ snapuserd và dm-user. Các thiết bị ra mắt cùng Android 13 trở lên có tính năng hợp nhất không gian người dùng được bật theo mặc định và đối với các thiết bị cũ hơn đang nâng cấp, bạn có thể đặt thuộc tính này bằng cách sau:
PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true
HAL kiểm soát quá trình khởi động
HAL điều khiển quá trình khởi động cung cấp một giao diện để các ứng dụng OTA kiểm soát các khe khởi động. A/B ảo yêu cầu nâng cấp phiên bản phụ của HAL điều khiển quy trình khởi động vì cần có các API bổ sung để đảm bảo trình tải khởi động được bảo vệ trong quá trình nhấp nháy hoặc đặt lại về trạng thái ban đầu. Hãy xem IBootControl.hal và types.hal để biết phiên bản mới nhất của định nghĩa 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
}
Các thay đổi về fstab
Tính toàn vẹn của phân vùng siêu dữ liệu là yếu tố cần thiết cho quy trình khởi động, đặc biệt là ngay sau khi áp dụng bản cập nhật OTA. Vì vậy, bạn phải kiểm tra phân vùng siêu dữ liệu trước khi first_stage_init
gắn phân vùng đó. Để đảm bảo điều này xảy ra, hãy thêm cờ check
fs_mgr vào mục nhập cho /metadata
. Sau đây là một ví dụ:
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check
Yêu cầu về kernel
Để bật tính năng chụp nhanh, hãy đặt CONFIG_DM_SNAPSHOT
thành true
.
Đối với các thiết bị sử dụng F2FS, hãy thêm bản vá kernel f2fs: export FS_NOCOW_FL flag to user để khắc phục lỗi ghim tệp. Đồng thời, hãy thêm bản vá hạt nhân f2fs: support aligned pinned file (f2fs: hỗ trợ tệp được ghim đã căn chỉnh).
Tính năng A/B ảo dựa trên các tính năng được thêm vào phiên bản kernel 4.3: bit trạng thái overflow trong các mục tiêu snapshot
và snapshot-merge
. Tất cả các thiết bị ra mắt với Android 9 trở lên đều phải có phiên bản nhân 4.4 trở lên.
Để bật ảnh chụp nhanh nén, phiên bản kernel tối thiểu được hỗ trợ là 4.19.
Đặt CONFIG_DM_USER=m
hoặc CONFIG_DM_USER=y
. Nếu sử dụng phương thức đầu tiên (một mô-đun), thì mô-đun đó phải được tải trong ramdisk giai đoạn đầu. Bạn có thể thực hiện việc này bằng cách thêm dòng sau vào Makefile của thiết bị:
BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko
Các thay đổi về công cụ Fastboot
Android 11 có những thay đổi sau đối với giao thức fastboot:
getvar snapshot-update-status
– Trả về giá trị mà HAL kiểm soát quá trình khởi động đã truyền đến trình tải khởi động:- Nếu trạng thái là
MERGING
, thì trình tải khởi động phải trả vềmerging
. - Nếu trạng thái là
SNAPSHOTTED
, thì trình tải khởi động phải trả vềsnapshotted
. - Nếu không, trình tải khởi động phải trả về
none
.
- Nếu trạng thái là
snapshot-update merge
– Hoàn tất thao tác hợp nhất, khởi động vào chế độ khôi phục/fastbootd nếu cần. Lệnh này chỉ hợp lệ nếusnapshot-update-status
làmerging
và chỉ được hỗ trợ trong fastbootd.snapshot-update cancel
– Đặt trạng thái hợp nhất của HAL kiểm soát quy trình khởi động thànhCANCELLED
. Lệnh này không hợp lệ khi thiết bị bị khoá.erase
hoặcwipe
–erase
hoặcwipe
củametadata
,userdata
hoặc một phân vùng lưu giữ trạng thái hợp nhất cho HAL kiểm soát khởi động sẽ kiểm tra trạng thái hợp nhất của ảnh chụp nhanh. Nếu trạng thái làMERGING
hoặcSNAPSHOTTED
, thì thiết bị phải huỷ thao tác.set_active
– Lệnhset_active
thay đổi khe cắm đang hoạt động phải kiểm tra trạng thái hợp nhất của ảnh chụp nhanh. Nếu trạng thái làMERGING
, thiết bị sẽ huỷ thao tác. Bạn có thể thay đổi khe cắm một cách an toàn ở trạng tháiSNAPSHOTTED
.
Những thay đổi này nhằm mục đích ngăn chặn tình trạng vô tình khiến thiết bị không khởi động được, nhưng có thể gây gián đoạn cho các công cụ tự động. Khi các lệnh được dùng làm một thành phần của việc flash tất cả các phân vùng, chẳng hạn như chạy fastboot flashall
, bạn nên dùng quy trình sau:
- Cụm từ tìm kiếm
getvar snapshot-update-status
. - Nếu
merging
hoặcsnapshotted
, hãy phát hànhsnapshot-update cancel
. - Tiếp tục thực hiện các bước nhấp nháy.
Giảm yêu cầu về bộ nhớ
Các thiết bị không có bộ nhớ A/B đầy đủ được phân bổ trong siêu dữ liệu và dự kiến sẽ sử dụng /data
khi cần thiết, bạn nên sử dụng công cụ ánh xạ khối. Công cụ ánh xạ khối duy trì việc phân bổ khối nhất quán giữa các bản dựng, giảm số lần ghi không cần thiết vào bản tổng quan nhanh. Việc này được ghi lại trong phần Giảm kích thước OTA.
Thuật toán nén OTA
Bạn có thể điều chỉnh các gói OTA cho nhiều chỉ số hiệu suất. Android cung cấp một số phương thức nén được hỗ trợ (lz4
, zstd
và none
) có sự đánh đổi giữa thời gian cài đặt, mức sử dụng không gian COW, thời gian khởi động và thời gian hợp nhất ảnh chụp nhanh. lz4
compression method
là lựa chọn mặc định được bật cho ab ảo có nén.
Tinh chỉnh mức nén
Bạn có thể tuỳ chỉnh thêm các thuật toán nén thông qua 2 phương thức: (mức nén) (lượng nén đạt được với tốc độ thấp) và (hệ số nén) (kích thước cửa sổ có thể nén tối đa).
Mức độ nén có sẵn cho một số thuật toán như zstd
và việc thay đổi mức độ này sẽ dẫn đến sự đánh đổi giữa tốc độ và tỷ lệ nén.
Hệ số nén mô tả kích thước cửa sổ nén tối đa được dùng trong quá trình cài đặt OTA. Theo mặc định, giá trị này được đặt ở mức 64k, nhưng bạn có thể ghi đè bằng cách tuỳ chỉnh tham số bản dựng PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR
. Các hệ số nén được hỗ trợ là 4k, 8k, 16k, 32k, 64k, 128k và 256k.
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536
Bản cập nhật OTA gia tăng trên Pixel 8 Pro
Thời gian cài đặt không có giai đoạn hậu cài đặt | Mức sử dụng không gian COW | Thời gian khởi động sau OTA | Thời gian hợp nhất ảnh chụp nhanh | |
---|---|---|---|---|
lz4 | 18 phút 15 giây | 2,5 GB | 32,7 giây | 98,6 giây |
zstd | 24 phút 49 giây | 2,05 GB | 36,3 giây | 133,2 giây |
none | 16 phút 42 giây | 4,76 GB | 28,7 giây | 76,6 giây |
Bản cập nhật OTA đầy đủ trên Pixel 8 Pro
Thời gian cài đặt không có giai đoạn hậu cài đặt | Mức sử dụng không gian COW | Thời gian khởi động sau OTA | Thời gian hợp nhất ảnh chụp nhanh | |
---|---|---|---|---|
lz4 | 15 phút 11 giây | 4,16 GB | 17,6 giây | 82,2 giây |
zstd | 16 phút 19 giây | 3,46 GB | 21,0 giây | 106,3 giây |
none | 13 phút 33 giây | 6,39 GB | 18,5 giây | 92,5 giây |