Tutoriais

Guia de níveis para sua jornada de performance

Leitura de 9 minutos
Alice Yuan
Engenheira de relações com desenvolvedores

Guia de nivelamento da sua jornada de performance

Este é o quarto dia da Semana de Destaque da Performance. Agora que você aprendeu sobre algumas das ferramentas incríveis e práticas recomendadas que apresentamos recentemente, como o Otimizador R8 e a otimização guiada por perfil com perfis de referência e perfis de inicialização, talvez você esteja se perguntando por onde começar sua jornada de melhoria de desempenho. 

Criamos um guia de nivelamento de performance com instruções detalhadas para atender à sua equipe de desenvolvimento para dispositivos móveis, seja você um app com um único desenvolvedor querendo começar a trabalhar com performance ou uma equipe inteira dedicada a melhorar a performance do Android. 

O guia de nivelamento de performance tem cinco níveis. Vamos começar com o nível 1, que apresenta ferramentas de desempenho com esforço mínimo de adoção, e vamos até o nível 5, ideal para apps que têm recursos para manter uma estrutura de desempenho personalizada.

 
Escolha o nível que mais se adequa a você:

Nível 1:  use o monitoramento de campos fornecido pelo Play Console

Recomendamos usar primeiro o Android vitals no Play Console para ver dados de monitoramento de campo coletados automaticamente e receber insights sobre seu aplicativo com o mínimo de esforço.

O Android vitals é a iniciativa do Google para coletar e mostrar automaticamente esses dados de campo para você.

Confira uma explicação de como entregamos esses dados:

  1. Coleta de dados : quando um usuário ativa a opção, o dispositivo Android dele registra automaticamente eventos importantes de desempenho e estabilidade de todos os apps, incluindo o seu.
  2. Dados agregados:o Google Play coleta e anonimiza esses dados dos usuários do seu app.
  3. Insights da superfície:os dados são apresentados no painel do Android vitals no Google Play Console.

O painel do Android vitals acompanha muitas métricas, mas algumas são designadas como Core Vitals. Elas são as mais importantes porque podem afetar a visibilidade e a classificação do app na Google Play Store.

As principais métricas

MÉTRICAS PRINCIPAIS DE QUALIDADE TÉCNICA DO GOOGLE PLAY

Para maximizar a visibilidade no Google Play, mantenha seu app abaixo dos limites de mau comportamento para essas métricas.

Taxa de falha percebida pelo usuárioÉ a porcentagem de usuários ativos por dia que tiveram pelo menos uma falha que provavelmente foi notada.
Taxa de ANR percebido pelo usuárioÉ a porcentagem de usuários ativos por dia que tiveram pelo menos um ANR que provavelmente foi notado.
Uso excessivo da bateriaÉ a porcentagem de sessões do mostrador do relógio em que o uso da bateria passa de 4,44% por hora.
Novidade: wake locks parciais em excessoÉ a porcentagem de sessões do usuário em que o uso cumulativo e não isento do wake lock excede duas horas.

As principais métricas incluem taxa de falhas percebida pelo usuário, taxa de ANR, uso excessivo da bateria e a métrica recém-introduzida sobre wake locks parciais em excesso.

Taxa de ANR percebido pelo usuário

Use o painel de ANR do Android vitals para conferir rastreamentos de pilha de problemas que ocorrem no campo e receber insights e recomendações sobre como corrigir o problema. 

crashesAnrs.png

É possível detalhar um ANR específico que ocorreu para conferir o stack trace e insights sobre o que pode estar causando o problema.

insights.png

Confira também nossas orientações sobre ANRs para ajudar você a diagnosticar e corrigir os cenários comuns em que os ANRs podem ocorrer. 

Taxa de falhas percebidas pelo usuário 

Use o painel de falhas do Android vitals para depurar ainda mais as falhas e ver uma amostra de stack traces que ocorrem no app. 

Nossa documentação também tem orientações sobre como resolver falhas específicas. Por exemplo, o guia de solução de problemas de serviços em primeiro plano discute maneiras de identificar e corrigir cenários comuns em que ocorrem falhas.

Uso excessivo da bateria 

Para diminuir as sessões do mostrador do relógio com uso excessivo da bateria no Wear OS, confira o guia do Wear sobre como melhorar e economizar a bateria

[Novo] Wake locks parciais em excesso

 

Recentemente, anunciamos que os apps que excederem o limite de wake locks parciais em excesso poderão receber tratamento adicional a partir de 1º de março de 2026

Para dispositivos móveis, a métrica Android vitals se aplica a wake locks não isentos adquiridos enquanto a tela está desligada e o app está em segundo plano ou executando um serviço em primeiro plano. O Android vitals considera o uso de wake lock parcial excessivo se os wake locks forem mantidos por pelo menos duas horas em um período de 24 horas e afetarem mais de 5% das sessões do app, em média, durante 28 dias.

Para depurar e corrigir problemas de wake lock excessivo, confira nossa postagem técnica no blog.

Consulte nossa documentação do Android vitals e continue sua jornada para aproveitar melhor essa ferramenta.

Nível 2: siga as ações necessárias da pontuação de performance do app

Em seguida, use a Pontuação de desempenho do app para encontrar as sugestões de ações de alto impacto e melhorar o desempenho do app.

A pontuação de desempenho do app Android é uma estrutura padronizada para medir o desempenho técnico do seu app. Ela dá uma pontuação entre 0 e 100, em que um número menor indica mais espaço para melhorias.

Para ter resultados fáceis, comece com a pontuação de performance estática. Elas geralmente são mudanças de configuração ou atualizações de ferramentas que oferecem aumentos significativos de performance.

Etapa 1: fazer a avaliação estática

A avaliação estática avalia a configuração e a adoção de ferramentas do seu projeto. Essas são geralmente as maneiras mais rápidas de melhorar o desempenho.

Acesse a seção de pontuação estática da página do placar e faça o seguinte:

  1. Avalie a versão do Plug-in do Android para Gradle (AGP).
  2. Adote a minificação do R8 de forma incremental ou, idealmente, use o R8 no modo completo para minimizar e otimizar o código do app.
  3. Adote os perfis de referência, que melhoram a velocidade de execução do código desde a primeira inicialização, oferecendo melhorias de desempenho a cada nova instalação e atualização do app.
  4. Adote os perfis de inicialização para melhorar o layout DEX. Os perfis de inicialização são usados pelo sistema de build para otimizar ainda mais as classes e os métodos que contêm, melhorando o layout do código nos arquivos DEX do APK.
  5. Fazer upgrade para a versão mais recente do Jetpack Compose

Etapa 2: realizar a avaliação dinâmica

Depois de aplicar as melhorias estáticas fáceis, use a avaliação dinâmica para validar as melhorias em um dispositivo real. Primeiro, faça isso manualmente com um dispositivo físico e um cronômetro.

Navegue até a seção de pontuação dinâmica da página do placar e faça o seguinte:

  1. Configure seu ambiente de teste com um dispositivo físico. Considere usar um dispositivo de nível mais baixo para exagerar os problemas de desempenho e facilitar a identificação deles.
  2. Medir o tempo de inicialização no acesso rápido. Faça uma inicialização a frio do app usando o ícone na tela de início e meça o tempo até que ele fique interativo.
  3. Meça o tempo de inicialização do app em uma notificação com o objetivo de reduzir esse tempo para menos de dois segundos.
  4. Meça o desempenho de renderização rolando pelas telas e animações principais.

Depois de concluir essas etapas, você vai receber uma pontuação entre 1 e 100 para as pontuações estática e dinâmica, o que vai ajudar a entender a performance do seu app e onde concentrar seus esforços.

Nível 3: aproveitar frameworks de teste de performance local

Depois de começar a avaliar a performance dinâmica, talvez você ache muito cansativo medir a performance manualmente. Considere automatizar seus testes de desempenho usando frameworks de teste de desempenho, como Macrobenchmarks e UiAutomator.

Macrobenchmark 💚 UiAutomator

Pense no Macrobenchmark e no UiAutomator como duas ferramentas que funcionam juntas: o Macrobenchmark é a ferramenta de medição. É como um cronômetro e um contador de taxa de frames que são executados fora do app. Ele é responsável por iniciar, registrar métricas (como tempo de inicialização ou frames descartados) e parar o app. O UiAutomator é o usuário robô. A biblioteca permite escrever código para interagir com a tela do dispositivo. Ele pode encontrar um ícone, tocar em um botão,  rolar uma lista e muito mais.

Como escrever um teste

Ao escrever um teste, você encapsula o código do UiAutomator em um bloco de macrobenchmark.

  1. Defina o teste:use o @MacrobenchmarkRule
  2. Comece a medir:ligue para benchmarkRule.measureRepeated.
  3. Controle a interface:dentro desse bloco, use o código do UiAutomator para iniciar o app, encontrar elementos da interface e interagir com eles.

Confira um exemplo de snippet de código de como testar uma lista de composição para instabilidade de rolagem.

  benchmarkRule.measureRepeated(

    // ...

    metrics = listOf(

        FrameTimingMetric(),

    ),

    startupMode = StartupMode.COLD,

    iterations = 10,

) {

    // 1. Launch the app's main activity

    startApp()

    // 2. Find the list using its resource ID and scroll down

    onElement { viewIdResourceName == "$packageName.my_list" }

        .fling(Direction.DOWN)

}

4. Analise os resultados: cada execução de teste fornece informações medidas com precisão para oferecer os melhores dados sobre o desempenho do seu app.

  timeToInitialDisplayMs  min  1894.4,   median 2847.4,   max  3355.6


frameOverrunMs          P50 -3.2,  P90  6.2, P95  10.4, P99  119.5

Casos de uso comuns

A macroanálise comparativa oferece várias métricas principais prontas para uso. O StartupTimingMetric permite medir com precisão a inicialização do app. O FrameTimingMetric permite entender o desempenho de renderização de um app durante o teste.

Temos um guia detalhado e completo sobre como usar macrobenchmarks e UiAutomator com exemplos de código disponíveis para você continuar aprendendo.

Nível 4: use ferramentas de análise de rastreamento, como o Perfetto 

Ferramentas de análise de rastreamento, como o Perfetto, são usadas quando você precisa ir além do código do seu aplicativo. Ao contrário dos depuradores ou criadores de perfis padrão que só veem seu processo, o Perfetto captura todo o estado do dispositivo (agendamento do kernel, frequência da CPU, outros processos e serviços do sistema), oferecendo um contexto completo para problemas de desempenho.

Confira nossa playlist do YouTube sobre depuração de desempenho para ver instruções em vídeo sobre como fazer isso usando rastreamentos do sistema, o criador de perfil do Android Studio e o Perfetto.

Como usar o Perfetto para depurar a performance

O fluxo de trabalho geral para depurar o desempenho usando ferramentas de análise de rastreamento é gravar, carregar e analisar o rastreamento. 

Etapa 1: gravar um rastreamento

Você pode gravar um rastreamento do sistema usando vários métodos: 

Etapa 2: carregar o rastreamento

Depois de ter o arquivo de rastreamento, carregue-o na ferramenta de análise.

  1. Abra o Chrome e acesse ui.perfetto.dev.
  2. Arraste e solte o arquivo .perfetto-trace (ou .pftrace) diretamente na janela do navegador.
  3. A interface vai processar o arquivo e mostrar a linha do tempo.

Etapa 3: analisar o rastreamento

Você pode usar a interface do Perfetto ou o Android Studio Profiler para investigar problemas de desempenho. Confira este episódio da série MAD Skills sobre performance, em que nossa engenheira de performance Carmen Jackson fala sobre o Perfetto traceviewer.

Cenários para inspecionar rastros do sistema usando o Perfetto

O Perfetto é uma ferramenta especializada que pode fornecer informações sobre tudo o que aconteceu no dispositivo Android enquanto um rastreamento era capturado. Isso é útil principalmente quando não é possível identificar a causa raiz de uma lentidão usando registros padrão ou criadores de perfis básicos.

Depuração de instabilidade (frames descartados)

Se o app apresentar falhas ao rolar a tela, o Perfetto pode mostrar exatamente por que um frame específico perdeu o prazo.

Se o problema for no app, talvez você veja a linha de execução principal sendo executada por um longo período fazendo uma análise pesada. Isso indica cenários em que você precisa mover o trabalho para o processamento assíncrono.

Se o problema for do sistema, talvez você veja a linha de execução principal pronta para ser executada, mas o agendador de kernel da CPU deu prioridade a um serviço do sistema diferente, deixando seu app em espera (disputa de CPU). Isso indica cenários em que talvez seja necessário otimizar o uso das APIs da plataforma.

Como analisar a inicialização lenta do app

A inicialização é complexa e envolve a inicialização do sistema, a ramificação de processos e o carregamento de recursos. O Perfetto visualiza essa linha do tempo com precisão.

Você pode verificar se está aguardando chamadas do Binder (comunicação entre processos). Se o onCreate esperar muito tempo por uma resposta do sistema PackageManager, o Perfetto vai mostrar claramente esse estado bloqueado. 

Você também pode verificar se o app está fazendo mais trabalho do que o necessário durante a inicialização. Por exemplo, se você estiver criando e organizando mais visualizações do que o app precisa mostrar, essas operações vão aparecer no rastreamento.

Investigando o consumo da bateria e o uso da CPU

Como o Perfetto vê todo o sistema, ele é perfeito para encontrar drenos de energia invisíveis.

Você pode identificar quais processos estão mantendo wake locks, impedindo que o dispositivo entre em modo de espera nas faixas de "Estado do dispositivo". Saiba mais na postagem do blog sobre bloqueios de despertar. Além disso, use o Perfetto para verificar se os jobs em segundo plano estão sendo executados com muita frequência ou ativando a CPU sem necessidade.

Nível 5: crie seu próprio framework de acompanhamento de performance

O nível final é para apps que têm equipes com recursos para manter uma estrutura de acompanhamento de performance. 

Para criar uma estrutura personalizada de acompanhamento de performance no Android, é necessário aproveitar várias APIs do sistema para capturar dados durante todo o ciclo de vida do aplicativo, desde a inicialização até a saída, e durante cenários específicos de alta carga.

Ao usar ApplicationStartInfo, ProfilingManager e ApplicationExitInfo, você pode criar um sistema de telemetria robusto que informa como o app foi iniciado, informações detalhadas sobre o que ele fez durante a execução e por que ele foi encerrado.

ApplicationStartInfo: rastreamento de como o app foi iniciado

Disponível no Android 15 (API 35), o ApplicationStartInfo fornece métricas detalhadas sobre a inicialização do app em campo. Os dados incluem se foi uma inicialização fria, morna ou inicialização a quente e a duração das diferentes fases de inicialização. 

Isso ajuda a desenvolver uma métrica de inicialização de linha de base usando dados de produção para otimizar ainda mais o que pode ser difícil de reproduzir localmente. Você pode usar essas métricas para executar testes A/B e otimizar o fluxo de inicialização.

O objetivo é registrar com precisão as métricas de inicialização sem instrumentar manualmente todas as fases de inicialização.

É possível consultar esses dados de forma lenta algum tempo após o lançamento do aplicativo.

ProfilingManager: captura do motivo da lentidão

O ProfilingManager (API 35) permite que seu app acione rastreamentos do sistema de maneira programática em dispositivos do usuário. Isso é útil para detectar problemas de desempenho temporários que não podem ser reproduzidos localmente.

O objetivo é registrar automaticamente um trace quando uma jornada ideal do usuário altamente crítica específica for detectada como lenta ou com problemas de desempenho.

É possível registrar um listener que é acionado quando condições específicas são atendidas ou acioná-lo manualmente quando você detecta um problema de desempenho, como instabilidade, uso excessivo de memória ou consumo elevado da bateria.

Confira nossa documentação sobre como capturar um perfilrecuperar e analisar dados de criação de perfil e usar comandos de depuração.

ApplicationExitInfo: rastreamento do motivo da falha do app

O ApplicationExitInfo (API 30) informa por que o processo anterior foi encerrado. Isso é fundamental para encontrar falhas nativas, ANRs ou encerramentos do sistema devido ao uso da memória excessivo (OOM). Também é possível receber um rastreamento detalhado de tombstone usando a API getTraceInputStream.

O objetivo da API é entender problemas de estabilidade que não acionam os relatórios de falhas padrão do Java (como Low Memory Kills).

Você precisa acionar essa API no próximo lançamento do app.

Próximas etapas

Melhorar o desempenho do Android é um processo gradual. Estamos muito animados para ver como você vai melhorar sua performance usando essas ferramentas.

Amanhã tem mais um episódio do Ask Android

Você reduziu o app com o R8 e otimizou o tempo de execução com a otimização guiada por perfil. E meça a performance do seu app.

Participe da sessão ao vivo "Pergunte ao Android" amanhã. Faça suas perguntas agora usando #AskAndroid e receba respostas dos especialistas.

Escrito por:

Continuar lendo