В 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.configsys.usb.statesys.boot_completeddev.bootcompletesys.init.updatable_crashingsys.init.updatable_crashing_process_nameapexd.statussys.user.0.ce_availablesys.shutdown.requestedservice.bootanim.exit
Указанные выше свойства должны быть заданы снова во время загрузки. При необходимости вы можете сбросить дополнительные свойства. Примеры можно найти в разделе о действии
on userspace-reboot-requestedвrootdir/init.rc.Выполняет функцию
DoUserspaceReboot, которая выполняет следующие действия:- Отправляет сигнал
SIGTERMпроцессам, запущенным после монтированияuserdata, и ожидает их остановки. - По истечении времени ожидания отправляет сигнал
SIGKILL, чтобы завершить все запущенные процессы. - Звонки
/system/bin/vdc volume reset. - Отключает резервное устройство zRAM.
- Отключает активные пакеты APEX.
- Переключает обратно на пространство имен монтирования начальной загрузки.
- Запускает действие
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.