Пользователи полагаются на свои телефоны и нуждаются в работающем устройстве в любое время. Однако иногда устройства попадают в циклы перезагрузки, из-за чего пользователи обращаются в службу поддержки или запрашивают гарантийное обслуживание. Это неудобно для пользователей и дорого для производителей устройств и операторов связи.
В Android 8.0 (уровень API 26) и более поздних версиях есть функция, которая запускает процесс восстановления, когда обнаруживает, что основные системные компоненты застряли в цикле сбоев. В этом случае функция Rescue Party выполняет ряд действий по восстановлению устройства. В крайнем случае Rescue Party перезагружает устройство в режиме восстановления и предлагает пользователю сбросить настройки до заводских.
Реализация
Rescue Party включена по умолчанию, а ее реализация находится в файле /services/core/java/com/android/server/RescueParty.java. Rescue Party получает информацию о событиях загрузки и сбоях и запускается, если:
- Устройство
system_serverперезапускается более пяти раз за пять минут. - Системное приложение, которое постоянно работает в фоновом режиме, зависает более пяти раз за 30 секунд.
Когда Rescue Party обнаруживает одну из этих ситуаций, она переходит на следующий уровень восстановления, выполняет задачу, связанную с этим уровнем, и позволяет устройству продолжить работу, чтобы проверить, восстановится ли оно. Каждый уровень все более агрессивно очищает или сбрасывает данные. На последнем уровне пользователю предлагается сбросить настройки устройства до заводских.
Для работы Rescue Party не требуется специальная аппаратная поддержка. Если такая система реализована, она должна отвечать на команду --prompt_and_wipe_data, а на устройствах должна быть предусмотрена возможность подтверждения пользователем удаления данных перед его выполнением. Система восстановления также должна предлагать пользователю возможность повторной загрузки устройства.
Поскольку каждый уровень восстановления может добавить до пяти минут до того, как устройство снова станет работоспособным, производителям устройств не следует добавлять собственные уровни восстановления. Если устройство не работает долго, пользователи с большей вероятностью обратятся в службу поддержки или за гарантийным обслуживанием, а не попытаются восстановить его самостоятельно.
Проверка
Rescue Party подавляет все события восстановления, когда устройство подключено к USB для передачи данных, поскольку это явный признак того, что кто-то отлаживает устройство.
Чтобы отменить это подавление, выполните следующую команду:
adb shell setprop persist.sys.enable_rescue 1Затем запустите цикл сбоев системы или интерфейса:
Чтобы запустить цикл сбоев на низком уровне
system_server, выполните следующую команду:adb shell setprop debug.crash_system 1adb shell stopadb shell startЧтобы запустить цикл сбоев SystemUI среднего уровня, выполните следующую команду:
adb shell setprop debug.crash_sysui 1
Оба цикла сбоев запускают логику восстановления. Кроме того, Rescue Party записывает все операции по восстановлению в постоянные журналы PackageManager, которые хранятся в /data/system/uiderrors.txt. Это позволяет в дальнейшем проверять и отлаживать систему. Отчеты об ошибках также содержат эти постоянные журналы в разделе Предупреждения о пакетах.