Мягкие перезапуски (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.