ซอฟต์รีสตาร์ท

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. สลับกลับไปเป็นเนมสเปซเมานต์บูตสแตรป
    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 จะถูกยกเลิกการต่อเชื่อม และอุปกรณ์ mapper อุปกรณ์หลักทั้งหมดที่ติดตั้งอยู่ด้านบนจะถูกทำลาย ถัดไป userdata จะถูกเมาท์โดยใช้เส้นทางโค้ดเดียวกันกับที่ใช้ในการบูตจุดตรวจสอบปกติ

หากใช้คีย์ริงระดับระบบไฟล์เพื่อจัดการคีย์ที่เข้ารหัสข้อมูลประจำตัว (CE) และคีย์ที่เข้ารหัสอุปกรณ์ (DE) คีย์จะสูญหายไปหลังจากยกเลิกการต่อเชื่อม userdata เพื่อให้กู้คืนคีย์ได้ เมื่อติดตั้งคีย์ให้กับคีย์ริงของระบบไฟล์ volold 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