ANR (Application Not Responding) é uma notificação do sistema no Android que aparece quando um aplicativo não responde à entrada dentro de 5 segundos. Ao contrário de falhas (erros lógicos sem bloqueio da IU) e lentidão (desaceleração sem parada completa), ANR é uma falha crítica registrada pelo sistema operacional: o Android exibe um diálogo “O aplicativo não responde” com opções para fechar ou aguardar. De acordo com Android Vitals Documentation, aplicativos com taxa de ANR acima de 0,5% recebem classificação mais baixa no Google Play e podem ser ocultados das recomendações. O diagnóstico inclui análise de /data/anr/traces.txt, uso de StrictMode e criação de perfil da thread principal.
Pontos principais
ANR (Application Not Responding) é um mecanismo de proteção ao usuário no Android que é acionado quando o aplicativo para de responder à entrada. O sistema rastreia o tempo de processamento de eventos: se o BroadcastReceiver não concluir onReceive em 10 segundos, o Service não retornar de onCreate em 20 segundos, ou o ContentProvider não responder em 15 segundos — o Android gera um ANR.
Quando ocorre um ANR, o Android exibe um diálogo do sistema sobre todas as janelas: “O aplicativo não responde. Fechar ou aguardar?” O usuário pode fechar o aplicativo ou aguardar sua recuperação. Se os ANRs ocorrerem com frequência, o usuário desinstala o aplicativo. O Google Play considera a taxa de ANR — a porcentagem de sessões com ANR — em seus algoritmos de classificação.
O iOS não tem um equivalente de ANR com um diálogo do sistema. Em vez disso, a Apple usa Watchdog, que encerra o processo com o código 0x8badf00d. O usuário não vê um diálogo — o aplicativo simplesmente fecha para a tela inicial. Isso torna o ANR no Android mais perceptível para o usuário, mas dá ao sistema mais informações de diagnóstico.
O ANR ocorre quando o sistema rastreia um tempo limite para um dos quatro tipos de componentes. Cada componente tem seu próprio limite de tempo.
BroadcastReceiver é executado na thread principal. Se onReceive iniciar uma requisição de rede síncrona, uma gravação longa no banco de dados, ou aguardar um bloqueio — um ANR ocorre dentro de 10 segundos. Solução: use goAsync() e WorkManager para processamento em segundo plano. Um cenário típico é receber uma notificação Push do FCM e salvar síncronamente no Room.
Service.onCreate e Service.onStartCommand têm um limite de 20 segundos. Se o serviço iniciar uma inicialização pesada (carregar bibliotecas, ler configuração da rede) na thread principal — o ANR é inevitável. Use IntentService (obsoleto) ou WorkManager para execução garantida em segundo plano.
ContentProvider.onCreate é executado antes de Application.onCreate e tem um limite de 15 segundos. Se o provedor realizar uma migração de banco de dados, carregar dicionários, ou inicializar SDK da rede — isso causa ANR na inicialização do aplicativo. Solução: inicialização preguiçosa, descarregar operações pesadas para WorkManager.
O Android fornece várias ferramentas para análise de ANR: desde logs do sistema até bibliotecas especializadas.
Em cada ANR, o Android salva o arquivo /data/anr/traces.txt com um dump de pilha de todas as threads do aplicativo. Encontre a thread “main” — o último método na pilha indica a causa. Padrões típicos: Thread.sleep(), InputStream.read(), BinderProxy.transact(). Para extrair o arquivo do dispositivo, use adb com privilégios de superusuário.
Firebase Crashlytics coleta automaticamente ANRs e os exibe no painel com rastreamento. Para Android 11+, os relatórios ANR vêm com a pilha completa da thread principal. A integração requer adicionar uma dependência e inicializar FirebaseApp em Application.onCreate.
CPU Profiler no Android Studio permite gravar rastreamentos do aplicativo e ver quais métodos consomem tempo de CPU. Ative “Record with method traces” e reproduza o cenário que causa o ANR. A linha do tempo mostrará quais métodos estavam sendo executados na thread principal no momento do travamento.
Exemplo de integração do Firebase Crashlytics para coleta de ANR no Android:
class App : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this)
FirebaseCrashlytics.getInstance()
.setCrashlyticsCollectionEnabled(true)
StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build())
}
}
Corrigir ANR significa principalmente mover todas as operações longas da thread principal para threads secundárias. Vamos ver técnicas específicas para cada tipo de componente.
WorkManager é a solução recomendada pelo Google para trabalho em segundo plano. Ele garante a execução da tarefa em uma thread secundária considerando o estado do dispositivo. Ao contrário do Service, o WorkManager não bloqueia a thread principal e é resiliente a reinicializações do aplicativo. Para BroadcastReceiver, use goAsync() e passe o PendingResult para WorkManager.
Execute todas as requisições de rede, operações de banco de dados e E/S de arquivos com Dispatchers.IO. A thread principal deve apenas atualizar a IU. Use viewModelScope para cancelamento automático de corrotinas quando a Activity for destruída. Evite runBlocking() em qualquer contexto — ele bloqueia síncronamente a thread atual.
Se o ContentProvider realizar inicialização lenta, use um mecanismo de carregamento preguiçoso: crie um provedor que retorne dados imediatamente e inicie a inicialização pesada através do WorkManager com um atraso. Isso evita ANR na inicialização do aplicativo, quando o sistema é mais sensível a atrasos.
Exemplo de uso correto do BroadcastReceiver com goAsync no Android:
class FcmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val pendingResult = goAsync()
WorkManager.getInstance(context!!)
.enqueue(OneTimeWorkRequest.from(NotificationWorker::class.java))
pendingResult.finish()
}
}
A melhor maneira de combater ANRs é preveni-los durante o desenvolvimento através de ferramentas e decisões arquiteturais.
StrictMode com as políticas detectNetwork() e detectDiskReads()/detectDiskWrites() habilitadas identifica potenciais ANRs durante o desenvolvimento. Em compilações Debug, defina penaltyDeath — qualquer violação causará uma falha imediata e o desenvolvedor verá o problema antes do commit.
Firebase Performance rastreia o tempo de execução de operações chave e mostra quais cenários excedem o limite de ANR. Configure traces personalizados para cada tela e requisição de rede. Se o tempo de execução exceder 3 segundos — é um ANR potencial que requer otimização.
Simule condições lentas: limite a velocidade da rede usando Network Link Conditioner no iOS ou Android Emulator. Diminua a leitura de disco através da emulação de memória lenta. ANR frequentemente se manifesta precisamente nessas condições; em dispositivos rápidos de desenvolvimento eles são invisíveis.
Perguntas frequentes
Android rastreia explicitamente o tempo de processamento de eventos na thread principal e exibe um diálogo ANR. O iOS usa Watchdog, que fecha forçosamente o aplicativo quando ele trava por mais de 10–20 segundos. ANR é uma característica da arquitetura do Android onde vários componentes (BroadcastReceiver, Service) têm tempos limite estritos.
No Android 11+ você pode obter o dump ANR via adb shell dumpsys dropbox --print data_app_anr. No Android 10 e anteriores, sem acesso root a /data/anr/traces.txt. Use Firebase Crashlytics — ele coleta relatórios ANR automaticamente para Android 11+.
O Google Play recomenda uma taxa de ANR abaixo de 0,5% — não mais que 5 ANRs por 1000 sessões. Um aplicativo com taxa acima de 1% recebe um aviso no Google Play Console e pode ser ocultado das recomendações. Idealmente, a taxa de ANR deve estar abaixo de 0,1%.
Uma corrotina em si não bloqueia a thread. Mas se dentro de uma corrotina você executar runBlocking na thread principal ou a corrotina for lançada com Dispatchers.Main e realizar uma operação longa de CPU — isso causará ANR. Use Dispatchers.IO para E/S e Dispatchers.Default para computações.
Use Android Emulator com um perfil “Slow Network” ou escreva um teste que chame Thread.sleep(6000) na thread principal. Inicie o aplicativo através do Debug e após 5 segundos você verá o diálogo ANR. Verifique se o logcat mostra um registro ANR com rastreamento.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também