จุดตรวจข้อมูลผู้ใช้

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 การทดสอบ