Rescue Party

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

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 loops 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 Grupo de resgate reinicializa o dispositivo no modo de recuperação e pede ao usuário que faça uma redefinição de fábrica.

Implementação

O Grupo de resgate é ativado por padrão, e a implementação fica em /services/core/java/com/android/server/RescueParty.java. O Grupo de resgate recebe informações sobre eventos de inicialização e falha e é iniciado se:

  • O system_server for reinicializado mais de cinco vezes em cinco minutos.
  • Um app do sistema persistente falhar 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 verificar se ele é recuperado. Cada nível é progressivamente mais agressivo no que ele limpa ou redefine. O nível final pede ao usuário que redefina o dispositivo para a configuração original.

O Grupo de resgate não exige 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 que os usuários confirmem qualquer destruição de dados do usuário antes de continuar. 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 volte a funcionar, 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 tenham mais probabilidade de iniciar uma consulta de suporte ou garantia em vez de recuperar o dispositivo por conta própria.

Validação

O Grupo de resgate suprime todos os eventos de resgate quando o dispositivo tem uma conexão de dados USB ativa, porque esse é 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 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 falha do SystemUI de nível médio, execute:

    adb shell setprop debug.crash_sysui 1

Ambos os loops de falha iniciam a lógica de resgate. O Grupo de resgate 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 persistentes na seção Mensagens de aviso do pacote.