Ativar a otimização de apps com o R8

Para oferecer a melhor experiência do usuário, otimize seu app para que ele seja o menor e mais rápido possível. Nosso otimizador de apps, chamado R8, simplifica o app removendo código e recursos não utilizados, reescrevendo o código para otimizar a performance de execução e muito mais. Para os usuários, isso significa:

  • Tempo de inicialização mais rápido
  • Uso da memória reduzido
  • Melhoria na renderização e na performance de execução
  • Menos ANRs

Visão geral da otimização do R8

O R8 usa um processo de várias fases para otimizar o tamanho e a velocidade do app. As principais operações incluem o seguinte:

  • Redução de código (também conhecida como tree shaking): o R8 identifica e remove códigos inacessíveis do aplicativo e das dependências da biblioteca. Ao analisar os pontos de entrada do app (como Activities ou Services definidos no manifesto), o R8 cria um gráfico de código referenciado e remove tudo o que não for referenciado.

  • Otimizações lógicas: o R8 reescreve o código para melhorar a eficiência da execução e reduzir a sobrecarga. As principais técnicas incluem:

    • Inlining de método: o R8 substitui um local de chamada de método pelo corpo real do método chamado. Isso elimina a sobrecarga de uma chamada de função e permite que o R8 realize outras otimizações.

    • Mesclagem de classes: o R8 combina conjuntos de classes e interfaces em uma única classe. Isso reduz o número de classes no app, diminuindo a pressão da memória e melhorando a velocidade de inicialização.

  • Ofuscação (também conhecida como minificação): para reduzir o tamanho do arquivo DEX , o R8 encurta os nomes de classes, campos e métodos (por exemplo, com.example.MyActivity pode se tornar a.b.a).

Desde a versão 8.12.0 do Plug-in do Android para Gradle (AGP), o R8 também otimiza os recursos como parte das fases de otimização. Para mais informações, consulte Redução otimizada de recursos.

Ativar a otimização

Para ativar a otimização do app, defina isMinifyEnabled = true (para otimização de código) e isShrinkResources = true (para otimização de recursos) no script de build do app no build de lançamento build's, conforme mostrado no código a seguir. Recomendamos que você sempre ative as duas configurações. Também recomendamos ativar a otimização do app apenas na versão final do app que você testa antes da publicação, geralmente o build de lançamento, porque as otimizações aumentam o tempo de build do projeto e podem dificultar a depuração devido à forma como o código é modificado.

Kotlin

android {
    buildTypes {
        release {

            // Enables code-related app optimization.
            isMinifyEnabled = true

            // Enables resource shrinking.
            isShrinkResources = true

            proguardFiles(
                // Default file with automatically generated optimization rules.
                getDefaultProguardFile("proguard-android-optimize.txt"),

                ...
            )
            ...
        }
    }
    ...
}

Groovy

android {
    buildTypes {
        release {

            // Enables code-related app optimization.
            minifyEnabled = true

            // Enables resource shrinking.
            shrinkResources = true

            // Default file with automatically generated optimization rules.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')

            ...
        }
    }
}

Melhorar a otimização do R8

Os benefícios de desempenho do R8 estão diretamente relacionados à quantidade de base de código que o R8 pode otimizar. Para aproveitar ao máximo o R8, siga as práticas recomendadas:

Para ajudar a refinar as regras de manutenção, use o analisador de configuração do R8.

O analisador de configuração do R8 permite fazer o seguinte:

  • Acompanhar e melhorar a qualidade geral da configuração do R8 monitorando as métricas fornecidas pelo relatório do analisador de configuração do R8.
  • Encontrar as regras de manutenção mais amplas, aquelas que impedem a maior parte da otimização
  • e entender qual otimização elas impedem para refiná-las.

O analisador de configuração do R8 está disponível na versão 9.3.0-alpha05 do AGP ou na versão 9.3.7-dev do R8. Para mais informações, consulte Analisar a configuração do R8.

Otimizar a redução de recursos para apps ainda menores

A versão 8.12.0 do Plug-in do Android para Gradle (AGP) apresenta a redução otimizada de recursos, que visa integrar a otimização de recursos e códigos para criar apps ainda menores e mais rápidos.

Antes da redução otimizada de recursos, a Android Asset Packaging Tool (AAPT2) gerava regras de manutenção que tratavam a redução de recursos separadamente do código, muitas vezes retendo códigos ou recursos inacessíveis que se referiam uns aos outros.

Com a redução de recursos otimizada, os recursos são considerados como parte do código do programa, formando o gráfico de referência. Quando uma coleção de códigos ou recursos não é referenciada, ela não é protegida por uma regra de manutenção e pode ser removida.

Ativar a redução otimizada de recursos

Para ativar o novo pipeline de redução de recursos otimizada para AGP 8.12 ou 8.13, adicione o seguinte ao arquivo gradle.properties do projeto:

android.r8.optimizedResourceShrinking=true

Se você estiver usando o AGP 9.0.0 ou uma versão mais recente, não será necessário definir android.r8.optimizedResourceShrinking=true. A redução otimizada de recursos é aplicada automaticamente quando isShrinkResources = true está ativada na configuração do build.

Verificar e configurar as configurações de otimização do R8

Para permitir que o R8 use todos os recursos de otimização, remova a seguinte linha do arquivo gradle.properties do projeto, se ela existir:

android.enableR8.fullMode=false # Remove this line from your codebase.

A ativação da otimização do app dificulta a compreensão dos stack traces, especialmente se o R8 renomear nomes de classes ou métodos. Para receber stack traces que correspondam corretamente ao código-fonte, consulte Recuperar o stack trace original.

Se o R8 estiver ativado, também será necessário criar perfis de inicialização para uma performance ainda melhor na inicialização.

Se você ativar a otimização do app e ela causar erros, confira algumas estratégias para corrigi-los:

Se você quiser otimizar a velocidade do build, consulte Configurar como o R8 é executado para saber como configurar o R8 com base no seu ambiente.

Mudanças no comportamento da versão do AGP e do R8

A tabela a seguir descreve os principais recursos introduzidos em várias versões do Plug-in do Android para Gradle (AGP) e do compilador R8.

Versão do AGP Recursos introduzidos
9.1 Classes reempacotadas por padrão:o R8 reempacota classes (movendo-as para o pacote sem nome, no nível superior) para compactar ainda mais o DEX, eliminando a necessidade de especificar a opção -repackageclasses. Para informações sobre como isso funciona e como desativar, consulte Opções globais.
9.0 Redução otimizada de recursos: ativada por padrão (controlada usando android.r8.optimizedResourceShrinking). A redução otimizada de recursos ajuda a integrar a redução de recursos ao pipeline de otimização de código, resultando em apps menores e mais rápidos. Ao otimizar as referências de código e recursos simultaneamente, ela identifica e remove recursos referenciados exclusivamente de códigos não utilizados. Essa é uma melhoria significativa em relação aos processos de otimização separados anteriores.

Isso é especialmente útil para apps que compartilham recursos e códigos substanciais em diferentes verticais de fator de forma, com melhorias medidas de mais de 50% no tamanho do app. A redução de tamanho resultante leva a downloads menores, instalações mais rápidas e uma melhor experiência do usuário com inicialização mais rápida, renderização aprimorada e menos ANRs.

Filtragem de regras de biblioteca:o suporte para opções globais (por exemplo, -dontobfuscate) em regras de consumidor de biblioteca foi removido, e os apps vão filtrá-las. Para mais informações, consulte Adicionar opções globais.

Verificações nulas do Kotlin:otimizadas por padrão (controladas usando -processkotlinnullchecks). Essa versão também introduziu melhorias significativas na velocidade do build. Para mais informações, consulte Opções globais para otimização adicional.

Otimizar pacotes específicos:é possível usar packageScope para otimizar pacotes específicos. Isso está em suporte experimental. Para mais informações, consulte Otimizar pacotes especificados com packageScope.

Otimizado por padrão:o suporte para getDefaultProguardFile("proguard-android.txt") foi removido porque inclui -dontoptimize, que precisa ser evitado. Em vez disso, use "proguard-android-optimize.txt". Se você precisar desativar globalmente a otimização no app, adicione a flag manualmente a um arquivo ProGuard.
8.12 Redução otimizada de recursos: suporte inicial adicionado (controlado usando android.r8.optimizedResourceShrinking). A redução otimizada de recursos ajuda a integrar a redução de recursos ao pipeline de otimização de código. É necessário ativá-la manualmente nessa versão do AGP.

Retraçamento do Logcat: suporte para retraçamento automático na janela do Logcat do Android Studio.
8.6 Retraçamento aprimorado:inclui o retraçamento de nome de arquivo e número de linha por padrão para todos os níveis de minSdk (anteriormente exigia minSdk 26 ou mais na versão 8.2).

A atualização do R8 ajuda a garantir que os stack traces de builds ofuscados sejam facilmente e claramente legíveis. Essa versão melhora a forma como os números de linha e os arquivos de origem são mapeados, facilitando que ferramentas como o Logcat do Android Studio retraçam automaticamente as falhas para o código-fonte original.
8.0 Modo completo por padrão: o modo completo do R8 oferece uma otimização significativamente mais poderosa. Ele é ativado por padrão. É possível desativar usando android.enableR8.fullMode=false.
7.0 Modo completo disponível:introduzido como um recurso de ativação usando android.enableR8.fullMode=true. O modo completo aplica otimizações mais poderosas fazendo suposições mais rigorosas sobre como o código usa reflexão e outros recursos dinâmicos. Embora reduza o tamanho do app e melhore a performance, ele pode exigir regras de manutenção adicionais para evitar que o código necessário seja removido.