Muitos usuários dependem muito dos smartphones e precisam de um dispositivo que funcione o tempo todo. No entanto, às vezes os dispositivos entram em loops de reinicialização, o que faz com que os usuários enviem 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 inclui um recurso que envia um "grupo de resgate" quando percebe que os principais componentes do sistema estão presos em ciclos de falha. O grupo de resgate passa então por uma série de ações para recuperar o dispositivo. Como último recurso, o Rescue Party reinicia o dispositivo no modo de recuperação e solicita que o usuário faça uma redefinição para a configuração original.
Esses recursos de recuperação não são obrigatórios de acordo com o Documento de definição de compatibilidade do Android, mas ainda podem ser úteis para reduzir os casos de suporte.
Implementação
O Rescue Party é ativado por padrão no Android 8.0, e a implementação está disponível 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 do sistema persistente falha mais de cinco vezes em 30 segundos.
Quando uma dessas situações é detectada, o grupo de resgate 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 é recuperado. Cada nível é progressivamente mais agressivo no que limpa ou redefine. O nível final solicita que o usuário redefina o dispositivo para a configuração original.
Não é necessário suporte a hardware especial para usar o Rescue Party. Se implementado,
o sistema de recuperação de um dispositivo precisa responder ao
comando --prompt_and_wipe_data
, e os dispositivos precisam
mostrar uma maneira de os usuários confirmarem a destruição dos dados 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 volte a funcionar, os fabricantes de dispositivos não devem adicionar níveis de resgate personalizados. O aumento do tempo com um dispositivo inoperante aumenta a probabilidade de os usuários iniciarem uma consulta de suporte ou garantia em vez de fazer a autorecuperação do dispositivo.
Validação
Todos os eventos de resgate são suprimidos quando o dispositivo tem uma conexão de dados USB ativa, porque esse é um sinal forte de que alguém está decifrando o dispositivo.
Para substituir essa supressão, execute:
adb shell setprop persist.sys.enable_rescue 1
A partir daí, é possível acionar 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
Para acionar um loop de falha de nível intermediário do SystemUI, execute:
adb shell setprop debug.crash_sysui 1
Ambos os loops de falha iniciam a lógica de resgate. Todas as operações de resgate também são
registradas nos registros persistentes do PackageManager armazenados em
/data/system/uiderrors.txt
para inspeção e depuração posteriores.
Esses registros persistentes também são incluídos em todos os relatórios de bugs na seção "Mensagens de aviso
do pacote".