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