O que é um ANR e como afeta o desempenho de uma app?

O ANR (Application Not Responding) é o estado de erro do Android em que uma app deixa de responder à entrada do utilizador durante um período prolongado. Quando isto acontece, o sistema pode mostrar uma caixa de diálogo que dá ao utilizador a opção de esperar ou de fechar a app. A causa típica é o thread principal da app, também chamado thread de UI, estar ocupado com trabalho demorado, como chamadas de rede, consultas extensas a bases de dados ou cálculos pesados, ou estar à espera de um lock detido por outro thread.

Entre outras situações, o Android desencadeia um ANR se uma app não tiver respondido a um evento de entrada, como um toque no ecrã, no prazo de cinco segundos, ou se um broadcast receiver ou um serviço não terminar dentro dos limites de tempo definidos. Os ANR são um indicador de qualidade importante porque criam uma má experiência de utilizador, e o Google Play monitoriza a taxa de ANR através do Android vitals, onde uma taxa elevada pode afetar a visibilidade de uma app na loja. Os programadores previnem os ANR retirando o trabalho pesado do thread principal, por exemplo com corrotinas do Kotlin ou com o WorkManager.

O ANR (Application Not Responding) é um estado das apps Android em que uma aplicação não responde à entrada do utilizador dentro de um determinado prazo, normalmente 5 segundos. Pode ser causado por operações demoradas no thread principal que bloqueiam a interface de utilizador. Para evitar ANR, os programadores devem garantir que as tarefas pesadas são realizadas em segundo plano, o que melhora o desempenho e a experiência de utilizador da app.

Mais sobre ANR

O ANR (Application Not Responding) é um estado das apps Android em que a app não responde às ações do utilizador ou a eventos do sistema dentro de um determinado limite de tempo. Quando ocorre um ANR enquanto a app está em primeiro plano, o Android mostra uma caixa de diálogo em que o utilizador pode optar por esperar ou fechar a app. Para o utilizador, é sentido como um ecrã bloqueado, e os ANR, juntamente com as falhas (crashes), estão por isso entre os problemas de estabilidade mais graves de uma app Android.

Tecnicamente, um ANR é quase sempre causado pelo bloqueio do thread principal da app. O thread principal trata tanto do desenho da interface de utilizador como do processamento da entrada, pelo que, se estiver ocupado com trabalho demorado, a app não consegue responder. As causas típicas são chamadas de rede ou operações com ficheiros e bases de dados no thread principal, cálculos pesados, situações em que o thread principal aguarda por um lock detido por um thread em segundo plano e deadlocks entre threads.

O Android desencadeia um ANR em várias situações, cada uma com o seu limite de tempo:

  1. Eventos de entrada: Se a app não tiver respondido a um evento de entrada, como um toque ou a pressão de uma tecla, no prazo de cinco segundos.

  2. Broadcast receivers: Se um broadcast receiver não tiver terminado o processamento de uma mensagem dentro do limite de tempo do sistema, que é mais curto para broadcasts em primeiro plano do que para broadcasts em segundo plano.

  3. Serviços: Se um serviço não concluir os seus métodos de ciclo de vida a tempo, ou se um serviço em primeiro plano não chamar startForeground() pouco depois de ter sido iniciado.

Para encontrar e analisar ANR, os programadores podem utilizar o Android vitals na Google Play Console, que mostra a taxa de ANR e stack traces dos dispositivos dos utilizadores. Durante o desenvolvimento, o StrictMode pode revelar operações de disco e de rede não intencionais no thread principal, enquanto as ferramentas de profiling do Android Studio mostram onde o tempo é gasto. Ferramentas como o Firebase Crashlytics também podem recolher relatórios de ANR.

A forma mais eficaz de evitar ANR é manter o thread principal livre. As chamadas de rede, o acesso a bases de dados e os cálculos pesados devem ser executados em segundo plano, por exemplo com corrotinas do Kotlin num dispatcher adequado, e as tarefas mais demoradas podem ser agendadas com o WorkManager. Também é importante evitar locks mantidos durante muito tempo pelos quais o thread principal tenha de esperar e manter curto o trabalho nos broadcast receivers e nos métodos de ciclo de vida.

Os ANR têm importância para além do utilizador individual. O Google Play utiliza a taxa de ANR como uma das métricas de qualidade principais do Android vitals, e as apps que excedem os limiares de mau comportamento podem ver a sua visibilidade na loja reduzida. Em resumo, um ANR é um sinal de que uma app está a fazer trabalho no sítio errado, e a monitorização e prevenção sistemáticas dos ANR são uma parte importante do desenvolvimento de apps Android estáveis.

Perguntas frequentes sobre ANR

O que significa ANR no contexto das apps móveis?

ANR significa «Application Not Responding» (a aplicação não está a responder) e é um termo do Android. O fenómeno ocorre quando uma aplicação num dispositivo Android não responde à entrada do utilizador dentro de um determinado prazo, normalmente 5 segundos. Quando uma app sofre um ANR, isso pode dever-se a vários fatores, como operações demoradas no thread principal que bloqueiam a interface de utilizador, ou a espera por locks detidos por outros threads.

Para evitar situações de ANR, recomenda-se aos programadores que transfiram os cálculos pesados e as operações de rede para threads em segundo plano, para que o thread principal se mantenha responsivo às interações do utilizador. Isto pode ser conseguido com técnicas de programação assíncrona, como as corrotinas do Kotlin ou o WorkManager; a API AsyncTask, mais antiga, está descontinuada desde o Android 11 e não deve ser utilizada em código novo.

Em comparação com outros tipos de erro que podem ocorrer em apps móveis, um ANR é um estado crítico, pois afeta diretamente a experiência de utilizador ao impedir a interação com a app, o que pode levar a frustração e, potencialmente, à perda de utilizadores. Por isso, é importante que os programadores monitorizem e otimizem as suas apps para minimizar o risco de ANR.

Como pode um ANR afetar a experiência de utilizador de uma app?

No Android, ANR significa Application Not Responding. Ocorre quando o thread principal da app fica bloqueado durante demasiado tempo, normalmente cerca de cinco segundos, quando a app deveria estar a responder à entrada do utilizador. O sistema mostra então uma caixa de diálogo em que o utilizador pode optar por esperar ou fechar a app. Se o utilizador optar por fechá-la, a app é terminada da mesma forma que num fecho forçado.

Para o utilizador, é sentido como uma app que bloqueia e não responde aos toques. Isto é frustrante e pode levar os utilizadores a desinstalar a app ou a deixar uma má avaliação. Mesmo atrasos mais curtos que não desencadeiam uma caixa de diálogo de ANR fazem com que uma app pareça lenta. As tarefas pesadas devem, por isso, ser sempre retiradas do thread principal.

Que ferramentas podem os programadores utilizar para identificar e analisar problemas de ANR?

Os programadores podem utilizar várias ferramentas para identificar e analisar problemas de ANR (Application Not Responding), o que pode melhorar o desempenho e a experiência de utilizador da app. Eis três ferramentas fundamentais e as suas características:

  • Android vitals na Google Play Console: O Android vitals é uma funcionalidade da Google Play Console que dá aos programadores informações sobre o desempenho de uma app, incluindo os eventos de ANR. Ao analisar dados de utilizadores reais, os programadores podem identificar padrões e situações específicas em que ocorrem ANR. A ferramenta proporciona uma visão abrangente da estabilidade da app e ajuda a priorizar os problemas mais críticos.
  • Os profilers do Android Studio: Os profilers do Android Studio fornecem dados sobre o consumo de CPU, memória, rede e energia. Com o profiling da CPU, os programadores podem rastrear threads e identificar bloqueios que podem levar a ANR. A ferramenta é essencial para compreender como o código da app é executado e para otimizar o desempenho.
  • Firebase Crashlytics: O Firebase Crashlytics é um serviço de relatórios de falhas que também pode ajudar a identificar problemas de ANR. Fornece relatórios detalhados sobre eventos de ANR, incluindo stack traces e informações de contexto que podem ajudar os programadores a compreender a causa do problema. Com alertas em tempo real, os programadores podem reagir rapidamente a novos ANR e implementar correções.

A combinação de informações detalhadas do Android vitals, da análise com os profilers do Android Studio e dos relatórios abrangentes do Firebase Crashlytics permite aos programadores identificar e resolver problemas de ANR de forma eficaz, resultando numa app mais estável e responsiva.

Que estratégias podem ser implementadas para reduzir a ocorrência de ANR numa app?

Podem ser implementadas várias estratégias para reduzir a ocorrência de ANR (Application Not Responding) numa app. Um ANR ocorre quando uma app não responde à entrada do utilizador dentro de um determinado prazo, o que pode levar a uma má experiência de utilizador. Eis algumas estratégias eficazes para minimizar os ANR:

  • Processamento assíncrono: As operações pesadas, como pedidos de rede e operações com bases de dados, devem ser transferidas para threads em segundo plano com processamento assíncrono. Isto garante que o thread principal se mantém responsivo à entrada do utilizador.
  • Manter o thread de UI livre: As operações longas não devem ser realizadas no thread de UI. As corrotinas do Kotlin, o WorkManager ou, quando necessário, um Handler num thread em segundo plano mantêm o thread de UI livre de bloqueios; o AsyncTask está descontinuado.
  • Evitar a contenção de locks: O thread principal não deve esperar por locks detidos por threads em segundo plano, e as chamadas síncronas entre threads devem ser evitadas sempre que possível. Um tratamento de erros robusto também previne estados inesperados, como um tempo limite que nunca é tratado.
  • Utilizar o ViewModel: O ViewModel, combinado com corrotinas ou Flow, trata a obtenção e a atualização de dados de forma eficiente, sem bloquear o thread de UI. A API Loaders, mais antiga, está descontinuada desde o Android 9.
  • Profiling e otimização do desempenho: Ferramentas como os profilers do Android Studio ajudam a identificar e otimizar estrangulamentos no desempenho da app. Isto pode ajudar a encontrar e corrigir código ineficiente que pode levar a ANR.
  • Reduzir a complexidade dos layouts: Simplificar a estrutura dos layouts reduz o tempo necessário para renderizar os componentes da UI. Pode utilizar-se o ConstraintLayout ou outros tipos de layout eficientes para otimizar o desempenho da UI.
  • Pré-carregamento e cache: Pré-carregar e colocar dados em cache reduz o tempo de espera na obtenção de dados, o que pode melhorar a capacidade de resposta da app.

Globalmente, uma combinação de processamento assíncrono, um thread de UI livre, uma utilização cuidadosa de locks e a otimização do desempenho pode reduzir acentuadamente a ocorrência de ANR numa app. Estas estratégias ajudam a garantir que a app se mantém responsiva e proporciona uma melhor experiência de utilizador.

Como pode um ANR afetar a classificação de uma app nas lojas de apps?

O ANR (Application Not Responding) pode ter uma influência considerável na classificação de uma app no Google Play, pois afeta diretamente a experiência de utilizador e a avaliação global da app. Um ANR ocorre quando uma app não responde à entrada do utilizador dentro de um determinado prazo, o que resulta frequentemente em frustração e, potencialmente, em avaliações negativas.

O Google Play mede a taxa de ANR percecionada pelo utilizador no Android vitals, e as apps que excedem o limiar de mau comportamento podem ser apresentadas com menos destaque e podem mostrar um aviso na sua página da loja. ANR é um termo do Android, mas a App Store da Apple também é afetada indiretamente, pois os bloqueios no iOS levam a classificações mais baixas e a avaliações negativas, o que, por sua vez, pode afetar a visibilidade e a classificação de uma app nos resultados de pesquisa.

Para minimizar os ANR e melhorar a classificação de uma app nas lojas de apps, os programadores devem concentrar-se na otimização do desempenho da app. Isto pode incluir:

  • Melhorar o código da app para garantir que é executado de forma eficiente e sem atrasos desnecessários.
  • Implementar processamento assíncrono para impedir que o thread principal seja bloqueado por operações pesadas.
  • Testar e monitorizar regularmente o desempenho da app para identificar e corrigir potenciais problemas antes de afetarem os utilizadores.

Ao tomar estas medidas, os programadores podem não só melhorar a experiência de utilizador, como também aumentar as probabilidades de uma classificação mais elevada nas lojas de apps, o que pode levar a mais transferências e a uma base de utilizadores maior.

Que boas práticas devem ser seguidas para evitar ANR em futuros projetos de desenvolvimento de apps?

Para evitar ANR (Application Not Responding) em futuros projetos de desenvolvimento de apps, é importante seguir várias boas práticas que garantem uma experiência de utilizador responsiva e eficiente. Um ANR ocorre normalmente quando uma app não responde à entrada do utilizador dentro de um determinado prazo, o que pode levar a frustração e, potencialmente, à perda de utilizadores. Eis algumas estratégias que podem ajudar a minimizar o risco de ANR:

Um dos métodos mais eficazes para evitar ANR é garantir que todas as operações pesadas, como pedidos de rede, consultas a bases de dados e processamento de ficheiros, são realizadas em segundo plano. Isto pode ser conseguido com tarefas assíncronas ou threads que impedem o bloqueio do thread principal. Ao retirar estas operações do thread principal, a app pode manter-se responsiva à entrada do utilizador, mesmo enquanto realiza tarefas complexas.

Outra prática importante é otimizar o desempenho da app, reduzindo cálculos desnecessários e utilizando os recursos de forma eficiente. Isto pode incluir colocar em cache os dados utilizados com frequência para minimizar cálculos repetidos e utilizar algoritmos e estruturas de dados eficientes. Além disso, os programadores devem ter o cuidado de libertar os recursos que deixaram de ser necessários para evitar fugas de memória, que podem causar pausas frequentes de garbage collection e falhas por falta de memória.

Por fim, é crucial implementar um tratamento de erros e um registo de eventos abrangentes na app, juntamente com o StrictMode durante o desenvolvimento. Isto permite identificar e corrigir potenciais problemas antes de levarem a ANR. Ao monitorizar o desempenho da app e reagir rapidamente aos erros, os programadores podem garantir que a app se mantém estável e fiável. Globalmente, estas boas práticas podem ajudar a criar uma app robusta que proporciona uma experiência de utilizador fluida e sem interrupções.

ANR para manequins

ANR significa «Application Not Responding» (a aplicação não está a responder) e é algo que pode acontecer às apps num telemóvel Android. Imagina que estás a tentar usar uma app, mas ela bloqueia e deixa de responder aos toques e aos deslizes. É um pouco como quando um computador bloqueia e não responde, faças o que fizeres. Isto acontece quando a app está ocupada com uma tarefa pesada no sítio errado ou tem um erro que a impede de funcionar corretamente. Quando ocorre um ANR, o telemóvel mostra muitas vezes uma mensagem a perguntar se queres esperar que a app volte a funcionar ou fechá-la. É a forma de o telemóvel dizer que algo não está a funcionar como devia, e que pode ajudar tentar novamente mais tarde ou atualizar a app.

Deixe um comentário