Android 10 เปิดตัว User Data Checkpoint (UDC) ซึ่ง
ช่วยให้ Android กลับไปสู่สถานะก่อนหน้าได้เมื่อการอัปเดต Android แบบ Over-The-Air
(OTA) ล้มเหลว เมื่อใช้ UDC หากการอัปเดต OTA ของ Android ล้มเหลว อุปกรณ์จะ
ย้อนกลับไปสู่สถานะก่อนหน้าได้อย่างปลอดภัย แม้ว่าการอัปเดต A/B จะแก้ปัญหานี้สำหรับการบูตในช่วงแรกได้ แต่ระบบจะไม่รองรับการย้อนกลับเมื่อมีการแก้ไขพาร์ติชันข้อมูลผู้ใช้ (ติดตั้งใน /data
)
UDC ช่วยให้อุปกรณ์เปลี่ยนพาร์ติชันข้อมูลผู้ใช้กลับได้แม้ว่าจะมีการ แก้ไขแล้วก็ตาม ฟีเจอร์ UDC ทำได้โดยใช้ความสามารถของจุดตรวจสอบกับระบบไฟล์ ซึ่งเป็นการติดตั้งใช้งานทางเลือกเมื่อระบบไฟล์ไม่รองรับจุดตรวจสอบ การผสานรวมกับกลไกการบูต A/B ขณะเดียวกันก็รองรับการอัปเดตที่ไม่ใช่ A/B และรองรับการเชื่อมโยงเวอร์ชันคีย์และการป้องกันการย้อนกลับคีย์
ผลกระทบต่อผู้ใช้
ฟีเจอร์ UDC ช่วยปรับปรุงประสบการณ์การอัปเดต OTA สำหรับผู้ใช้ เนื่องจากผู้ใช้จำนวนน้อยลงจะสูญเสียข้อมูลเมื่อการอัปเดต OTA ล้มเหลว ซึ่งจะช่วยลดจำนวนการโทรติดต่อทีมสนับสนุน จากผู้ใช้ที่พบปัญหาในระหว่างกระบวนการอัปเดต อย่างไรก็ตาม เมื่อการอัปเดตผ่าน OTA ล้มเหลว ผู้ใช้อาจสังเกตเห็นว่าอุปกรณ์รีบูตหลายครั้ง
วิธีการทำงาน
ฟังก์ชันการทำงานของจุดตรวจสอบในระบบไฟล์ต่างๆ
สำหรับระบบไฟล์ F2FS นั้น UDC จะเพิ่มฟังก์ชันจุดตรวจสอบไปยังเคอร์เนล Linux 4.20 ที่อัปสตรีม และย้อนกลับไปยังเคอร์เนลทั่วไปทั้งหมดที่อุปกรณ์รองรับ ซึ่งใช้ Android 10
สำหรับระบบไฟล์อื่นๆ UDC จะใช้อุปกรณ์เสมือนของ Device Mapper ที่ชื่อ dm_bow
สำหรับฟังก์ชันการทำงานของจุดตรวจสอบ dm_bow
อยู่ระหว่างอุปกรณ์กับระบบไฟล์
เมื่อติดตั้งพาร์ติชัน ระบบจะออกคำสั่ง TRIM ซึ่งทำให้ระบบไฟล์
ออกคำสั่ง TRIM ในบล็อกที่ว่างทั้งหมด dm_bow
จะสกัดกั้นการตัดแต่งเหล่านี้และใช้
เพื่อตั้งค่ารายการบล็อกฟรี จากนั้นระบบจะส่งการอ่านและการเขียนไปยังอุปกรณ์โดยไม่มีการแก้ไข แต่ก่อนที่จะอนุญาตให้เขียน ระบบจะสำรองข้อมูลที่จำเป็นสำหรับการกู้คืนไปยังบล็อกที่ว่าง
กระบวนการจุดตรวจ
เมื่อติดตั้งพาร์ติชันที่มีแฟล็ก checkpoint=fs/block
Android จะเรียกใช้
restoreCheckpoint
ในไดรฟ์เพื่อให้สามารถกู้คืนจุดตรวจสอบปัจจุบัน
ได้ init
จากนั้นจะเรียกใช้ฟังก์ชัน needsCheckpoint
เพื่อพิจารณาว่า
อุปกรณ์อยู่ในสถานะ A/B ของ Bootloader หรือได้ตั้งค่าจำนวนครั้งที่ลองอัปเดตอีกครั้งหรือไม่
หากเป็นจริง Android จะเรียกใช้ createCheckpoint
เพื่อเพิ่มเมานต์
แฟล็กหรือสร้างอุปกรณ์ dm_bow
หลังจากติดตั้งพาร์ติชันแล้ว ระบบจะเรียกใช้โค้ดจุดตรวจสอบเพื่อออกคำสั่ง TRIM
จากนั้นกระบวนการบูตจะดำเนินต่อไปตามปกติ ที่ LOCKED_BOOT_COMPLETE
Android
จะเรียก commitCheckpoint
เพื่อคอมมิตจุดตรวจสอบปัจจุบันและการอัปเดต
จะดำเนินการต่อไปตามปกติ
จัดการคีย์ KeyMint (เดิมชื่อ Keymaster)
คีย์ KeyMint ใช้สำหรับการเข้ารหัสอุปกรณ์หรือวัตถุประสงค์อื่นๆ หากต้องการจัดการคีย์เหล่านี้ Android จะหน่วงเวลาการเรียกให้ลบคีย์จนกว่าจะมีการคอมมิตจุดตรวจสอบ
ตรวจสอบสุขภาพ
Daemon สถานะจะตรวจสอบว่ามีพื้นที่ในดิสก์เพียงพอที่จะสร้าง
จุดตรวจสอบ Health Daemon อยู่ใน
cp_healthDaemon
ใน Checkpoint.cpp
Daemon ของสถานะระบบมีลักษณะการทำงานต่อไปนี้ที่กำหนดค่าได้
ro.sys.cp_msleeptime
: ควบคุมความถี่ที่อุปกรณ์ตรวจสอบการใช้ดิสก์ro.sys.cp_min_free_bytes
: ควบคุมค่าต่ำสุดที่ Daemon สุขภาพมองหาro.sys.cp_commit_on_full
: ควบคุมว่า Daemon ด้านสุขภาพจะรีบูตอุปกรณ์หรือคอมมิต จุดตรวจสอบและดำเนินการต่อเมื่อดิสก์เต็มหรือไม่
Checkpoint APIs
ฟีเจอร์ UDC ใช้ Checkpoint API สำหรับ API อื่นๆ ที่ UDC ใช้ โปรดดู
IVold.aidl
void startCheckpoint(int retry)
สร้างจุดตรวจสอบ
เฟรมเวิร์กจะเรียกใช้เมธอดนี้เมื่อพร้อมเริ่มการอัปเดต
ระบบจะสร้างจุดตรวจสอบก่อนที่จะติดตั้งระบบไฟล์ที่จุดตรวจสอบ เช่น userdata เป็น R/W หลังจากรีบูต หากจำนวนการลองใหม่เป็นค่าบวก API จะจัดการ
การลองใหม่ในการติดตาม และโปรแกรมอัปเดตจะเรียกใช้ needsRollback
เพื่อตรวจสอบว่าต้องมีการย้อนกลับ
การอัปเดตหรือไม่ หากจำนวนการลองใหม่เป็น -1
API จะเลื่อนการตัดสินใจไปที่ A/B
bootloader
ระบบจะไม่เรียกใช้เมธอดนี้เมื่อทำการอัปเดต A/B ปกติ
void commitChanges()
คอมมิตการเปลี่ยนแปลง
เฟรมเวิร์กจะเรียกใช้เมธอดนี้หลังการรีบูตเมื่อพร้อมที่จะคอมมิตการเปลี่ยนแปลง
โดยจะเรียกใช้ฟังก์ชันนี้ก่อนที่จะเขียนข้อมูล (เช่น รูปภาพ วิดีโอ SMS ใบเสร็จจากเซิร์ฟเวอร์
ที่ระบุว่าได้รับแล้ว) ลงใน userdata และก่อน BootComplete
หากไม่มีการอัปเดตที่จุดตรวจสอบที่ใช้งานอยู่ วิธีนี้จะไม่มีผล
abortChanges()
บังคับให้รีบูตและกลับไปที่จุดตรวจสอบ ทิ้งการแก้ไข userdata ทั้งหมด ตั้งแต่การรีบูตครั้งแรก
เฟรมเวิร์กจะเรียกใช้เมธอดนี้หลังจากรีบูตแต่ก่อน commitChanges
retry_counter
จะลดลงเมื่อเรียกใช้เมธอดนี้ ระบบจะสร้างรายการบันทึก
bool needsRollback()
กำหนดว่าต้องย้อนกลับหรือไม่
ในอุปกรณ์ที่ไม่ใช่ Checkpoint จะแสดง false
ในอุปกรณ์ Checkpoint ค่าที่ส่งคืนคือ true
ในระหว่างการเปิดเครื่องที่ไม่ใช่ Checkpoint
ติดตั้งใช้งาน UDC
การใช้งานอ้างอิง
ดูตัวอย่างวิธีใช้งาน UDC ได้ที่ dm-bow.c ดูเอกสารเพิ่มเติมเกี่ยวกับฟีเจอร์นี้ได้ที่ dm-bow.txt
ตั้งค่า
ใน on fs
ในไฟล์ init.hardware.rc
โปรดตรวจสอบว่าคุณมีข้อมูลต่อไปนี้
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
ใน on late-fs
ในไฟล์ init.hardware.rc
โปรดตรวจสอบว่าคุณมีข้อมูลต่อไปนี้
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
ในไฟล์ fstab.hardware
ให้ตรวจสอบว่าได้ติดแท็ก /data
เป็น 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
เพิ่มการแบ่งพาร์ติชันข้อมูลเมตา
UDC ต้องมีพาร์ติชันข้อมูลเมตาเพื่อจัดเก็บจำนวนการลองใหม่ที่ไม่ใช่ Bootloader และ
คีย์ ตั้งค่าพาร์ติชันข้อมูลเมตาและติดตั้งล่วงหน้าใน /metadata
ในไฟล์ fstab.hardware
ให้ตรวจสอบว่าได้ติดแท็ก /metadata
เป็น earlymount
หรือ first_stage_mount
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount
เริ่มต้นพาร์ติชันเป็น 0 ทั้งหมด
เพิ่มบรรทัดต่อไปนี้ลงใน BoardConfig.mk
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
อัปเดตระบบ
ระบบ F2FS
สำหรับระบบที่ใช้ F2FS เพื่อจัดรูปแบบข้อมูล โปรดตรวจสอบว่า F2FS เวอร์ชันของคุณ รองรับจุดตรวจสอบ ดูข้อมูลเพิ่มเติมได้ที่ฟังก์ชันการทำงานของจุดตรวจสอบใน ระบบไฟล์ต่างๆ
เพิ่มแฟล็ก checkpoint=fs
ลงในส่วน <fs_mgr_flags>
ของ fstab สำหรับ
อุปกรณ์ที่เมานต์ที่ /data
ระบบที่ไม่ใช่ F2FS
สำหรับระบบที่ไม่ใช่ F2FS คุณต้องเปิดใช้ dm-bow
ในการกำหนดค่าเคอร์เนล
เพิ่มแฟล็ก checkpoint=block
ลงในส่วน <fs_mgr_flags>
ของ fstab สำหรับ
อุปกรณ์ที่เมานต์ที่ /data
ตรวจสอบบันทึก
ระบบจะสร้างรายการบันทึกเมื่อมีการเรียกใช้ Checkpoint API
การตรวจสอบความถูกต้อง
หากต้องการทดสอบการใช้งาน UDC ให้เรียกใช้VtsKernelCheckpointTest
ชุดการทดสอบ VTS