Android 10 เปิดตัว User Data Checkpoint (UDC) ซึ่งช่วยให้ Android สามารถย้อนกลับไปสู่สถานะก่อนหน้าได้เมื่อการอัปเดต Android over-the-air (OTA) ล้มเหลว เมื่อใช้ UDC หากการอัปเดต Android OTA ล้มเหลว อุปกรณ์สามารถย้อนกลับไปสู่สถานะก่อนหน้าได้อย่างปลอดภัย แม้ว่า การอัปเดต 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
สกัดกั้นส่วนตัดแต่งเหล่านี้ และใช้มันเพื่อตั้งค่ารายการบล็อกอิสระ จากนั้นการอ่านและการเขียนจะถูกส่งไปยังอุปกรณ์โดยไม่มีการแก้ไข แต่ก่อนที่จะอนุญาตให้เขียนได้ ข้อมูลที่จำเป็นสำหรับการกู้คืนจะถูกสำรองข้อมูลไว้ในบล็อกที่ว่าง
กระบวนการจุดตรวจ
เมื่อติดตั้งพาร์ติชันที่มีเครื่องหมาย checkpoint=fs/block
แล้ว Android จะเรียก restoreCheckpoint
บนไดรฟ์เพื่อให้อุปกรณ์สามารถกู้คืนจุดตรวจสอบปัจจุบันได้ จากนั้น init
จะเรียกใช้ฟังก์ชัน needsCheckpoint
เพื่อตรวจสอบว่าอุปกรณ์อยู่ในสถานะ bootloader A/B หรือได้ตั้งค่าจำนวนการลองอัปเดตใหม่หรือไม่ หากเป็นจริง Android จะเรียก createCheckpoint
เพื่อเพิ่มแฟล็กเมานต์หรือสร้างอุปกรณ์ dm_bow
หลังจากติดตั้งพาร์ติชันแล้ว รหัสจุดตรวจสอบจะถูกเรียกให้ออกข้อมูลภายนอกข้อมูลรถ กระบวนการบู๊ตจะดำเนินต่อไปตามปกติ ที่ LOCKED_BOOT_COMPLETE
การโทรของ Android commitCheckpoint
เพื่อยืนยันจุดตรวจสอบปัจจุบันและการอัปเดตจะดำเนินต่อไปตามปกติ
จัดการคีย์คีย์มาสเตอร์
คีย์คีย์มาสเตอร์ใช้สำหรับการเข้ารหัสอุปกรณ์หรือวัตถุประสงค์อื่น ในการจัดการคีย์เหล่านี้ Android จะชะลอการโทรลบคีย์จนกว่าจุดตรวจสอบจะกระทำ
ติดตามสุขภาพ
ภูตสุขภาพจะตรวจสอบว่ามีพื้นที่ดิสก์เพียงพอที่จะสร้างจุดตรวจสอบ health daemon อยู่ใน cp_healthDaemon
ใน Checkpoint.cpp
Health daemon มีพฤติกรรมต่อไปนี้ที่สามารถกำหนดค่าได้:
-
ro.sys.cp_msleeptime
: ควบคุมความถี่ที่อุปกรณ์ตรวจสอบการใช้งานดิสก์ -
ro.sys.cp_min_free_bytes
: ควบคุมค่าต่ำสุดที่ daemon สุขภาพค้นหา -
ro.sys.cp_commit_on_full
: ควบคุมว่า health daemon จะรีบูตอุปกรณ์หรือยืนยันจุดตรวจสอบและดำเนินการต่อเมื่อดิสก์เต็ม
Checkpoint API
Checkpoint API ถูกใช้โดยคุณสมบัติ UDC สำหรับ API อื่นๆ ที่ใช้โดย UDC โปรดดูที่ IVold.aidl
โมฆะ startCheckpoint (ลอง int ใหม่)
จะสร้างจุดตรวจ.
เฟรมเวิร์กเรียกเมธอดนี้เมื่อพร้อมที่จะเริ่มการอัพเดต จุดตรวจสอบจะถูกสร้างขึ้นก่อนที่ระบบไฟล์จุดตรวจสอบ เช่น ข้อมูลผู้ใช้ จะถูกเมาท์ R/W หลังจากรีบูต หากจำนวนการลองใหม่เป็นค่าบวก API จะจัดการการติดตามการลองใหม่ และผู้อัปเดตจะเรียก needsRollback
เพื่อตรวจสอบว่าจำเป็นต้องย้อนกลับการอัปเดตหรือไม่ หากจำนวนการลองใหม่คือ -1
API จะเลื่อนไปตามการพิจารณาของ A/B bootloader
วิธีการนี้จะไม่ถูกเรียกเมื่อทำการอัปเดต A/B ปกติ
โมฆะกระทำการเปลี่ยนแปลง ()
ยอมรับการเปลี่ยนแปลง
เฟรมเวิร์กเรียกเมธอดนี้หลังจากรีบูตเมื่อการเปลี่ยนแปลงพร้อมที่จะคอมมิต สิ่งนี้ถูกเรียกก่อนที่ข้อมูล (เช่น รูปภาพ วิดีโอ SMS ใบเสร็จรับเงินของเซิร์ฟเวอร์) จะถูกเขียนลงในข้อมูลผู้ใช้และก่อน BootComplete
หากไม่มีการอัปเดตจุดตรวจสอบที่ใช้งานอยู่ วิธีการนี้จะไม่มีผลใดๆ
ยกเลิกการเปลี่ยนแปลง()
บังคับให้รีบูตและกลับสู่จุดตรวจ ละทิ้งการแก้ไขข้อมูลผู้ใช้ทั้งหมดตั้งแต่การรีบูตครั้งแรก
กรอบงานเรียกวิธีนี้หลังจากรีบูต แต่ก่อน commitChanges
retry_counter
จะลดลงเมื่อมีการเรียกใช้เมธอดนี้ รายการบันทึกถูกสร้างขึ้น
บูลต้องการย้อนกลับ ()
กำหนดว่าจำเป็นต้องมีการย้อนกลับหรือไม่
บนอุปกรณ์ที่ไม่ใช่จุดตรวจสอบ ให้คืนค่า 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 ต้องใช้พาร์ติชันข้อมูลเมตาเพื่อจัดเก็บจำนวนและคีย์การลองซ้ำของ nonbootloader ตั้งค่าพาร์ติชันข้อมูลเมตาและติดตั้งไว้ที่ /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
เตรียมใช้งานพาร์ติชันให้เป็นศูนย์ทั้งหมด
เพิ่มบรรทัดต่อไปนี้ใน BoardConfig.mk
:
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
อัพเดทระบบ
ระบบ F2FS
สำหรับระบบที่ใช้ F2FS เพื่อจัดรูปแบบข้อมูล ตรวจสอบให้แน่ใจว่า F2FS เวอร์ชันของคุณรองรับจุดตรวจสอบ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ ฟังก์ชันการทำงานของ Checkpoint ในระบบไฟล์ต่างๆ
เพิ่มแฟล็ checkpoint=fs
ไปยังส่วน <fs_mgr_flags>
ของ fstab สำหรับอุปกรณ์ที่ติดตั้งที่ /data
ระบบที่ไม่ใช่ F2FS
สำหรับระบบที่ไม่ใช่ F2FS ต้องเปิดใช้งาน dm-bow
ในการกำหนดค่าเคอร์เนล
เพิ่ม checkpoint=block
flag ให้กับส่วน <fs_mgr_flags>
ของ fstab สำหรับอุปกรณ์ที่ติดตั้งที่ /data
ตรวจสอบบันทึก
รายการบันทึกจะถูกสร้างขึ้นเมื่อมีการเรียก Checkpoint API
การตรวจสอบ
หากต้องการทดสอบการใช้งาน UDC ของคุณ ให้รันชุดการทดสอบ VtsKernelCheckpointTest