É possível otimizar pacotes específicos usando o R8 com packageScope. Essa é uma primeira etapa opcional para apps que ainda não usam o R8 e não é recomendada para apps que já usam.
Considerar o uso de packageScope
Se o app já usa o R8, não use packageScope, porque é uma configuração abaixo do ideal em termos de desempenho e tamanho do app. Em vez disso, melhore
a configuração do R8 do app com regras de retenção aprimoradas ou, se estiver usando
o modo de compatibilidade, migre para o modo completo do R8.
Os apps que ainda não usam o R8, mas estão adotando, podem usar packageScope para gerenciar a transição de forma incremental. Como o R8 aplica otimizações avançadas que podem alterar o comportamento do app, o escopo dessas otimizações para pacotes específicos que são seguros para otimizar, como o AndroidX e o Kotlin, permite que você tenha ganhos de desempenho com risco mínimo. Depois que o app estiver estável, você poderá expandir gradualmente essas otimizações para o restante da base de código e das dependências, testando a estabilidade em cada estágio.
Pré-requisitos
O uso do R8 com packageScope exige:
- Plug-in do Android para Gradle 9.0 ou mais recente.
- R8 no modo completo, não no modo de compatibilidade.
Configurar a otimização
Para ativar a otimização com packageScope, siga estas etapas.
Escolher bibliotecas para otimizar
Identifique as bibliotecas a serem otimizadas. Recomendamos começar com as bibliotecas AndroidX e Kotlin androidx.**, kotlin.** e kotlinx.**, porque são bibliotecas estáveis que foram configuradas para compatibilidade com o R8.
Ativar o suporte para usar o R8 com packageScope
Adicione o seguinte ao arquivo gradle.properties do projeto:
android.r8.gradual.support=true
Configurar o bloco de otimização
No arquivo build.gradle.kts (ou build.gradle) do módulo, adicione um
optimization bloco à configuração do build de lançamento. Dentro desse bloco, use packageScope para listar os pacotes específicos que você quer otimizar. No arquivo build.gradle.kts, coloque a lista de pacotes em setOf().
Kotlin
android {
buildTypes {
release {
optimization {
enable = true
packageScope = setOf("androidx.**","kotlin.**", "kotlinx.**")
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true
packageScope = ["androidx.**", "kotlin.**", "kotlinx.**"]
}
}
}
}
Testar a otimização
Depois de aplicar ou atualizar a declaração packageScope, teste o app
para verificar se não ocorreram falhas inesperadas ou mudanças de comportamento.
Transição da otimização de pacotes especificados para a otimização de todo o app
Para maximizar os benefícios da otimização, tente fazer uma transição gradual do uso de packageScope para o uso do R8 em todo o app. Esse processo envolve a expansão incremental da cobertura de otimização:
- Comece com bibliotecas estáveis. Comece incluindo apenas bibliotecas estáveis e amplamente usadas que sejam compatíveis com as otimizações do R8 na lista
packageScope. Comece com as bibliotecas AndroidX e Kotlinandroidx.**,kotlin.**ekotlinx.**. - Adicione pacotes de forma incremental. Adicione gradualmente novos prefixos de pacote ao
packageScope:- Avaliar dependências. Analise as bibliotecas do app. Os bons candidatos a serem adicionados à lista
packageScopeincluem bibliotecas oficiais do Google (por exemplo,com.google.**) e outras bibliotecas robustas, comoOkHttp(por exemplo,okhttp3.**eokio.**). Priorize bibliotecas que não envolvam reflexão pesada, serialização ou chamadas de código nativo (JNI). - Priorizar com base no tamanho do pacote. Use o APK
Analyzer do Android Studio para identificar os maiores contribuintes para o tamanho do app.
- Crie um AAB ou APK de lançamento com o R8 desativado.
- Abra-o no Analyzer e inspecione os arquivos
dex. - Ordene os pacotes por tamanho. Os maiores pacotes oferecem o maior retorno do investimento (ROI) para otimização. O direcionamento desses pacotes primeiro oferece a redução de tamanho mais significativa no início do processo, desde que essas bibliotecas não tenham regras de retenção muito amplas. Consulte Escolher bibliotecas com sabedoria para mais informações.
- Avaliar dependências. Analise as bibliotecas do app. Os bons candidatos a serem adicionados à lista
- Verificar mudanças de comportamento. Depois de adicionar cada novo prefixo de pacote, faça testes abrangentes para detectar e resolver regressões ou comportamentos inesperados.
- Adicione pacotes de apps por último. Se os pacotes de apps não usarem muita reflexão, inclua-os em
packageScopee adicione regras de retenção de forma incremental conforme necessário. Se os pacotes de apps usarem muita reflexão, inclua-os empackageScopee adicione regras de retenção em todo o pacote para os pacotes necessários. Itere as regras de retenção para refiná-las. - Mova para o uso do R8 em todo o app. Depois que a maioria das dependências do app for incluída na declaração
packageScopee o app estiver estável, remova opackageScopepara otimizar todo o app no modo completo.