Android 11 поддерживает мягкие перезапуски, которые представляют собой перезапуски процессов в пользовательском пространстве, используемые для применения обновлений, требующих перезагрузки (например, обновлений пакетов APEX). В настоящее время мягкий перезапуск ограничен процессами, запущенными после монтирования userdata
.
Мягкий перезапуск запрашивается следующими способами:
Из
PowerManager
, вызвавPowerManager.reboot(PowerManager.REBOOT_USERSPACE)
Из оболочки, используя
adb shell svc power reboot userspace
илиadb reboot userspace
После мягкого перезапуска зашифрованное хранилище учетных данных остается разблокированным.
Если устройство поддерживает мягкий перезапуск, то метод API PowerManager.isRebootingUserspace()
возвращает 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.
- Возвращает пространство имен монтирования bootstrap.
- Запускает действие
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
.