Android 11 hỗ trợ khởi động lại mềm, tức là
thời gian chạy khởi động lại các quy trình trong không gian người dùng được 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ập nhật các gói APEX). Hiện tại, mềm
chỉ có thể khởi động lại những quy trình bắt đầu sau khi userdata
được kết nối.
Bạn cần yêu cầu khởi động lại theo các cách sau đây:
Từ
PowerManager
, bằng cách gọiPowerManager.reboot(PowerManager.REBOOT_USERSPACE)
Từ shell, sử dụng
adb shell svc power reboot userspace
hoặcadb reboot userspace
Sau khi khởi động lại mềm, bộ nhớ được mã hoá dành cho thông tin đăng nhập vẫn được mở khoá.
Nếu thiết bị hỗ trợ tính năng khởi động lại mềm, thì
Phương thức API PowerManager.isRebootingUserspace()
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ợ chế độ khởi động lại mềm, hãy gọi đến
PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
, adb reboot
userspace
và adb shell svc power reboot userspace
không thành công.
Quá trình thực thi 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ừ một shell),
init
sẽ thực hiện các bước sau:
Nhận
sys.powerctl=reboot,userspace
.Phát triển nhánh riêng
UserspaceRebootWatchdogThread()
để theo dõi quá trình khởi động lại mềm.Kích hoạt một hành động
userspace-reboot-requested
, thao tác này sẽ đặt lại toàn bộ hệ thống các thuộc tính có thể ảnh hưởng đến quá trình khởi động lại mềm. Các cơ sở lưu trú 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
Bạn phải đặt lại các thuộc tính trên trong quá trình khởi động. Nếu cần, bạn có thể đặt lại các thuộc tính khác. Ví dụ: tham khảo
on userspace-reboot-requested
hành động trongrootdir/init.rc
.Chạy
DoUserspaceReboot
, thực hiện các hành động sau:- Gửi
SIGTERM
đến các quy trình đã bắt đầu sau khiuserdata
được kết nối và chờ chúng dừng lại. - Sau khi hết thời gian chờ, gửi
SIGKILL
để loại bỏ mọi lệnh đang chạy các quy trình. - Gọi
/system/bin/vdc volume reset
. - Ngắt kết nối thiết bị sao lưu zRAM.
- Huỷ kết nối các gói APEX đang hoạt động.
- Chuyển trở lại không gian tên gắn kết khởi động.
- Kích hoạt
userspace-reboot-resume
hành động.
- Gửi
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
được gắn lại vào chế độ kiểm tra trong
Hành động userspace-reboot-fs-remount
(xem phần sau để biết chi tiết). Đáp
sẽ cân nhắc khởi động lại sau khi đặt sys.boot_completed property
đến 1
. Khi kết thúc quá trình khởi động lại, màn hình sẽ vẫn tắt và
cần có tương tác rõ ràng của người dùng để đánh thức thiết bị.
Điểm kiểm tra hệ thống tệp
Nếu có yêu cầu cho điểm kiểm tra của hệ thống tệp trước khi khởi động lại mềm,
userdata
được gắn lại ở chế độ điểm kiểm tra trong quá trình khởi động lại mềm.
Logic gắn lại được triển khai trong
fs_mgr_remount_userdata_into_checkpointing
và khác nhau giữa các phương thức điểm kiểm tra. Cụ thể, khi
userdata
hỗ trợ:
Kiểm tra ở cấp hệ thống tệp (ví dụ:
f2fs
),userdata
là đã kết nối lại bằng tuỳ chọncheckpoint=disable
.Kiểm tra cấp khối (ví dụ:
ext4
), sau đó/data
bị ngắt kết nối và tất cả thiết bị liên kết của thiết bị chính được gắn trên đó bị huỷ bỏ. Tiếp theo,userdata
được liên kết bằng cùng một đường dẫn mã như được sử dụng trong quy trình khởi động thông thường.
Nếu bạn dùng phương thức khoá cấp hệ thống tệp để quản lý thông tin đăng nhập đã mã hoá (CE) và
khoá được mã hoá theo thiết bị (DE), thì các khoá sẽ bị mất sau khi userdata
ngắt kết nối. Người nhận
cho phép khôi phục khoá, khi cài đặt khoá vào quy trình khoá hệ thống tệp, vold
cài đặt cùng một khoá thuộc loại fscrypt-provisioning
vào cấp phiên hoạt động
bộ khoá. Khi init_user0
được gọi, vold
sẽ cài đặt lại các khoá trong tệp
khoá hệ thống.
Dự phòng cho 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ị rơi vào trạng thái không sử dụng được, Android 11 cung cấp tính năng dự phòng cho quá trình khởi động lại cứng được kích hoạt khi một trong các điều kiện sau được đáp ứng:
- Một thiết bị không khởi động được mềm khởi động lại (tức là
sys.init.userspace_reboot.in_progress=1
) trong một khoảng thời gian chờ nhất định. - Một quy 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. - Không ngắt kết nối thiết bị zRAM.
- Gói APEX đang hoạt động ngắt kết nối không chính xác.
- Không gắn lại được
userdata
vào chế độ kiểm tra. - Một thiết bị không khởi động được (tức là
sys.boot_completed=1
) trong một thời gian chờ nhất định.
Cấu hình theo từng thiết bị
Bạn có thể điều chỉnh một số khía cạnh của tính năng khởi động lại mềm bằng cách thay đổi giá trị của các thuộc tính sau thuộc tính:
init.userspace_reboot.is_supported
kiểm soát thời điểm một thiết bị có thể thực hiện một 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 lượt khởi động lại sẽ bị từ chối.init.userspace_reboot.sigkill.timeoutmillis
kiểm soát thời gian chờ trong mili giây để dừng các quy trình nhận được tín hiệuSIGKILL
. Nếu một trong số các quy trình không dừng lại trong thời gian chờ đã cho, sau đó tiến trình dự phòng khởi động lại được kích hoạt.init.userspace_reboot.sigterm.timeoutmillis
kiểm soát thời gian chờ trong mili giây đối với những quy trình nhận được tín hiệuSIGTERM
cần chấm dứt. Tất cả các quy trình không chấm dứt được trong thời gian chờ đã cho sẽ nhận được mã Tín hiệuSIGKILL
.init.userspace_reboot.started.timeoutmillis
kiểm soát thời gian chờ trong mili giây để khởi động lại mềm (tức làsys.init.userspace_reboot.in_progress=1
). Nếu thiết bị không khởi động mềm được khởi động lại trong một khoảng thời gian chờ nhất định, một trường hợp dự phòng khởi động lại cứng được kích hoạt.init.userspace_reboot.userdata_remount.timeoutmillis
kiểm soát thời gian chờ trong mili giây để ngắt kết nốiuserdata
. Nếu thiết bị không thể ngắt kết nốiuserdata
trong thời gian chờ nhất định, một phương án dự phòng cho khởi động lại cứng được kích hoạt.init.userspace_reboot.watchdog.timeoutmillis
kiểm soát thời gian chờ cho một thiết bị để khởi động thành công (tức làsys.boot_completed=1
). Nếu một thiết bị không khởi động được trong thời gian chờ đã cho, phương án dự phòng cho khởi động cứng là đã kích hoạt.
Tuỳ chỉnh ảnh động trong quá trình khởi động lại mềm
Quá trình triển khai tham chiếu của quá trình khởi động lại mềm bao gồm khả năng tuỳ chỉnh ảnh động 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
sẽ bắt đầu
Dịch vụ bootanim
. Dịch vụ này tìm kiếm sự tồn tại của các
tệp ảnh động, theo thứ tự được liệt kê và phát tệp đầu tiên được tìm thấy:
/product/media/userspace-reboot.zip
/oem/media/userspace-reboot.zip
/system/media/userspace-reboot.zip
Nếu bạn không chỉ định tệp ảnh động cụ thể nào trong quá trình khởi động lại, bootanim
sẽ hiển thị một
ảnh động mặc định android
.
Thử nghiệm
Android 11 triển khai tham chiếu của một
khởi động lại mềm. Ngoài ra, bạn có thể xác minh quá trình khởi động lại mềm bằng CTS
thử nghiệm ở
UserspaceRebootHostTest
.