Мягкий перезапуск

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 .