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.
- Возвращается к пространству имен монтирования начальной загрузки.
- Запускает действие
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 .