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