Instruções

Guia de níveis para sua jornada de performance

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

Guia de níveis para sua jornada de performance

Bem-vindo ao quarto dia da Semana de Destaque de Performance. Agora que você já 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 de inicialização, talvez esteja se perguntando por onde começar sua jornada de melhoria de performance. 

Criamos um guia de níveis de performance com etapas para atender sua equipe de desenvolvimento de apps para dispositivos móveis, seja você um desenvolvedor que está começando a trabalhar com performance ou uma equipe inteira dedicada a melhorar a performance do Android. 

O guia de níveis de performance tem cinco níveis. Vamos começar com o nível 1, que apresenta ferramentas de performance 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 performance personalizada.


Confira o nível que mais combina com você:

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

Recomendamos primeiro aproveitar o Android vitals no Play Console para visualizar dados de monitoramento de campo coletados automaticamente, oferecendo insights sobre seu aplicativo com o mínimo de esforço.

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

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

  1. Coletar dados : quando um usuário aceita, o dispositivo Android dele registra automaticamente os principais eventos de performance e estabilidade de todos os apps, incluindo o seu.
  2. Agregar dados:o Google Play coleta e anonimiza esses dados dos usuários do seu app.
  3. Mostrar insights: 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 principais métricas. Elas são as mais importantes porque podem afetar a visibilidade e a classificação do seu app na Google Play Store.

As principais métricas

PRINCIPAIS MÉTRICAS 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 falhas percebidas 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.
Novo: wake locks parciais em excessoÉ a porcentagem de sessões de usuário em que o uso cumulativo de wake locks não isentos excede duas horas.

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

Taxa de ANR percebido pelo usuário

Você pode usar o painel do Android vitals ANR para conferir stack traces 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

Além disso, confira nossas orientações sobre ANR para ajudar 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 conferir uma amostra de stack traces que ocorrem no seu app. 

Nossa documentação também tem orientações sobre como solucionar problemas de falhas específicas. Por exemplo, o guia 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 conservar a bateria

[Novo] Wake locks parciais em excesso

 

Anunciamos recentemente que os apps que excedem o limite de wake locks parciais em excesso podem receber tratamento adicional a partir de 1º de março de 2026

Para dispositivos móveis, a métrica do 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 locks parciais 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, com média de 28 dias.

Para depurar e corrigir problemas de wake locks em excesso, confira nossa postagem técnica do blog.

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

Nível 2: siga os itens de ação da pontuação de performance do app

Em seguida, use a pontuação de desempenho do app para encontrar os itens de ação de alta alavancagem para melhorar o desempenho do app.

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

Para obter vitórias fáceis, comece com a pontuação de performance estática. Essas são geralmente mudanças de configuração ou atualizações de ferramentas que oferecem melhorias significativas de performance.

Etapa 1: realizar 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 a performance.

Navegue até a seção "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 perfis de referência que melhoram a velocidade de execução do código desde a primeira inicialização, oferecendo melhorias de performance para cada nova instalação e atualização do app.
  4. Adote 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 eles contêm, melhorando o layout do código nos arquivos DEX do APK.
  5. Faça upgrade para a versão mais recente do Jetpack Compose.

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

Depois de aplicar as vitórias 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 "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 baixa qualidade para exagerar os problemas de performance, facilitando a identificação deles.
  2. Meça o tempo de inicialização do launcher. Inicie a inicialização a frio do app no í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 o tempo de inicialização da notificação para menos de alguns segundos.
  4. Meça a performance 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, oferecendo uma compreensão da performance do seu app e onde se concentrar.

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

Depois de começar a avaliar a performance dinâmica, talvez seja muito tedioso medir a performance manualmente. Considere automatizar os testes de performance usando estruturas de teste de performance, 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 é executado fora do app. Ele é responsável por iniciar o app, registrar métricas (como tempo de inicialização ou frames descartados) e interromper 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ê envolve o código do UiAutomator em um bloco de Macrobenchmark.

  1. Defina o teste:use @MacrobenchmarkRule.
  2. Comece a medir:chame benchmarkRule.measureRepeated.
  3. Conduza 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 jank 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 a performance 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

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

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

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

Ferramentas de análise de rastreamento, como o Perfetto, são usadas quando você precisa ver além do código do aplicativo. Ao contrário dos depuradores ou criadores de perfil 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 contexto completo para problemas de performance.

Confira nossa playlist do YouTube sobre depuração de performance para instruções em vídeo sobre depuração de performance usando rastros do sistema, o Android Studio Profiler e o Perfetto.

Como usar o Perfetto para depurar a performance

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

Etapa 1: registrar um rastreamento

É possível registrar um rastreamento do sistema usando vários métodos: 

Etapa 2: carregar o rastreamento

Depois de ter o arquivo de rastreamento, é necessário carregá-lo na ferramenta de análise.

  1. Abra o Chrome e navegue até 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

É possível usar a interface do Perfetto ou o Android Studio Profiler para investigar problemas de performance. Confira este episódio da série MAD Skills sobre performance, em que nossa engenheira de performance Carmen Jackson discute o visualizador de rastreamento do Perfetto.

Cenários para inspecionar rastros do sistema usando o Perfetto

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

Depuração de jank (frames descartados)

Se o app gaguejar durante a rolagem, o Perfetto poderá mostrar exatamente por que um frame específico perdeu o prazo.

Se for devido ao app, você poderá ver sua 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 for devido ao sistema, você poderá ver sua 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 o app esperando (conflito de CPU). Isso indica cenários em que talvez seja necessário otimizar o uso das APIs da plataforma.

Análise da inicialização lenta do app

A inicialização é complexa, envolvendo 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.

É possível conferir se você está esperando chamadas do Binder (comunicação entre processos). Se o onCreate aguardar muito tempo por uma resposta do PackageManager do sistema, o Perfetto vai mostrar esse estado bloqueado claramente. 

Também é possível conferir 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 poderão ser vistas no rastreamento.

Investigação do consumo da bateria e do uso da CPU

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

É possível identificar quais processos estão mantendo wake locks, impedindo que o dispositivo entre no modo de espera nas faixas "Estado do dispositivo". Saiba mais na nossa postagem do blog sobre wake locks. Além disso, use o Perfetto para conferir se os jobs em segundo plano estão sendo executados com muita frequência ou ativando a CPU desnecessariamente.

Nível 5: criar sua própria estrutura de rastreamento de performance

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

A criação de uma estrutura personalizada de rastreamento de performance no Android envolve o uso de 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, é possível 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: acompanhar como o app foi iniciado

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

Isso ajuda a desenvolver uma métrica de inicialização de referência usando dados de produção para otimizar ainda mais o que pode ser difícil de reproduzir localmente. É possível usar essas métricas para executar testes A/B otimizando o fluxo de inicialização.

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

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

ProfilingManager: capturar por que estava lento

ProfilingManager (nível 35 da API) permite que o app acione programaticamente rastros do sistema em dispositivos do usuário. Isso é útil para detectar problemas de performance transitó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 é 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, memória excessiva 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: acompanhar por que o app foi encerrado

ApplicationExitInfo (nível 30 da API) informa por que o processo anterior foi encerrado. Isso é fundamental para encontrar falhas nativas, ANRs ou encerramentos do sistema devido ao uso excessivo de memória (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 relatórios de falhas Java padrão (como Low Memory Kills).

Você precisa acionar essa API na  próxima inicialização do app.

Próximas etapas

Melhorar a performance do Android é uma jornada passo a passo. Estamos muito animados para ver como você vai melhorar sua performance usando essas ferramentas.

Amanhã, participe do Ask Android

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

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

Escrito por:

Continuar lendo