Android 10 giới thiệu Điểm kiểm tra dữ liệu người dùng (UDC), cho phép Android quay trở lại trạng thái trước đó khi cập nhật Android qua mạng (OTA) không thành công. Với UDC, nếu cập nhật Android OTA không thành công, thiết bị có thể quay trở lại trạng thái trước đó một cách an toàn. Mặc dù các bản cập nhật A/B giải quyết vấn đề này khi khởi động sớm nhưng việc 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
) bị 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 được sửa đổi. Tính năng UDC thực hiện điều này với khả năng điểm kiểm tra đối với hệ thống tệp, một cách 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 bộ nạp 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 khóa và ngăn chặn việc khôi phục phím.
Tác động của người dùng
Tính năng UDC cải thiện trải nghiệm cập nhật OTA cho người dùng vì ít người dùng bị mất dữ liệu hơn khi cập nhật OTA không thành công. Điều này có thể giảm số lượng cuộc gọi hỗ trợ từ người dùng gặp sự cố trong quá trình cập nhật. Tuy nhiên, khi cập nhật OTA không thành công, người dùng có thể nhận thấy thiết bị khởi động lại nhiều lần.
Làm thế nào nó hoạt động
Chức năng điểm kiểm tra trong các hệ thống tập tin khác nhau
Đối với hệ thống tệp F2FS, UDC bổ sung chức năng điểm kiểm tra cho nhân Linux 4.20 ngược dòng và chuyển ngược nó sang tất cả các nhân phổ biến được thiết bị chạy Android 10 hỗ trợ.
Đối với các hệ thống tệp khác, UDC sử dụng thiết bị ảo trình ánh xạ 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à hệ thống tập tin. Khi một phân vùng được gắn kết, một phần cắt được đưa ra khiến hệ thống tệp đưa ra các lệnh cắt trên tất cả các khối trống. dm_bow
chặn các phần cắt này và sử dụng chúng để thiết lập danh sách chặn miễn phí. Sau đó, việc đọc và ghi sẽ được gửi đến thiết bị mà không bị sửa đổi, nhưng trước khi cho phép ghi, dữ liệu cần thiết để khôi phục sẽ được sao lưu vào một khối trống.
Quy trình kiểm tra điểm
Khi một phân vùng 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 điểm kiểm tra hiện tại. init
sau đó gọi hàm needsCheckpoint
để xác định xem thiết bị có đang ở trạng thái A/B của bộ nạp khởi động hay đã đặt số lần thử lại cập nhật hay không. Nếu một trong hai điều trên đúng, Android gọi createCheckpoint
để thêm cờ gắn kết hoặc xây dựng thiết bị dm_bow
.
Sau khi phân vùng được gắn kết, mã điểm kiểm tra sẽ được gọi để đưa ra các phần cắt. Quá trình khởi động sau đó 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à quá trình cập nhật vẫn tiếp tục như bình thường.
Quản lý khóa keymaster
Khóa Keymaster được sử dụng để mã hóa thiết bị hoặc các mục đích khác. Để quản lý các khóa này, Android sẽ trì hoãn các lệnh gọi xóa khóa cho đến khi điểm kiểm tra được cam kết.
Theo dõi sức khỏe
Trình nền tình trạng sẽ xác minh rằng có đủ dung lượng ổ đĩa để tạo điểm kiểm tra. Daemon sức khỏe nằm ở cp_healthDaemon
trong Checkpoint.cpp
.
Daemon sức khỏe có các hành vi sau đây có thể được 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à health daemon tìm kiếm. -
ro.sys.cp_commit_on_full
: Kiểm soát xem trình nền tình trạng có khởi động lại thiết bị hay xác nhận điểm kiểm tra và tiếp tục khi đĩa đầy hay không.
API điểm kiểm tra
API điểm kiểm tra được sử dụng bởi tính năng UDC. Đối với các API khác được UDC sử dụng, hãy xem IVold.aidl
.
void startCheckpoint(int thử lại)
Tạo một điểm kiểm tra.
Khung này gọi phương thức này khi nó sẵn sàng bắt đầu cập nhật. Điểm kiểm tra được tạo trước khi các hệ thống tệp có điểm kiểm tra như dữ liệu người dùng được gắn R/W sau khi khởi động lại. Nếu số lần thử lại là dương thì API sẽ xử lý việc theo dõi số lần thử lại và trình cập nhật gọi needsRollback
để kiểm tra xem có cần khôi phục bản cập nhật hay không. Nếu số lần thử lại là -1
thì API sẽ tuân theo phán đoán của bộ tải khởi động A/B.
Phương pháp này không được gọi khi thực hiện cập nhật A/B thông thường.
void cam kếtChanges()
Cam kết những thay đổi.
Khung này gọi phương thức này sau khi khởi động lại khi các thay đổi đã sẵn sàng được thực hiện. Điều này được gọi trước khi dữ liệu (chẳng hạn như hình ảnh, video, SMS, biên nhận của máy chủ) được ghi vào userdata và trước BootComplete
.
Nếu không có bản cập nhật điểm kiểm tra hoạt động nào tồn tại thì phương pháp này không có hiệu lực.
hủy bỏChanges()
Buộc khởi động lại và quay trở lại điểm kiểm tra. Bỏ qua tất cả các sửa đổi dữ liệu người dùng kể từ lần khởi động lại đầu tiên.
Khung công tác 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ật ký được tạo ra.
nhu cầu boolRollback()
Xác định xem có cần khôi phục hay không.
Trên các thiết bị không có điểm kiểm tra, trả về false
. Trên các thiết bị điểm kiểm tra, trả về true
trong quá trình khởi động không có điểm kiểm tra.
Triển khai UDC
Thực hiện tham khảo
Để biết ví dụ về cách triển khai UDC, hãy xem dm-bow.c . Để biết thêm tài liệu về tính năng này, hãy xem dm-bow.txt .
Cài đặt
Trong on fs
trong tệp init.hardware.rc
của bạn, hãy đảm bảo bạn có:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
Ở on late-fs
trong tệp init.hardware.rc
của bạn, hãy đảm bảo bạn có:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
Trong tệp fstab.hardware
của bạn, 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 một phân vùng siêu dữ liệu để lưu trữ số lần thử lại và khóa của bộ tải không khởi động. Thiết lập phân vùng siêu dữ liệu và gắn kết sớm nó tại /metadata
.
Trong tệp fstab.hardware
của bạn, 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 tạo phân vùng cho tất cả các số 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 các hệ thống sử dụng F2FS để định dạng dữ liệu, hãy đảm bảo rằng phiên bản F2FS của bạn hỗ trợ điểm kiểm tra. Để biết thêm thông tin, hãy xem Chức năng điểm kiểm tra trong các hệ thống tệp khác nhau .
Thêm cờ checkpoint=fs
vào phần <fs_mgr_flags>
của fstab cho thiết bị được gắn tại /data
.
Hệ thống không phải F2FS
Đối với các hệ thống không phải F2FS, dm-bow
phải được bật trong cấu hình kernel.
Thêm cờ checkpoint=block
vào phần <fs_mgr_flags>
của fstab cho thiết bị được gắn tại /data
.
Kiểm tra nhật ký
Các mục nhật ký được tạo khi API điểm kiểm tra được gọi.
Thẩm định
Để kiểm tra việc triển khai UDC của bạn, hãy chạy bộ kiểm tra VTS VtsKernelCheckpointTest
.