ซอฟต์รีสตาร์ท (<= AOSP 14)

Android 11 รองรับการรีสตาร์ทแบบไม่เต็มรูปแบบ ซึ่งเป็นการรีสตาร์ทกระบวนการรันไทม์ในพื้นที่ผู้ใช้ที่ใช้เพื่อใช้การอัปเดตที่ต้องรีบูต (เช่น การอัปเดตแพ็กเกจ APEX) ปัจจุบันการรีสตาร์ทแบบไม่บังคับใช้ได้เฉพาะกับกระบวนการที่เริ่มหลังจากมีการติดตั้ง userdata

คุณขอให้ซอฟต์รีสตาร์ทได้โดยทำดังนี้

  • ตั้งแต่ PowerManager โดยโทรไปที่ PowerManager.reboot(PowerManager.REBOOT_USERSPACE)

  • จากเชลล์โดยใช้ adb shell svc power reboot userspace หรือ adb reboot userspace

หลังจากรีสตาร์ทแบบไม่สมบูรณ์ ที่เก็บข้อมูลที่เข้ารหัสด้วยข้อมูลเข้าสู่ระบบจะยังคงปลดล็อกอยู่

หากอุปกรณ์รองรับการรีสตาร์ทแบบไม่ลบข้อมูล PowerManager.isRebootingUserspace() เมธอด API จะแสดงผล true และค่า ของพร็อพเพอร์ตี้ระบบ init.userspace_reboot.is_supported จะเท่ากับ 1

หากอุปกรณ์ไม่รองรับการรีสตาร์ทแบบไม่ลบข้อมูล การเรียกใช้ PowerManager.reboot(PowerManager.REBOOT_USERSPACE), adb reboot userspace และ adb shell svc power reboot userspace จะล้มเหลว

การดำเนินการซอฟต์รีสตาร์ท

หลังจากส่งคำขอซอฟต์รีสตาร์ท (ผ่าน PowerManager หรือจาก Shell) init จะดำเนินการตามขั้นตอนต่อไปนี้

  1. รับ sys.powerctl=reboot,userspace

  2. แยกกระบวนการ UserspaceRebootWatchdogThread() เพื่อตรวจสอบซอฟต์รีสตาร์ท

  3. ทริกเกอร์userspace-reboot-requestedการดำเนินการ ซึ่งจะรีเซ็ตพร็อพเพอร์ตี้ของระบบทั้งหมด ที่อาจส่งผลต่อซอฟต์รีสตาร์ท ที่พักที่ได้รับผลกระทบ

    • sys.usb.config
    • sys.usb.state
    • sys.boot_completed
    • dev.bootcomplete
    • sys.init.updatable_crashing
    • sys.init.updatable_crashing_process_name
    • apexd.status
    • sys.user.0.ce_available
    • sys.shutdown.requested
    • service.bootanim.exit

    คุณควรตั้งค่าพร็อพเพอร์ตี้ข้างต้นอีกครั้งในระหว่างลำดับการบูต หากจำเป็น คุณ สามารถรีเซ็ตพร็อพเพอร์ตี้เพิ่มเติมได้ ดูตัวอย่างได้ที่ on userspace-reboot-requested การดำเนินการใน rootdir/init.rc

  4. เรียกใช้ฟังก์ชัน DoUserspaceReboot ซึ่งจะดำเนินการต่อไปนี้

    1. ส่ง SIGTERM ไปยังกระบวนการที่เริ่มต้นหลังจากมีการติดตั้ง userdata และ รอให้กระบวนการเหล่านั้นหยุดทำงาน
    2. หลังจากหมดเวลาแล้ว ให้ส่ง SIGKILL เพื่อหยุดกระบวนการที่กำลังทำงาน ทั้งหมด
    3. การโทร /system/bin/vdc volume reset
    4. ยกเลิกการเชื่อมต่ออุปกรณ์สำรอง zRAM
    5. ยกเลิกการเชื่อมต่อแพ็กเกจ APEX ที่ใช้งานอยู่
    6. เปลี่ยนกลับไปใช้เนมสเปซการติดตั้งของ Bootstrap
    7. ทริกเกอร์userspace-reboot-resume การดำเนินการ

หากมีการขอจุดตรวจสอบระบบไฟล์ก่อนซอฟต์รีสตาร์ท userdata จะมีการติดตั้งใหม่ในโหมดจุดตรวจสอบระหว่างการดำเนินการ userspace-reboot-fs-remount (ดูรายละเอียดในส่วนถัดไป) ระบบจะพิจารณาการรีสตาร์ทแบบไม่บังคับหลังจากตั้งค่า sys.boot_completed property เป็น 1 เมื่อสิ้นสุดซอฟต์รีสตาร์ท จอแสดงผลจะปิดอยู่และต้องมีการโต้ตอบของผู้ใช้โดยชัดแจ้งเพื่อปลุกระบบ

การตรวจสอบระบบไฟล์

หากมีการขอจุดตรวจสอบระบบไฟล์ก่อนซอฟต์รีสตาร์ท userdata จะมีการเชื่อมต่อใหม่ในโหมดจุดตรวจสอบระหว่างซอฟต์รีสตาร์ท โดยจะมีการใช้ตรรกะการติดตั้งใหม่ในฟังก์ชัน fs_mgr_remount_userdata_into_checkpointing และจะแตกต่างกันไปตามวิธีการตรวจสอบจุดย้อนกลับ โดยเฉพาะอย่างยิ่งเมื่อ userdata รองรับ

  • การสร้างจุดตรวจสอบระดับระบบไฟล์ (เช่น f2fs) userdata จะ ติดตั้งใหม่ด้วยตัวเลือก checkpoint=disable

  • การตรวจสอบจุดที่ระดับบล็อก (เช่น ext4) จากนั้นระบบจะยกเลิกการเชื่อมต่อ /data และอุปกรณ์ Device Mapper ทั้งหมดที่เชื่อมต่ออยู่ด้านบนจะถูก ทำลาย จากนั้นจะมีการติดตั้ง userdata โดยใช้เส้นทางโค้ดเดียวกันกับที่ใช้ในการ การรีบูตการตรวจสอบปกติ

หากใช้พวงกุญแจระดับระบบไฟล์เพื่อจัดการคีย์ที่เข้ารหัสด้วยข้อมูลเข้าสู่ระบบ (CE) และคีย์ที่เข้ารหัสด้วยอุปกรณ์ (DE) คีย์จะสูญหายหลังจากยกเลิกการเชื่อมต่อ userdata หากต้องการ อนุญาตการกู้คืนคีย์ เมื่อติดตั้งคีย์ไปยังพวงกุญแจของระบบไฟล์ vold จะติดตั้งคีย์เดียวกันประเภท fscrypt-provisioning ไปยังพวงกุญแจระดับเซสชันด้วย เมื่อเรียกใช้ init_user0 vold จะติดตั้งคีย์ในไฟล์ พวงกุญแจของระบบอีกครั้ง

เปลี่ยนไปใช้การรีบูตอย่างหนัก

เพื่อให้มั่นใจว่าซอฟต์รีสตาร์ทจะไม่ทําให้อุปกรณ์อยู่ในสถานะที่ใช้งานไม่ได้ Android 11 มีการเปลี่ยนไปใช้การรีบูตแบบฮาร์ดซึ่งจะทํางานเมื่อมีเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้

  • อุปกรณ์เริ่มซอฟต์รีสตาร์ท (นั่นคือ sys.init.userspace_reboot.in_progress=1) ภายในระยะหมดเวลาที่กำหนดไม่สำเร็จ
  • กระบวนการหยุดทำงานไม่สำเร็จภายในระยะหมดเวลาที่กำหนด
  • การดำเนินการ /system/bin/vdc volume reset ไม่สำเร็จ
  • การเลิกเมานต์อุปกรณ์ zRAM ไม่สำเร็จ
  • แพ็กเกจ APEX ที่ใช้งานอยู่จะเลิกเมานต์อย่างไม่ถูกต้อง
  • ความพยายามในการติดตั้ง userdata ใหม่ในโหมดการตรวจสอบจุดกู้คืนล้มเหลว
  • อุปกรณ์เปิดเครื่องไม่สำเร็จ (กล่าวคือ sys.boot_completed=1) ภายใน ระยะหมดเวลาที่กำหนด

การกำหนดค่าต่ออุปกรณ์

คุณปรับแต่งบางแง่มุมของซอฟต์รีสตาร์ทได้โดยการเปลี่ยนค่าของพร็อพเพอร์ตี้ต่อไปนี้

  • init.userspace_reboot.is_supported ควบคุมเวลาที่อุปกรณ์สามารถทำการซอฟต์รีสตาร์ท หากค่าของพร็อพเพอร์ตี้นี้เป็น false, 0 หรือไม่ได้ระบุ ระบบจะปฏิเสธการพยายามรีสตาร์ท
  • init.userspace_reboot.sigkill.timeoutmillis ควบคุมการหมดเวลาเป็นมิลลิวินาทีสำหรับกระบวนการที่ได้รับสัญญาณ SIGKILL เพื่อหยุด หากกระบวนการใดกระบวนการหนึ่งหยุดทำงานไม่สำเร็จภายในระยะหมดเวลาที่กำหนด ระบบจะทริกเกอร์การเปลี่ยนไปใช้การรีบูตแบบฮาร์ด
  • init.userspace_reboot.sigterm.timeoutmillis ควบคุมการหมดเวลาเป็นมิลลิวินาทีสำหรับกระบวนการที่ได้รับสัญญาณ SIGTERM เพื่อสิ้นสุด กระบวนการทั้งหมด ที่สิ้นสุดไม่สำเร็จภายในระยะหมดเวลาที่กำหนดจะได้รับสัญญาณ SIGKILL
  • init.userspace_reboot.started.timeoutmillis ควบคุมการหมดเวลาเป็นมิลลิวินาทีสำหรับการเริ่มซอฟต์รีสตาร์ท (นั่นคือ sys.init.userspace_reboot.in_progress=1) หากอุปกรณ์เริ่มซอฟต์รีสตาร์ทไม่สำเร็จภายในระยะเวลาที่กำหนด ระบบจะเรียกใช้การเปลี่ยนไปใช้ฮาร์ดรีบูตแทน
  • init.userspace_reboot.userdata_remount.timeoutmillis ควบคุมระยะหมดเวลาเป็นมิลลิวินาทีเพื่อยกเลิกการเชื่อมต่อ userdata หากอุปกรณ์ยกเลิกการเชื่อมต่อuserdata ภายในระยะหมดเวลาที่กำหนดไม่สำเร็จ ระบบจะกลับไปใช้การรีบูตแบบฮาร์ด
  • init.userspace_reboot.watchdog.timeoutmillis ควบคุมการหมดเวลาสำหรับ อุปกรณ์ในการบูตให้สำเร็จ (นั่นคือ sys.boot_completed=1) หากอุปกรณ์ บูตไม่สำเร็จภายในระยะเวลาที่กำหนด ระบบจะเรียกใช้การเปลี่ยนไปใช้การรีบูตแบบฮาร์ด

ปรับแต่งภาพเคลื่อนไหวระหว่างซอฟต์รีสตาร์ท

การใช้งานซอฟต์รีสตาร์ทอ้างอิงรวมถึงความสามารถในการปรับแต่งภาพเคลื่อนไหวที่แสดงระหว่างซอฟต์รีสตาร์ท

เมื่อสิ้นสุดการดำเนินการ userspace-reboot-fs-remount init จะเริ่มบริการ bootanim บริการนี้จะค้นหาไฟล์ภาพเคลื่อนไหวต่อไปนี้ตามลำดับที่ระบุไว้ และเล่นไฟล์แรกที่พบ

  • /product/media/userspace-reboot.zip
  • /oem/media/userspace-reboot.zip
  • /system/media/userspace-reboot.zip

หากไม่ได้ระบุไฟล์ภาพเคลื่อนไหวเฉพาะสำหรับซอฟต์รีสตาร์ท bootanim จะแสดงภาพเคลื่อนไหว android เริ่มต้น

การทดสอบ

Android 11 มีการติดตั้งใช้งานอ้างอิงของ ซอฟต์รีสตาร์ท นอกจากนี้ คุณยังยืนยันซอฟต์รีสตาร์ทได้โดยใช้การทดสอบ CTS ใน UserspaceRebootHostTest