Casos de sucesso

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

Leitura de 4 minutos
Ben Weiss
Engenheiro 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 uma necessidade. Tempos de carregamento lentos, interfaces sem resposta e instabilidade podem ser barreiras significativas para o engajamento do usuário e a retenção. Durante o trabalho com a equipe de relações com desenvolvedores do Android, a equipe de engenharia do Reddit usou a pontuação de desempenho 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 caso de sucesso detalha 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 desempenho no Android. Ele realiza várias etapas para melhorar a performance do app.Vamos dar uma olhada rápida nas mais impactantes.

  • O tree shaking é a etapa mais importante para reduzir o tamanho de um app. Aqui, o código não usado das dependências e do próprio app é removido.
  • O método inlining substitui chamadas de método pelo código real, tornando o app mais eficiente.
  • A **mesclagem de classes** e outras estratégias são aplicadas para tornar o código mais compacto. Nesse momento, não se trata mais da legibilidade do código-fonte, mas de fazer com que o código compilado funcione 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 sentido. Assim, em vez de MyDataModel, você pode acabar com uma classe chamada a.
  • A redução de recursos  remove recursos não usados, como arquivos XML e drawables, para reduzir ainda mais o tamanho do app.
image.png

Principais estágios da otimização do R8

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

O Reddit observou resultados de desempenho aprimorados imediatamente após o lançamento de uma nova versão do app para os usuários.Ao usar Android Vitals e Crashlytics, o Reddit conseguiu capturar métricas de desempenho em dispositivos reais com usuários reais, permitindo que eles comparassem 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 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.

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

image.png

Drew Heavner: "Ativando a ferramenta de potencial total do R8 em menos de duas semanas"

O mais impressionante é que isso foi realizado com um esforço focado. 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 do Google realizaram benchmarks detalhados para confirmar cientificamente os ganhos e experimentar 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 R8 e mais duas ferramentas fundamentais de otimização de desempenho: perfis de referênciaperfis de inicialização.

Os perfis de referência movem as etapas de compilação Just in Time (JIT) dos dispositivos do usuário para as máquinas do desenvolvedor. O código compilado Ahead Of Time (AOT) gerado 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 e cria 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 empacotar nos primeiros arquivos classes.dex. Essa estrutura permite que o app carregue menos arquivos, o que, por sua vez, melhora a velocidade de inicialização.

A biblioteca Macrobenchmark do Jetpack foi a ferramenta principal para essa 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 abriu o app, rolou três vezes para baixo e depois rolou de volta para cima.

No final, tudo o que era necessário para escrever o benchmark era o seguinte:

  uiAutomator {

  startApp(REDDIT)

  repeat(3) {

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

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

Os dados de benchmark confirmaram as observações de campo e forneceram insights mais detalhados. O app totalmente otimizado foi iniciado 55% mais rápido e os usuários puderam começar a navegar 18% mais cedo. 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 melhorou, 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

Você pode 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")

Ativando 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 desempenho 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 desempenho. O R8 faz modificações substanciais no código, incluindo renomear, mover e remover classes, campos e métodos. Se você observar que essas modificações causam erros, especifique quais partes do código o R8 não deve modificar declarando-as nas regras de manutenção.

Siga o exemplo do Reddit no seu app

O sucesso do Reddit com o R8 serve como um caso de sucesso poderoso 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 ressalta o valor da otimização de desempenho.

Ao seguir o modelo apresentado neste caso de sucesso (usando ferramentas como a pontuação de desempenho do app para identificar oportunidades, ativando todo o potencial de otimização do R8, monitorando dados do mundo real e usando benchmarks para confirmar e aprofundar a compreensão), 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 recém-atualizadas sobre como ativar, configurar e solucionar problemas do otimizador R8.

Escrito por:

Continuar lendo