Android 10 ra mắt Điểm kiểm tra dữ liệu người dùng (UDC),
cho phép Android khôi phục về trạng thái trước đó khi Android qua mạng không dây
Không cập nhật được (OTA). Với UDC, nếu bản cập nhật Android OTA không thành công, thiết bị có thể
khôi phục về trạng thái trước đó một cách an toàn. Mặc dù
Bản cập nhật A/B giải quyết sự cố này để khởi động sớm, khôi phục
không được hỗ trợ khi phân vùng dữ liệu người dùng (được gắn trên /data
) được sửa đổi.
UDC cho phép thiết bị hoàn nguyên phân vùng dữ liệu người dùng ngay cả sau khi sửa đổi. Tính năng UDC thực hiện điều này bằng cách sử dụng các chức năng điểm kiểm tra để hệ thống tệp, phương thức triển khai thay thế khi hệ thống tệp không hỗ trợ điểm kiểm tra, tích hợp với cơ chế A/B của trình tải khởi động đồng thời hỗ trợ các bản cập nhật không phải A/B và hỗ trợ liên kết phiên bản phím và khôi phục phím phòng ngừa.
Tác động đối với người dùng
Tính năng UDC cải thiện trải nghiệm cập nhật qua mạng không dây cho người dùng khi giảm số người dùng bị mất khi bản cập nhật OTA không thành công. Việc này có thể làm giảm số lượng cuộc gọi hỗ trợ từ những người dùng gặp sự cố trong quá trình cập nhật. Tuy nhiên, khi một OTA không cập nhật được, người dùng có thể nhận thấy thiết bị khởi động lại nhiều lần.
Cách hoạt động
Chức năng của điểm kiểm tra trong nhiều hệ thống tệp
Đối với hệ thống tệp F2FS, UDC thêm chức năng điểm kiểm tra vào luồng ngược 4.20 Nhân Linux và điều chỉnh cho phiên bản cũ cho tất cả các nhân phổ biến mà thiết bị hỗ trợ chạy Android 10.
Đối với các hệ thống tệp khác, UDC sử dụng một thiết bị ảo trình liên kết thiết bị có tên là dm_bow
cho chức năng điểm kiểm tra. dm_bow
nằm giữa thiết bị và tệp
hệ thống. Khi phân vùng được gắn kết, quá trình cắt sẽ được phát hành, khiến hệ thống tệp
đưa ra lệnh cắt trên tất cả các khối miễn phí. dm_bow
chặn những phần cắt và sử dụng này
để thiết lập danh sách chặn miễn phí. Sau đó, hoạt động đọc và ghi sẽ được gửi đến thiết bị
chưa sửa đổi, nhưng trước khi cho phép ghi, dữ liệu cần thiết để khôi phục được sao lưu
lên tới khối miễn phí.
Quy trình tại điểm kiểm tra
Khi một phân vùng có cờ checkpoint=fs/block
được gắn, Android sẽ gọi
restoreCheckpoint
trên ổ đĩa để cho phép thiết bị khôi phục mọi hiện tại
. Sau đó, init
sẽ gọi hàm needsCheckpoint
để xác định xem
thiết bị đang ở trạng thái A/B trình tải khởi động hoặc đã đặt lại lượt cập nhật
số lượng. Nếu đúng, Android sẽ gọi createCheckpoint
để thêm giá trị gắn kết
gắn cờ hoặc tạo một thiết bị dm_bow
.
Sau khi gắn phân vùng, mã điểm kiểm tra sẽ được gọi để xử lý vấn đề cắt bỏ.
Sau đó, quá trình khởi động sẽ tiếp tục như bình thường. Tại LOCKED_BOOT_COMPLETE
, Android
gọi commitCheckpoint
để xác nhận điểm kiểm tra hiện tại và bản cập nhật
sẽ tiếp tục như bình thường.
Quản lý khoá keymaster
Khoá Keymaster được dùng để mã hoá thiết bị hoặc các mục đích khác. Để quản lý các đề xuất này Android sẽ trì hoãn các lệnh gọi xoá phím cho đến khi điểm kiểm tra được cam kết.
Theo dõi tình trạng sức khoẻ
Trình nền sức khoẻ xác minh rằng có đủ dung lượng ổ đĩa để tạo
. Daemon sức khoẻ nằm trong
cp_healthDaemon
trong Checkpoint.cpp
.
Daemon sức khoẻ có các hành vi sau đây có thể được định cấu hình:
ro.sys.cp_msleeptime
: Kiểm soát tần suất thiết bị kiểm tra mức sử dụng ổ đĩa.ro.sys.cp_min_free_bytes
: Kiểm soát giá trị tối thiểu mà trình nền sức khoẻ tìm kiếm.ro.sys.cp_commit_on_full
: Kiểm soát việc trình nền sức khoẻ có khởi động lại thiết bị hay không hoặc xác nhận và tiếp tục khi ổ đĩa đầy.
API Checkpoint
Tính năng UDC sử dụng các API của điểm kiểm tra. Đối với các API khác mà UDC sử dụng, hãy xem
IVold.aidl
.
vô hiệu startCheckpoint(thử lại int)
Tạo một điểm kiểm tra.
Khung sẽ gọi phương thức này khi đã sẵn sàng bắt đầu cập nhật. Chiến lược phát hành đĩa đơn
điểm kiểm tra này được tạo trước khi các hệ thống tệp có điểm kiểm tra, chẳng hạn như dữ liệu người dùng
đã gắn R/W sau khi khởi động lại. Nếu số lần thử lại là dương, API sẽ xử lý
theo dõi lần thử lại và trình cập nhật gọi needsRollback
để kiểm tra xem có khôi phục hay không
bản cập nhật là bắt buộc. Nếu số lần thử lại là -1
, API sẽ tuân theo A/B
của trình tải khởi động.
Phương thức này không được gọi khi cập nhật A/B thông thường.
trống cam kếtChanges()
Xác nhận nội dung thay đổi.
Khung sẽ gọi phương thức này sau khi khởi động lại khi các thay đổi đã sẵn sàng
cam kết. Lệnh này được gọi trước dữ liệu (như ảnh, video, SMS, máy chủ
tiếp nhận dữ liệu) được ghi vào dữ liệu người dùng và trước BootComplete
.
Nếu không có bản cập nhật điểm kiểm tra đang hoạt động nào, thì phương thức này sẽ không có hiệu lực.
huỷ bỏ()
Buộc khởi động lại và quay về điểm kiểm tra. Bỏ tất cả sửa đổi dữ liệu người dùng kể từ lần khởi động lại đầu tiên.
Khung sẽ gọi phương thức này sau khi khởi động lại nhưng trước commitChanges
.
retry_counter
bị giảm khi phương thức này được gọi. Các mục nhập nhật ký là
tạo.
bool cầnRollback()
Xác định xem có bắt buộc khôi phục hay không.
Trên các thiết bị không có điểm kiểm tra, hàm sẽ trả về false
. Trên thiết bị ở điểm kiểm tra, trả về true
trong khi khởi động không ở điểm kiểm tra.
Triển khai UDC
Cách triển khai tệp đối chiếu
Để biết ví dụ về cách triển khai UDC, xem dm-cung.c. Để xem thêm tài liệu về tính năng này, hãy xem dm-cung.txt.
Thiết lập
Trong on fs
trong tệp init.hardware.rc
, hãy đảm bảo bạn có:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
Trong on late-fs
trong tệp init.hardware.rc
, hãy đảm bảo bạn có:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
Trong tệp fstab.hardware
, hãy đảm bảo /data
được gắn thẻ là latemount
.
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier latemount,wait,check,fileencryption=ice,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,reservedsize=128M,checkpoint=fs
Thêm phân vùng siêu dữ liệu
UDC yêu cầu phân vùng siêu dữ liệu để lưu trữ số lần thử lại trình tải không khởi động và
khoá. Thiết lập một phân vùng siêu dữ liệu và gắn sớm phân vùng đó tại /metadata
.
Trong tệp fstab.hardware
, hãy đảm bảo /metadata
được gắn thẻ là earlymount
hoặc first_stage_mount
.
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount
Khởi động phân vùng thành tất cả các giá trị bằng 0.
Thêm các dòng sau vào BoardConfig.mk
:
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
Cập nhật hệ thống
Hệ thống F2FS
Đối với những hệ thống sử dụng F2FS để định dạng dữ liệu, hãy đảm bảo rằng bạn dùng phiên bản F2FS hỗ trợ điểm kiểm tra. Để biết thêm thông tin, hãy xem bài viết Chức năng của điểm kiểm tra trong hệ thống tệp khác nhau.
Thêm cờ checkpoint=fs
vào phần <fs_mgr_flags>
của fstab cho phần tử
thiết bị được gắn lúc /data
.
Các hệ thống không phải F2FS
Đối với các hệ thống không phải F2FS, bạn phải bật dm-bow
trong cấu hình nhân.
Thêm cờ checkpoint=block
vào phần <fs_mgr_flags>
của fstab cho phần tử
thiết bị được gắn lúc /data
.
Kiểm tra nhật ký
Mục nhập nhật ký được tạo khi gọi Checkpoint API.
Xác nhận kết quả
Để kiểm thử việc triển khai UDC, hãy chạy tập hợp VTS VtsKernelCheckpointTest
kiểm thử.