Eventos e programas

Usar o R8 para reduzir, otimizar e acelerar o app

Leitura de 5 minutos
Ben Weiss
Engenheira de relações com desenvolvedores

Use o R8 para reduzir, otimizar e acelerar seu app

Esta é a Semana de Destaques da Performance do Android!

Vamos começar com a mudança mais impactante e fácil que você pode fazer para melhorar a performance do seu app: ativar o otimizador R8 no modo completo.

Você provavelmente já conhece o R8 como uma ferramenta para reduzir o tamanho do seu app. Ele faz um trabalho fantástico de remoção de código e recursos não utilizados, reduzindo o tamanho do app. Mas o verdadeiro poder dele, o que ele realmente g-R8, é como um otimizador.

Quando você ativa o modo completo e permite otimizações, o R8 realiza otimizações profundas em todo o programa, reescrevendo o código para ser fundamentalmente mais eficiente. Não é apenas um pequeno ajuste.

Depois de ler este artigo, confira a introdução da Semana de destaque da performance ao otimizador R8 no YouTube.

Como o R8 melhora o desempenho do seu app

image.png

Vamos destacar as principais etapas que o otimizador R8 realiza para melhorar o desempenho do app.

O tree shaking é a etapa mais importante para reduzir o tamanho do app. Durante essa fase, o otimizador R8 remove códigos não utilizados de bibliotecas das quais seu app depende, além de códigos inativos da sua própria base de código.

A inclusão de método substitui uma chamada de método pelo código real, o que melhora o desempenho do tempo de execução.

A fusão de classes e outras estratégias são aplicadas para tornar o código mais compacto. Todas as suas abstrações, como interfaces e hierarquias de classes, não importam neste momento e provavelmente serão removidas.

A minificação de código é usada para mudar os nomes de classes, campos e métodos para outros mais curtos e sem significado. Assim, em vez de MyDataModel, você pode ter uma classe chamada a. Isso causa muita confusão ao ler rastreamentos de pilha de um app otimizado pelo R8. Observação: melhoramos isso no AGP 9.0.

A redução de recursos reduz ainda mais o tamanho de um app removendo recursos não utilizados, como arquivos XML e drawables.

Ao aplicar essas etapas, o otimizador R8 melhora os tempos de inicialização do app, permite uma renderização mais fluida da interface, com menos frames lentos e congelados, e melhora o uso geral de recursos no dispositivo.

Estudo de caso: melhorias de performance do Reddit com o R8

Como um exemplo das melhorias de desempenho que o R8 pode trazer, vamos analisar um exemplo do Reddit. Depois de ativar o R8 no modo completo, o app Reddit para Android teve melhorias significativas de desempenho em várias áreas.

image.png

Legenda: como o R8 melhorou o desempenho do app do Reddit

A equipe observou uma inicialização a frio 40% mais rápida, uma redução de 30% nos erros "O app não está respondendo" (ANR), uma melhoria de 25% na renderização de frames e uma redução de 14% no tamanho do app.

Essas melhorias são cruciais para a satisfação do usuário. Uma inicialização mais rápida significa menos espera e acesso mais rápido ao conteúdo. Menos ANRs levam a um app mais estável e confiável, reduzindo a frustração do usuário. A renderização de frames mais suave remove a instabilidade da interface, tornando a rolagem e as animações fluidas e responsivas. Esse impacto técnico positivo também ficou claramente visível no sentimento dos usuários.

Saiba mais sobre as melhorias no nosso blog.

Efeitos colaterais não técnicos do uso do R8

Durante nosso trabalho com parceiros, percebemos que essas melhorias técnicas têm um impacto direto na satisfação do usuário e podem ser refletidas na retenção de usuários, no engajamento e na duração da sessão. O engajamento do usuário, que pode ser medido com usuários ativos diários, semanais ou usuários ativos por mês, também foi afetado positivamente pelas melhorias de desempenho técnico. E vimos as classificações de apps na Google Play Store aumentarem em correlação com a adoção do R8. Compartilhar isso com os proprietários de produtos, CTOs e tomadores de decisão pode ajudar a acelerar a performance do app.

image.png

Então, vamos chamar pelo nome certo: a otimização deliberada de performance é uma virtude.

Como criar um app com melhor desempenho

Sabemos que nossa orientação para desenvolvedores do R8 precisava ser melhorada. Então, começamos a trabalhar. A orientação para desenvolvedores do otimizador R8 agora é muito mais prática e oferece orientações abrangentes para ativar e depurar o R8.

A documentação orienta você sobre a estratégia de alto nível para adoção, enfatizando a importância de escolher bibliotecas compatíveis com otimização e, principalmente, adotar os recursos do R8 de forma incremental para garantir a estabilidade. Essa abordagem gradual permite que você aproveite os benefícios do R8 com segurança e receba orientações sobre problemas difíceis de depurar.

Expandimos significativamente nossas orientações sobre regras de manutenção, que são o principal mecanismo para controlar o otimizador R8. Agora, oferecemos uma seção sobre o que são as regras de retenção, como aplicá-las e orientações com práticas recomendadas para escrever e manter essas regras. Também fornecemos exemplos e casos de uso práticos e úteis para ajudar você a entender como evitar corretamente que o R8 remova códigos necessários no momento da execução, como códigos acessados por reflexão ou uso da interface nativa JNI.

A documentação agora também aborda etapas essenciais de acompanhamento e cenários avançados. Adicionamos uma seção sobre testes e solução de problemas para que você possa verificar os ganhos de desempenho e depurar possíveis problemas. A seção configurações avançadas explica como segmentar variantes de build específicas, personalizar quais recursos são mantidos ou removidos e oferece instruções especiais de otimização para autores de bibliotecas, garantindo que você possa fornecer um pacote otimizado e compatível com R8 para outros desenvolvedores usarem.

Aproveite todo o potencial do otimizador R8

O otimizador R8 usa o "modo completo" por padrão desde a versão 8.0 do Plug-in do Android para Gradle. Se o projeto foi desenvolvido ao longo de muitos anos, ele ainda pode incluir uma flag legada para desativá-lo. Verifique se essa linha está no arquivo gradle.properties e remova-a.

android.enableR8.fullMode=false // delete this line to enable R8's full potential

Agora, verifique se você ativou o R8 no arquivo build.gradle.kts do seu app para a variante de lançamento. Ele é ativado definindo isMinifyEnabled e isShrinkResources como "true". Também é possível transmitir arquivos de configuração padrão e personalizados nessa etapa.

  release {

   isMinifyEnabled = true

   isShrinkResources = true

   proguardFiles(

       getDefaultProguardFile("proguard-android-optimize.txt"),

       "keep-rules.pro"

   )

}

Estudo de caso: melhorias de performance do Disney+

Os engenheiros do Disney+ investem no desempenho do app e estão otimizando a experiência do usuário. Às vezes, até mesmo mudanças aparentemente pequenas podem ter um grande impacto. Ao inspecionar a configuração do R8, a equipe descobriu que a flag -dontoptimize estava sendo usada. Ele foi introduzido por um arquivo de configuração padrão, que ainda é usado em muitos apps hoje em dia.

Depois de substituir proguard-android.txt por proguard-android-optimize.txt, a equipe do Disney+ notou melhorias significativas na performance do app.

image.png

Depois que uma nova versão do app com essa mudança foi lançada para os usuários, o Disney+ teve uma inicialização 30% mais rápida e 25% menos ANRs percebidos pelo usuário. 

Hoje, muitos apps ainda usam o arquivo proguard-android.txt, que contém a flag -dontoptimize. É aí que entram as melhorias nas ferramentas.

Suporte a ferramentas

A partir da atualização de recursos 3 do Android Studio Narwhal, você vai receber um aviso do lint ao usar proguard-android.txt

image.png

E, a partir do AGP 9.0, vamos remover totalmente o suporte para o arquivo. Isso significa que você terá que migrar para o proguard-android-optimize.txt.

Também investimos em novos recursos do Android Studio para facilitar a depuração de código otimizado para R8. A partir do AGP 9.0, agora é possível desofuscar automaticamente rastreamentos de pilha no Logcat do Android Studio para builds processados pelo R8, ajudando você a identificar a linha de código exata que está causando um problema, mesmo em um app totalmente otimizado. Isso será abordado com mais profundidade na postagem do blog de amanhã sobre esta semana do Android Performance Spotlight.

Próximas etapas

Confira a introdução da Semana de Destaques de Performance ao otimizador R8 no YouTube.

📣 Participe do desafio de performance!

É hora de conferir os benefícios por conta própria.

Desafiamos você a ativar o modo completo do R8 no seu app hoje.

  1. Siga nossos guias para desenvolvedores e comece a  ativar a otimização de apps.
  2. Verifique se você ainda usa proguard-android.txt e substitua por proguard-android-optimize.txt.
  3. Em seguida, meça o impacto. Não apenas sinta a diferença, verifique. Para medir os ganhos de performance, adapte o código do  app de exemplo da biblioteca Macrobenchmark no GitHub (em inglês) e meça os tempos de inicialização antes e depois.

Temos certeza de que você vai notar uma melhoria significativa no desempenho do app. Use #optimizationEnabled para tirar dúvidas sobre como ativar ou solucionar problemas do R8. Estamos aqui para ajudar.

Envie suas perguntas para a sessão "Pergunte ao Android" na sexta-feira

Use a tag #AskAndroid nas redes sociais para tirar dúvidas sobre desempenho. Durante a semana, vamos monitorar suas perguntas e responder a várias delas na sessão "Pergunte ao Android" sobre desempenho na sexta-feira, 21 de novembro. Amanhã, vamos analisar ainda mais a fundo a depuração e a solução de problemas. Por enquanto, comece a usar o R8 e coloque seu app no caminho certo.

Escrito por:

Continuar lendo