Eventos e programas

Use o R8 para reduzir, otimizar e acelerar seu app

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

Use o R8 para reduzir, otimizar e acelerar seu app

Bem-vindo ao primeiro dia da Semana de Destaques de Performance do Android!

Vamos começar com a mudança mais impactante e de baixo esforço 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 app. Ele faz um trabalho fantástico de remoção de códigos e recursos não utilizados, reduzindo o tamanho do app. Mas o verdadeiro poder dele, o que ele realmente faz bem, é ser um otimizador.

Quando você ativa o modo completo e permite otimizações, o R8 realiza otimizações profundas de todo o programa, reescrevendo o código para ser fundamentalmente mais eficiente. Essa não é apenas uma pequena modificação.

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

Como o R8 melhora a performance do seu app

image.png

Vamos destacar as maiores 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 o app depende, bem como códigos inativos da sua própria base de código.

O método inlining substitui uma chamada de método pelo código real, o que melhora a performance de execução.

A **mesclagem 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 nesse momento e provavelmente serão removidas.

A minificação de código é usada para mudar os nomes de classes, campos e métodos para nomes mais curtos e sem sentido. Assim, em vez de MyDataModel, você pode acabar com uma classe chamada a. Isso é o que causa mais 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 de interface mais suave, 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 performance que o R8 pode trazer, vamos conferir 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 essenciais 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 do usuário.

Saiba mais sobre as melhorias no nosso blog.

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

Durante nosso trabalho com parceiros, observamos 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 do usuário. 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 performance técnica. E observamos que as classificações de apps na Google Play Store aumentaram em correlação com a adoção do R8. Compartilhar isso com seus proprietários de produtos, CTOs e tomadores de decisão pode ajudar a acelerar a performance do seu app.

image.png

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

Como orientar você para um app com melhor performance

Ouvimos que nossa orientação para desenvolvedores sobre o 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ção abrangente para ativar e depurar o R8.

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

Expandimos significativamente nossa orientação sobre as 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 manutenção, como aplicá-las e orientamos você com as práticas recomendadas para escrever e manter essas regras. Também oferecemos casos de uso e exemplos práticos e acionáveis, ajudando você a entender como impedir corretamente que o R8 remova códigos necessários durante a execução, como códigos acessados por reflexão ou uso da interface nativa JNI.

A documentação agora também aborda etapas de acompanhamento essenciais e cenários avançados. Adicionamos uma seção sobre testes e solução de problemas para que você possa verificar os ganhos de performance e depurar possíveis problemas. A seção de 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 o R8 para outros desenvolvedores usarem.

Ative 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 há essa linha 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". Você também pode transmitir arquivos de configuração padrão e personalizados nesta 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 causar um impacto enorme. Ao inspecionar a configuração do R8, a equipe descobriu que a flag -dontoptimize estava sendo usada. Ela foi incluída por um arquivo de configuração padrão, que ainda é usado em muitos apps.

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

image.png

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

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

Suporte a ferramentas

A partir de Android Studio Narwhal 3 Feature Drop, você vai receber um aviso do lint ao usar proguard-android.txt 

image.png

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

Também investimos em novos recursos do Android Studio para facilitar a depuração de códigos otimizados pelo R8. A partir do AGP 9.0, você pode desofuscar automaticamente rastreamentos de pilha no Logcat do Android Studio para builds processados pelo R8, ajudando 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 de blog de amanhã sobre esta Semana de Destaques de Performance do Android.

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.

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

  1. Siga nossos guias para desenvolvedores para começar: Ativar a otimização do app.
  2. Verifique se você ainda usa proguard-android.txt e substitua-o por proguard-android-optimize.txt.
  3. Em seguida, avalie o impacto. Não apenas sinta a diferença, verifique. Meça seus ganhos de performance adaptando o código do nosso app de exemplo da Macrobenchmark no GitHub para medir os tempos de inicialização antes e depois.

Temos certeza de que você vai observar uma melhoria significativa na performance do seu app. Use #optimizationEnabled para perguntas 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 social #AskAndroid para enviar perguntas sobre performance. 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. Fique atento para amanhã, quando vamos nos aprofundar ainda mais na depuração e na solução de problemas. Mas, por enquanto, comece a usar o R8 e coloque seu app no caminho rápido.

Escrito por:

Continuar lendo