Мягкий перезапуск (<= 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. Возвращает пространство имен монтирования bootstrap.
    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 .