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
จะดำเนินการตามขั้นตอนต่อไปนี้
ได้รับ
sys.powerctl=reboot,userspace
แยกกระบวนการ
UserspaceRebootWatchdogThread()
แยกต่างหากเพื่อตรวจสอบการรีสตาร์ทแบบเบาทริกเกอร์การดำเนินการ
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
เรียกใช้ฟังก์ชัน
DoUserspaceReboot
ซึ่งจะดําเนินการต่อไปนี้- ส่ง
SIGTERM
ไปยังกระบวนการที่เริ่มต้นขึ้นหลังจากมีการต่อเชื่อมuserdata
แล้ว และรอให้กระบวนการเหล่านั้นหยุด - หลังจากหมดเวลาแล้ว ระบบจะส่ง
SIGKILL
เพื่อหยุดกระบวนการที่ทำงานอยู่ - การโทร
/system/bin/vdc volume reset
- ยกเลิกการต่อเชื่อมอุปกรณ์สำรองข้อมูล zRAM
- ยกเลิกการต่อเชื่อมแพ็กเกจ APEX ที่ใช้งานอยู่
- เปลี่ยนกลับไปที่เนมสเปซการต่อเชื่อมบูตสแtrap
- ทริกเกอร์การดำเนินการ
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
ได้ด้วย