Rescue Party

Os usuários dependem dos smartphones e precisam de um dispositivo funcionando o tempo todo. No entanto, às vezes, os dispositivos entram em loops de reinicialização, o que faz com que os usuários abram tíquetes de suporte ou consultas de garantia. Esse processo é frustrante para os usuários e caro para fabricantes de dispositivos e operadoras.

O Android 8.0 (nível 26 da API) e versões mais recentes incluem um recurso que aciona um processo de resgate quando detecta componentes principais do sistema presos em ciclos de falha. Nesse sinal, o recurso Grupo de resgate passa por uma série de ações para recuperar o dispositivo. Como último recurso, o Rescue Party reinicializa o dispositivo no modo de recuperação e pede que o usuário faça uma redefinição de fábrica.

Implementação

A Rescue Party está ativada por padrão, e a implementação fica em /services/core/java/com/android/server/RescueParty.java. O Rescue Party recebe informações sobre eventos de inicialização e falha e é iniciado se:

  • O system_server é reiniciado mais de cinco vezes em cinco minutos.
  • Um app de sistema persistente falha mais de cinco vezes em 30 segundos.

Quando o grupo de resgate detecta uma dessas situações, ele passa para o próximo nível de resgate, processa a tarefa associada a esse nível e permite que o dispositivo continue para ver se ele se recupera. Cada nível é progressivamente mais agressivo no que limpa ou redefine. O nível final solicita que o usuário faça uma redefinição de fábrica do dispositivo.

O Rescue Party não requer suporte especial de hardware. Se implementado, o sistema de recuperação de um dispositivo precisa responder ao comando --prompt_and_wipe_data, e os dispositivos precisam oferecer uma maneira para os usuários confirmarem a destruição dos dados do usuário antes de prosseguir. O sistema de recuperação também precisa dar ao usuário a opção de tentar inicializar o dispositivo novamente.

Como cada nível de resgate pode adicionar até cinco minutos antes que um dispositivo possa ser operado novamente, os fabricantes de dispositivos não devem adicionar níveis de resgate personalizados. O aumento do tempo com um dispositivo inoperante faz com que os usuários iniciem uma consulta de suporte ou garantia em vez de recuperar o dispositivo por conta própria.

Validação

O Rescue Party suprime todos os eventos de resgate quando o dispositivo tem uma conexão de dados USB ativa, porque isso é um sinal forte de que alguém está depurando o dispositivo.

Para substituir essa supressão, execute:

adb shell setprop persist.sys.enable_rescue 1

Em seguida, acione um loop de falha do sistema ou da interface:

  • Para acionar um loop de falha de system_server de baixo nível, execute:

    adb shell setprop debug.crash_system 1
    adb shell stop
    adb shell start
  • Para acionar um loop de falhas de nível médio do SystemUI, execute:

    adb shell setprop debug.crash_sysui 1

Os dois loops de falha iniciam a lógica de resgate. O Rescue Party também registra todas as operações de resgate nos registros persistentes do PackageManager armazenados em /data/system/uiderrors.txt para inspeção e depuração posteriores. Os relatórios de bugs também incluem esses registros permanentes na seção Mensagens de aviso do pacote.