Resolver problemas de performance comuns

Para oferecer uma experiência de app tranquila, estável e eficiente em termos de bateria, é necessário identificar e resolver gargalos comuns de desempenho em estabilidade, renderização da interface, consumo de memória, trabalho em segundo plano, latência de inicialização e otimização de build.

Os guias nesta seção explicam o comportamento da plataforma Android para cada tipo de problema e mostram como diagnosticar, criar perfis e corrigir usando ferramentas como o Android Studio Profiler, Perfetto, Logcat e ApplicationExitInfo.

Estabilidade

  • ANRs:diagnostique e corrija erros do tipo "O app não está respondendo" (ANR) causados por linhas de execução de interface bloqueadas, E/S da linha de execução principal, disputa de bloqueio ou broadcast receivers lentos.
  • Falhas:leia rastreamentos de pilha, inspecione a saída do Logcat e evite exceções não gerenciadas e sinais nativos.

Renderização e inicialização

  • Renderização lenta:identifique e corrija frames de interface descartados ou congelados (>16ms e >700ms) causados por layouts caros, vinculações ou bloqueios da linha de execução principal.
  • Sessões lentas (somente jogos):meça o ritmo de frames com SurfaceFlinger e otimize as taxas de frames do jogo usando o Android Frame Pacing (Swappy), o Vulkan e o Android Dynamic Performance Framework (ADPF).
  • Tempo de inicialização do app:entenda os detalhes internos de inicialização a frio, com estado salvo e a quente, meça o tempo para exibição inicial (TTID) e o tempo para exibição total (TTFD) e otimize o trabalho de inicialização.

Gerenciamento de memória

  • Low memory killers (LMKs):entenda como o daemon Android Low Memory Killer (lmkd) prioriza processos via oom_adj_score e crie um perfil do consumo de memória no Android Studio, Unity e Unreal Engine.
  • Uso da memória (RSS anônimo e espaço de troca):meça e reduza o consumo de memória do app (tamanho do conjunto residente anônimo e espaço de troca) nos estados de primeiro plano, serviço e segundo plano.
  • Uso da memória de bitmap:diagnostique alocações de bitmap grandes ou com vazamento e libere buffers gráficos quando os componentes da interface forem para o segundo plano.

Bateria e trabalho em segundo plano

  • Wake locks em excesso:evite manter wake locks parciais por longos períodos e migre tarefas em segundo plano para WorkManager ou JobScheduler.
  • Wake locks parciais travados:garanta que todos os wake locks parciais adquiridos sejam liberados corretamente em todos os caminhos de execução e de erros.
  • Ativações excessivas:reduza as ativações exatas de alarmes e agrupe ou adie o trabalho em segundo plano programado.
  • Buscas excessivas por Wi-Fi em segundo plano:minimize a frequência de buscas por Wi-Fi em segundo plano e use APIs de localização e conectividade passivas ou em lote.
  • Uso excessivo da rede em segundo plano: faça transferências em lote e adie as transferências de rede móvel em segundo plano usando restrições WorkManager.
  • Uso excessivo da bateria:diagnostique o consumo excessivo da bateria em dispositivos móveis e Wear OS criando perfis de atividade da CPU, do sensor e do rádio.

Permissões e otimização de build

  • Negações de permissão:solicite permissões de execução no contexto e explique claramente aos usuários o motivo da permissão.
  • Otimização de código DEX:configure regras de redução, ofuscação e otimização do R8 para reduzir o tamanho do DEX e melhorar o desempenho de execução.