Tutoriais

Guia de níveis para sua jornada de performance

Leitura de 9 minutos
Ver o perfil de Alice Yuan
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á conhece 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 para dispositivos móveis, seja você um desenvolvedor de apps que quer começar 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 um framework de performance personalizado.


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

Nível 1:  usar 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 é a 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ários 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 de ANR do Android vitals 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 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 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 excessivos, confira nossa postagem do blog técnico.

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

Nível 2: seguir 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 é um framework padronizado 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 ter resultados 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 melhorem 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 os resultados estáticos 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 inicializador. Faça 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 frameworks 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 frameworks 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. Definir o teste:use @MacrobenchmarkRule.
  2. Começar a medir:chame benchmarkRule.measureRepeated.
  3. Controlar 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. Analisar 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 de depuração de performance no YouTube para instruções em vídeo sobre a depuração de performance usando rastros 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 a performance usando ferramentas de análise de rastreamento é registrar, carregar e analisar o rastreamento. 

Etapa 1: gravar um rastreamento

É possível gravar 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

Você pode usar a interface do Perfetto ou o Criador de perfil do Android Studio 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 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 for devido ao sistema, você poderá ver a linha de execução principal pronta para ser executada, mas o agendador do kernel da CPU deu prioridade a um serviço do sistema diferente, deixando o app esperando (disputa de CPU). Isso indica cenários em que talvez seja necessário otimizar o uso das APIs da plataforma.

Analisar a 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.

Investigar 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.

É 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 seu próprio framework de rastreamento de performance

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

A criação de um framework de rastreamento de performance personalizado no Android envolve o uso de várias APIs do sistema para capturar dados durante todo o ciclo de vida do aplicativo, da inicialização ao encerramento, 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: acompanhar como o app foi iniciado

Disponível no Android 15 (nível 35 da API) e versões mais recentes, ApplicationStartInfo fornece métricas detalhadas sobre a inicialização do app no campo. Os dados incluem se foi uma inicialização a frio, morna ou 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. Você pode 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). Você também poderá receber um rastreamento detalhado de lápide usando a API getTraceInputStream.

O objetivo da API é entender problemas de estabilidade que não acionam relatórios de falhas Java padrão (como encerramentos de memória baixa).

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ã é dia de 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