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