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