Мягкий перезапуск (<= AOSP 14)

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 выполняет следующие шаги:

  1. Получает sys.powerctl=reboot,userspace .

  2. Создает отдельный процесс UserspaceRebootWatchdogThread() для мониторинга мягкого перезапуска.

  3. Запускает действие 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 .

  4. Запускает функцию DoUserspaceReboot , которая выполняет следующие действия:

    1. Отправляет SIGTERM процессам, запущенным после подключения userdata , и ожидает их остановки.
    2. По истечении таймаута отправляет SIGKILL для завершения всех запущенных процессов.
    3. Вызывает /system/bin/vdc volume reset .
    4. Отключает резервное устройство zRAM.
    5. Отключает активные пакеты APEX.
    6. Возвращается к пространству имен монтирования начальной загрузки.
    7. Запускает действие 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 .