Khởi động lại nhẹ nhàng

Android 11 hỗ trợ khởi động lại mềm, tức là khởi động lại trong thời gian chạy của các tiến trình trong không gian người dùng dùng để áp dụng các bản cập nhật yêu cầu khởi động lại (ví dụ: các bản cập nhật cho gói APEX). Hiện tại, khởi động lại mềm bị giới hạn ở các quy trình bắt đầu sau khi userdata được gắn kết.

Khởi động lại mềm được yêu cầu theo các cách sau:

  • Từ PowerManager , bằng cách gọi PowerManager.reboot(PowerManager.REBOOT_USERSPACE)

  • Từ shell, sử dụng adb shell svc power reboot userspace hoặc adb reboot userspace

Sau khi khởi động lại mềm, bộ nhớ mã hóa thông tin xác thực vẫn được mở khóa.

Nếu một thiết bị hỗ trợ khởi động lại mềm thì phương thức API PowerManager.isRebootingUserspace() sẽ trả về true và giá trị của thuộc tính hệ thống init.userspace_reboot.is_supported bằng 1 .

Nếu thiết bị không hỗ trợ khởi động lại mềm thì các lệnh gọi tới PowerManager.reboot(PowerManager.REBOOT_USERSPACE) , adb reboot userspaceadb shell svc power reboot userspace đều không thành công.

Thực hiện khởi động lại mềm

Sau khi yêu cầu khởi động lại mềm (thông qua PowerManager hoặc từ shell), init sẽ thực hiện các bước sau:

  1. Nhận sys.powerctl=reboot,userspace .

  2. Tạo một quy trình UserspaceRebootWatchdogThread() riêng biệt để theo dõi quá trình khởi động lại mềm.

  3. Kích hoạt một hành động userspace-reboot-requested , hành động này sẽ đặt lại tất cả các thuộc tính hệ thống có thể ảnh hưởng đến quá trình khởi động lại mềm. Tài sản bị ảnh hưởng:

    • 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

    Các thuộc tính trên phải được đặt lại trong trình tự khởi động. Nếu cần, bạn có thể đặt lại các thuộc tính bổ sung. Để biết ví dụ, hãy tham khảo hành động on userspace-reboot-requested trong rootdir/init.rc .

  4. Chạy hàm DoUserspaceReboot , hàm này thực hiện các hành động sau:

    1. Gửi SIGTERM đến các quy trình được bắt đầu sau khi userdata được gắn kết và đợi chúng dừng lại.
    2. Sau khi hết thời gian chờ, gửi SIGKILL để hủy mọi tiến trình đang chạy.
    3. /system/bin/vdc volume reset .
    4. Ngắt kết nối thiết bị sao lưu zRAM.
    5. Ngắt kết nối các gói APEX đang hoạt động.
    6. Chuyển về không gian tên gắn kết bootstrap.
    7. Kích hoạt hành động userspace-reboot-resume .

Nếu điểm kiểm tra hệ thống tệp được yêu cầu trước khi khởi động lại mềm, userdata sẽ được đưa vào chế độ điểm kiểm tra trong hành động userspace-reboot-fs-remount (xem phần sau để biết chi tiết). Khởi động lại mềm được xem xét sau khi sys.boot_completed property được đặt thành 1 . Khi kết thúc quá trình khởi động lại mềm, màn hình sẽ tắt và cần có sự tương tác rõ ràng của người dùng để đánh thức nó.

Điểm kiểm tra hệ thống tập tin

Nếu điểm kiểm tra hệ thống tệp được yêu cầu trước khi khởi động lại mềm, userdata sẽ được kết nối lại ở chế độ điểm kiểm tra trong quá trình khởi động lại mềm. Logic kết nối lại được triển khai trong hàm fs_mgr_remount_userdata_into_checkpointing và khác nhau giữa các phương pháp điểm kiểm tra. Cụ thể, khi userdata hỗ trợ:

  • Điểm kiểm tra cấp độ hệ thống tệp (ví dụ: f2fs ), userdata được kết nối lại với tùy chọn checkpoint=disable .

  • Điểm kiểm tra cấp độ khối (ví dụ: ext4 ), sau đó /data không được kết nối và tất cả các thiết bị ánh xạ thiết bị gốc mà nó được gắn lên trên đều bị hủy. Tiếp theo, userdata được gắn kết bằng cách sử dụng cùng một đường dẫn mã như được sử dụng trong quá trình khởi động điểm kiểm tra thông thường.

Nếu sử dụng khóa cấp hệ thống tệp để quản lý khóa được mã hóa thông tin xác thực (CE) và khóa được mã hóa thiết bị (DE), thì khóa sẽ bị mất sau khi ngắt kết nối userdata . Để cho phép khôi phục khóa, khi cài đặt khóa vào khóa hệ thống tệp, vold cũng cài đặt cùng một khóa thuộc loại fscrypt-provisioning cho khóa cấp phiên. Khi init_user0 được gọi, vold sẽ cài đặt lại các khóa trong khóa hệ thống tệp.

Dự phòng khởi động lại cứng

Để đảm bảo quá trình khởi động lại mềm không khiến thiết bị ở trạng thái không sử dụng được, Android 11 bao gồm một tính năng dự phòng khởi động lại cứng được kích hoạt khi đáp ứng một trong các điều kiện sau:

  • Thiết bị không khởi động được khởi động lại mềm (nghĩa là sys.init.userspace_reboot.in_progress=1 ) trong một khoảng thời gian chờ nhất định.
  • Một quá trình không dừng lại trong một thời gian chờ nhất định.
  • Thao tác /system/bin/vdc volume reset không thành công.
  • Việc ngắt kết nối thiết bị zRAM không thành công.
  • Gói APEX đang hoạt động ngắt kết nối không chính xác.
  • Nỗ lực gắn lại userdata vào chế độ điểm kiểm tra không thành công.
  • Một thiết bị không khởi động thành công (nghĩa là sys.boot_completed=1 ) trong một khoảng thời gian chờ nhất định.

Cấu hình trên mỗi thiết bị

Một số khía cạnh khởi động lại mềm có thể được điều chỉnh bằng cách thay đổi giá trị của các thuộc tính sau:

  • init.userspace_reboot.is_supported kiểm soát thời điểm thiết bị có thể thực hiện khởi động lại mềm. Nếu giá trị của thuộc tính này là false , 0 hoặc không được chỉ định thì các nỗ lực khởi động lại sẽ bị từ chối.
  • init.userspace_reboot.sigkill.timeoutmillis kiểm soát thời gian chờ tính bằng mili giây để dừng các quá trình nhận được tín hiệu SIGKILL . Nếu một trong các quá trình không dừng lại trong khoảng thời gian chờ nhất định thì quá trình khởi động lại dự phòng sẽ được kích hoạt.
  • init.userspace_reboot.sigterm.timeoutmillis kiểm soát thời gian chờ tính bằng mili giây để các quá trình nhận được tín hiệu SIGTERM chấm dứt. Tất cả các quá trình không kết thúc trong thời gian chờ nhất định sẽ nhận được tín hiệu SIGKILL .
  • init.userspace_reboot.started.timeoutmillis kiểm soát thời gian chờ tính bằng mili giây để khởi động lại mềm (nghĩa là sys.init.userspace_reboot.in_progress=1 ). Nếu thiết bị không khởi động được khởi động lại mềm trong khoảng thời gian chờ nhất định, quá trình khởi động lại cứng sẽ được kích hoạt.
  • init.userspace_reboot.userdata_remount.timeoutmillis kiểm soát thời gian chờ tính bằng mili giây để ngắt kết nối userdata . Nếu một thiết bị không thể ngắt kết nối userdata trong khoảng thời gian chờ nhất định, quá trình khởi động lại cứng sẽ được kích hoạt.
  • init.userspace_reboot.watchdog.timeoutmillis kiểm soát thời gian chờ để thiết bị khởi động thành công (nghĩa là sys.boot_completed=1 ). Nếu một thiết bị không khởi động được trong khoảng thời gian chờ nhất định, quá trình khởi động lại cứng sẽ được kích hoạt.

Tùy chỉnh hoạt ảnh trong khi khởi động lại mềm

Việc triển khai tham chiếu khởi động lại mềm bao gồm khả năng tùy chỉnh hoạt ảnh được hiển thị trong quá trình khởi động lại mềm.

Khi kết thúc hành động userspace-reboot-fs-remount , init khởi động dịch vụ bootanim . Dịch vụ này tìm kiếm sự tồn tại của các tệp hoạt ảnh sau, theo thứ tự được liệt kê và phát tệp đầu tiên nó tìm thấy:

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

Nếu không chỉ định tệp hoạt ảnh cụ thể khởi động lại mềm, bootanim sẽ hiển thị hoạt ảnh mặc định android .

Kiểm tra

Android 11 bao gồm cách triển khai tham chiếu về khởi động lại mềm. Ngoài ra, bạn có thể xác minh khởi động lại mềm bằng cách sử dụng các bài kiểm tra CTS trong UserspaceRebootHostTest .