Estudos de caso

Como o Reddit usou o otimizador R8 para melhorias de performance de alto impacto

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

No mundo atual dos aplicativos para dispositivos móveis, uma experiência do usuário perfeita não é apenas um recurso, mas sim uma necessidade. Tempos de carregamento lentos, interfaces que não respondem e instabilidade podem ser barreiras significativas para o engajamento e a retenção de usuários. Durante o trabalho com a equipe de relações com desenvolvedores do Android, a equipe de engenharia do Reddit usou a pontuação de performance do app para avaliar o aplicativo. Depois de avaliar a performance, eles identificaram um potencial de melhoria significativo e decidiram tomar as medidas necessárias para ativar todo o poder do R8, o otimizador de apps Android. Essa iniciativa focada levou a melhorias notáveis nos tempos de inicialização, reduções em frames lentos ou congelados e ANRs, além de um aumento geral nas classificações da Google Play Store. Este estudo de caso mostra como o Reddit alcançou esses resultados impressionantes.

Como o otimizador R8 ajudou o Reddit

O otimizador R8 é uma ferramenta fundamental para a otimização de performance no Android. São necessárias várias etapas para melhorar a performance do app.Vamos dar uma olhada rápida nas mais importantes.

  • O tree shaking é a etapa mais importante para reduzir o tamanho de um app. Aqui, o código não utilizado das dependências do app e do próprio app é removido.
  • A inclusão de métodos substitui as chamadas de método pelo código real, tornando o app mais eficiente.
  • A fusão de classes e outras estratégias são aplicadas para tornar o código mais compacto. Neste ponto, não se trata mais da legibilidade humana do código-fonte, mas de fazer o código compilado funcionar rapidamente. Portanto, abstrações, como interfaces ou hierarquias de classes, não importam aqui e serão removidas.
  • A minificação de identificadores muda os nomes de classes, campos e métodos para nomes mais curtos e sem significado. Assim, em vez de MyDataModel, você pode acabar com uma classe chamada a.
  • A redução de recursos  remove recursos não utilizados, como arquivos XML e elementos gráficos, para reduzir ainda mais o tamanho do app.
image.png

Principais etapas da otimização do R8

De dados concretos à satisfação do usuário: identificando o sucesso na produção

O Reddit teve resultados de desempenho melhores imediatamente após o lançamento de uma nova versão do app para os usuários.Ao usar o Android Vitals e o Crashlytics, o Reddit conseguiu capturar métricas de desempenho em dispositivos reais com usuários reais, permitindo comparar o novo lançamento com as versões anteriores.

image.png

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.

Os indicadores de satisfação do usuário do sucesso da otimização estavam diretamente visíveis na Google Play Store. Após o lançamento da versão otimizada para R8, a equipe notou uma mudança drástica e positiva no sentimento e no engajamento dos usuários.

image.png

Drew Heavner: "Enabling R8's full potential tool less than 2 weeks"

O mais impressionante é que isso foi feito com um esforço concentrado. Drew Heavner, engenheiro de software do Reddit que trabalhou nessa iniciativa, observou que a implementação das mudanças para ativar todo o potencial do R8 levou menos de duas semanas.

Confirmando os ganhos: uma análise detalhada com macrobenchmarks

Depois de observar as melhorias significativas no mundo real, a equipe de engenharia do Reddit e a equipe de relações com desenvolvedores do Android no Google realizaram comparativos detalhados para confirmar cientificamente os ganhos e testar outras otimizações. Para essa análise, a engenharia do Reddit forneceu duas versões do app: uma sem otimizações e outra que aplicou o R8 e mais duas ferramentas fundamentais de otimização de performance: perfis de referência e perfis de inicialização.

Os perfis de referência movem as etapas de compilação Just in Time (JIT) dos dispositivos dos usuários para as máquinas dos desenvolvedores. O código compilado gerado com antecedência (AOT, na sigla em inglês) comprovadamente reduz o tempo de inicialização e os problemas de renderização.

Quando um app é empacotado, o dexer d8 usa classes e métodos para construir os arquivos classes.dex do app. Quando um usuário abre o app, esses arquivos DEX são carregados, um após o outro, até que o app possa ser iniciado. Ao fornecer um perfil de inicialização, você informa ao d8 quais classes e métodos devem ser incluídos nos primeiros classes.dex arquivos. Essa estrutura permite que o app carregue menos arquivos, o que melhora a velocidade de inicialização.

O Jetpack Macrobenchmark foi a principal ferramenta dessa fase, permitindo a medição precisa das interações do usuário em um ambiente controlado. Para simular uma jornada típica do usuário, eles usaram a API UIAutomator para criar um teste que abria o app, rolava para baixo três vezes e depois rolava para cima.

No final, tudo o que foi necessário para escrever o comparativo foi isto:

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

Os dados de comparativo confirmaram as observações de campo e forneceram insights mais detalhados. O app totalmente otimizado iniciou 55% mais rápido, e os usuários puderam começar a navegar 18% antes. O app otimizado também mostrou uma redução de dois terços nas ocorrências de compilação Just-In-Time (JIT) e uma diminuição de um terço no tempo de compilação JIT. A renderização de frames foi aprimorada, resultando em 19% mais frames renderizados na jornada do usuário comparada. Por fim, o tamanho do app foi reduzido em mais de um terço.

image.png

Melhorias gerais de desempenho do Reddit

É possível medir o tempo de compilação JIT com uma métrica de seção de rastreamento de macrobenchmark personalizada, como esta:

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

Como ativar a tecnologia por trás da transformação: R8

Para ativar o R8 no modo completo, configure o arquivo app/build.gradle.kts definindo minifyEnabled e shrinkResources como true no tipo de build de lançamento.

android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

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

                "keep-rules.pro",

            )

        }

    }

}

Essa etapa precisa ser seguida por testes holísticos de ponta a ponta, já que as otimizações de performance podem levar a um comportamento indesejado, que é melhor detectar antes que os usuários o façam.

Como mostrado anteriormente neste artigo, o R8 realiza otimizações extensivas para maximizar os benefícios de performance. O R8 faz modificações substanciais no código, incluindo renomeação, movimentação e remoção de classes, campos e métodos. Se você notar que essas modificações causam erros, especifique quais partes do código o R8 não deve modificar declarando-as em regras de manutenção.

Siga o exemplo do Reddit no seu app

O sucesso do Reddit com o R8 serve como um estudo de caso eficiente para qualquer equipe de desenvolvimento que queira causar um impacto significativo e de baixo esforço no desempenho do app. A correlação direta entre as melhorias técnicas e o aumento subsequente na satisfação do usuário destaca o valor da otimização de performance.

Ao seguir o modelo apresentado neste estudo de caso (usando ferramentas como o App Performance Score para identificar oportunidades, ativando todo o potencial de otimização do R8, monitorando dados do mundo real e usando comparativos de mercado para confirmar e aprofundar o entendimento), outros desenvolvedores podem alcançar ganhos semelhantes.

Para começar a usar o R8 no seu app, consulte a documentação e as orientações oficiais atualizadas sobre como ativar, configurar e resolver problemas do otimizador R8.

Escrito por:

Continuar lendo