ซอฟต์รีสตาร์ท (<= 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 หรือจากเชลล์) 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. เปลี่ยนกลับไปที่เนมสเปซการต่อเชื่อมบูตสแtrap
    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 และทำลายอุปกรณ์แมปอุปกรณ์หลักทั้งหมดที่ต่อเชื่อมอยู่ด้านบน จากนั้นระบบจะต่อเชื่อม 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 ได้ด้วย