Android 10 เปิดตัว User Data Checkpoint (UDC)
ทำให้ Android ย้อนกลับไปสถานะก่อนหน้าได้เมื่อ Android ผ่านอากาศ (OTA)
อัปเดต (OTA) ไม่สำเร็จ เมื่อใช้ UDC หากการอัปเดต OTA บน Android ไม่สำเร็จ อุปกรณ์จะสามารถ
กลับไปยังสถานะก่อนหน้าได้อย่างปลอดภัย แม้ว่า
การอัปเดต A/B ช่วยแก้ปัญหานี้สำหรับการเปิดเครื่องก่อนหรือหลังการย้อนกลับ
ระบบไม่รองรับเมื่อมีการแก้ไขพาร์ติชันข้อมูลผู้ใช้ (ต่อเชื่อมใน /data
)
UDC ช่วยให้อุปกรณ์เปลี่ยนกลับพาร์ติชันข้อมูลผู้ใช้ได้แม้หลังจากที่ แก้ไขแล้ว ฟีเจอร์ UDC ทำงานนี้ได้ด้วยความสามารถของจุดตรวจสอบ ระบบไฟล์ ซึ่งเป็นทางเลือกที่ใช้ในกรณีที่ระบบไฟล์ไม่รองรับ จุดตรวจสอบ การผสานรวมกับกลไก A/B ของ Bootloader ในขณะเดียวกันก็รองรับ การอัปเดตที่ไม่ใช่ A/B และรองรับการเชื่อมโยงเวอร์ชันคีย์และการย้อนกลับคีย์ การป้องกัน
ผลกระทบต่อผู้ใช้
ฟีเจอร์ UDC ช่วยปรับปรุงประสบการณ์การอัปเดต OTA ให้ผู้ใช้เนื่องจากผู้ใช้สูญเสียผู้ใช้น้อยลง เมื่อการอัปเดต OTA ล้มเหลว วิธีนี้จะลดจำนวนการโทรขอรับการสนับสนุนได้ จากผู้ใช้ที่พบอุปกรณ์ในระหว่างการอัปเดต แต่เมื่อ OTA อัปเดตไม่สำเร็จ ผู้ใช้อาจสังเกตเห็นว่าอุปกรณ์รีบูตหลายครั้ง
วิธีการทำงาน
ฟังก์ชันจุดตรวจสอบในระบบไฟล์ต่างๆ
สำหรับระบบไฟล์ F2FS นั้น UDC จะเพิ่มฟังก์ชันจุดตรวจสอบลงในอัปสตรีม 4.20 เคอร์เนลของ Linux และพอร์ตไปยังเคอร์เนลทั่วไปทั้งหมดที่อุปกรณ์รองรับ ที่ใช้ Android 10
สำหรับระบบไฟล์อื่นๆ UDC จะใช้อุปกรณ์เสมือนของเครื่องมือแมปอุปกรณ์ที่ชื่อ dm_bow
สำหรับฟังก์ชันการทำงานของจุดตรวจสอบ dm_bow
อยู่ระหว่างอุปกรณ์และไฟล์
ระบบ เมื่อมีการต่อเชื่อมพาร์ติชัน ระบบจะตัดฟังก์ชันออกเพื่อให้ระบบไฟล์
ออกคำสั่งตัดกับบล็อกฟรีทั้งหมด dm_bow
สกัดกั้นการตัดและใช้
เพื่อสร้างรายการบล็อกฟรี ระบบจะส่งการอ่านและเขียนไปยังอุปกรณ์
ไม่มีการแก้ไข แต่ก่อนที่จะอนุญาตให้เขียน จะมีการสำรองข้อมูลที่จำเป็นสำหรับการคืนค่า
ไม่เกิน 1 บล็อกฟรี
กระบวนการเช็คพอยท์
เมื่อต่อเชื่อมพาร์ติชันที่มี Flag checkpoint=fs/block
แล้ว Android จะเรียกใช้
restoreCheckpoint
ในไดรฟ์เพื่อให้อุปกรณ์คืนค่ากระแสข้อมูล
จุดตรวจ init
จะเรียกฟังก์ชัน needsCheckpoint
เพื่อระบุว่า
อุปกรณ์อยู่ในสถานะ A/B Bootloader หรือตั้งค่าให้ลองอัปเดตอีกครั้ง
นับจำนวน หากข้อใดข้อหนึ่งเป็นจริง Android จะเรียก createCheckpoint
เพื่อเพิ่มตัวยึด
แจ้งหรือสร้างอุปกรณ์ dm_bow
หลังจากต่อเชื่อมพาร์ติชันแล้ว จะมีการเรียกใช้โค้ดจุดตรวจสอบเพื่อแก้ไขปัญหาการตัด
จากนั้นกระบวนการเปิดเครื่องจะดำเนินต่อไปตามปกติ ที่ LOCKED_BOOT_COMPLETE
, Android
โทรติดต่อ commitCheckpoint
เพื่อตรวจเช็คพอยท์ปัจจุบันและการอัปเดต
จะดำเนินต่อตามปกติ
จัดการคีย์คีย์มาสเตอร์
คีย์ Keymaster ใช้เพื่อการเข้ารหัสอุปกรณ์หรือวัตถุประสงค์อื่นๆ เพื่อจัดการบริการเหล่านี้ Android จะหน่วงเวลาการเรียกใช้การลบคีย์จนกว่าจะมีการตรวจเช็คพอยท์
ติดตามสุขภาพ
Daemon ด้านสุขภาพยืนยันว่ามีพื้นที่ว่างในดิสก์เพียงพอที่จะสร้าง
จุดตรวจ Daemon สุขภาพอยู่ใน
cp_healthDaemon
ใน Checkpoint.cpp
ดีมอนสุขภาพมีลักษณะการทำงานต่อไปนี้ที่กำหนดค่าได้
ro.sys.cp_msleeptime
: ควบคุมความถี่ที่อุปกรณ์ตรวจสอบการใช้งานดิสก์ro.sys.cp_min_free_bytes
: ควบคุมค่าต่ำสุดที่ Daemon ด้านสุขภาพต้องการro.sys.cp_commit_on_full
: ควบคุมว่าจะให้ดีมอนสุขภาพรีบูตอุปกรณ์หรือดำเนินการ และจะทำงานต่อเมื่อดิสก์เต็ม
API ของจุดตรวจสอบ
ฟีเจอร์ UDC ใช้ Checkpoint API สำหรับ API อื่นๆ ที่ UDC ใช้ โปรดดูที่
IVold.aidl
เป็นโมฆะ startCheckpoint(ลองใหม่)
สร้างจุดเช็คพอยท์
เฟรมเวิร์กจะเรียกใช้วิธีนี้เมื่อพร้อมเริ่มการอัปเดต
จุดตรวจสอบจะสร้างขึ้นก่อนระบบไฟล์ที่มีการตรวจสอบ เช่น ข้อมูลผู้ใช้
ต่อเชื่อม R/W หลังจากรีบูต หากจำนวนการลองใหม่เป็นบวก API จะจัดการ
การติดตามความพยายามซ้ำ และผู้อัปเดตจะโทรหา needsRollback
เพื่อตรวจสอบว่ามีการย้อนกลับหรือไม่
ต้องระบุการอัปเดต หากจำนวนการลองใหม่คือ -1
API จะเปลี่ยนไปเป็น A/B
การตัดสินของ Bootloader
ระบบจะไม่เรียกใช้วิธีการนี้เมื่อทำการอัปเดต A/B ปกติ
โมฆะคอมมิตChanges()
ดำเนินการเปลี่ยนแปลง
เฟรมเวิร์กเรียกใช้เมธอดนี้หลังจากรีบูตเมื่อการเปลี่ยนแปลงพร้อมที่จะ
มีสัญญาผูกมัด ซึ่งจะเรียกก่อนข้อมูล (เช่น รูปภาพ วิดีโอ SMS เซิร์ฟเวอร์
การรับ) เขียนลงในข้อมูลผู้ใช้และก่อนวันที่ BootComplete
ถ้าไม่มีการอัปเดตที่มีการตรวจสอบซึ่งทำงานอยู่ วิธีการนี้จะไม่มีผล
ล้มเลิกการเปลี่ยนแปลง()
บังคับให้รีบูตและเปลี่ยนกลับไปใช้จุดตรวจสอบ ยกเลิกการแก้ไขข้อมูลผู้ใช้ทั้งหมด นับตั้งแต่การรีบูตครั้งแรก
เฟรมเวิร์กเรียกใช้เมธอดนี้หลังจากรีบูต แต่ก่อน commitChanges
retry_counter
จะลดลงเมื่อเรียกใช้เมธอดนี้ รายการบันทึกจะ
ที่สร้างขึ้น
bool needRollback()
กำหนดว่าจำเป็นต้องย้อนกลับหรือไม่
ในอุปกรณ์ที่ไม่ใช่จุดตรวจสอบ จะแสดงผล false
ในอุปกรณ์เช็คพอยท์ ส่งคืน true
ระหว่างการเปิดเครื่องที่ไม่ใช่จุดตรวจสอบ
ใช้ 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 ต้องใช้พาร์ติชันข้อมูลเมตาเพื่อจัดเก็บจำนวนการลองโหลดอีกครั้งและ
คีย์ ตั้งค่าพาร์ติชันข้อมูลเมตาและต่อเชื่อมล่วงหน้าที่ /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 ให้เรียกใช้ชุด VTS VtsKernelCheckpointTest
การทดสอบ