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