Depurar seu app Android com base em tags ANR no painel do Crashlytics

Os erros com a mensagem "O aplicativo não está respondendo" (ANR) são acionados quando a linha de execução de interface do aplicativo ficam sem responder por mais de cinco segundos. Saiba mais sobre os ANRs e os diagnósticos desses tipos de erro na documentação do Android.

Além disso, o Crashlytics pode ajudar a identificar linhas de execução específicas que estejam apresentando problemas. Analisamos os ANRs e, em seguida, marcamos as linhas de execução aplicáveis no painel do Crashlytics para dar dicas sobre como depurar o ANR.

Veja nas próximas seções o que cada tag de ANR significa, um exemplo aplicado e uma solução recomendada para fazer a depuração desse erro.

Triggered ANR

Uma linha de execução que foi bloqueada por muito tempo e acionou o ANR é anotada com a tag Triggered ANR.

A linha de execução problemática pode ser a linha principal do app ou qualquer linha de execução que não responda. Ainda assim, a linha de execução marcada como Triggered ANR pode ou não ser a causa real do ANR. Para fornecer insights sobre como depurar e corrigir esses ANRs, o Crashlytics também marca outras linhas de execução envolvidas no ANR. Saiba mais sobre as outras tags que podem ser aplicadas a uma linha de execução nas próximas seções desta página.

Deadlocked

Todas as linhas de execução envolvidas em um impasse que resultou no ANR são anotadas com a tag Deadlocked.

Um impasse ocorre quando uma linha de execução entra em um estado de espera porque um recurso necessário é mantido por outra, que também está aguardando um recurso mantido pela primeira. Se a linha de execução principal do app estiver nessa situação, é provável que erros ANRs aconteçam.

Recomendação

Observe as linhas de execução envolvidas no impasse e verifique os recursos/bloqueios adquiridos por elas. Consulte Impasse e Algoritmos de prevenção de impasse para encontrar possíveis soluções.

IO Root blocking

Qualquer linha de execução que estivesse executando operações de E/S com lentidão e que tenha bloqueado a linha de execução Triggered ANR é anotada com a tag IO Root blocking. Se Triggered ANR não for bloqueada por outras linhas de execução, a IO Root blocking também vai ser uma Root blocking.

Recomendação

Em geral, o app não deve executar operações de E/S de alto custo na linha de execução principal. Se a linha de execução principal for IO Root blocking, também é possível usar o Modo restrito para identificar operações de E/S não intencionais que acontecem na linha de execução principal.

Root blocking

Qualquer linha de execução que bloqueou a linha de execução com a tag Triggered ANR é anotada com a tag Root blocking. Se uma linha de execução for marcada como Root blocking e Triggered ANR, então não há outras fazendo o bloqueio.

Se alguma linha de execução Triggered ANR estiver esperando (temporariamente ou não) outras linhas, ela vai ser Root blocking. Uma linha de execução pode ser uma causa raiz do ANR por vários motivos.

Recomendação

Minimize o trabalho intensivo da CPU na linha de execução principal. Use as linhas de execução de worker ou em segundo plano para tarefas de uso intensivo da CPU.

Minimize o trabalho intensivo de E/S, como o carregamento de um banco de dados, na linha de execução principal.

Unknown root cause

As linhas de execução que foram acionadas pelo ANR, mas que estavam inativas quando o erro ocorreu, são marcadas como Unknown root cause. O Crashlytics não tem informações suficientes para determinar a causa raiz. Não há um motivo claro para esse ANR ter acontecido.

Recomendação

Siga as recomendações gerais sobre como evitar erros ANRs. Por exemplo, identifique os lugares no seu código em que a linha de execução principal do app pode ficar ocupada por mais de cinco segundos.