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 .