Otimizar pacotes especificados com packageScope (experimental)

É 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:

  1. 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 Kotlin androidx.**, kotlin.** e kotlinx.**.
  2. Adicione pacotes de forma incremental. Adicione gradualmente novos prefixos de pacote ao packageScope:
    1. Avaliar dependências. Analise as bibliotecas do app. Os bons candidatos a serem adicionados à lista packageScope incluem bibliotecas oficiais do Google (por exemplo, com.google.**) e outras bibliotecas robustas, como OkHttp (por exemplo, okhttp3.** e okio.**). Priorize bibliotecas que não envolvam reflexão pesada, serialização ou chamadas de código nativo (JNI).
    2. Priorizar com base no tamanho do pacote. Use o APK Analyzer do Android Studio para identificar os maiores contribuintes para o tamanho do app.
      1. Crie um AAB ou APK de lançamento com o R8 desativado.
      2. Abra-o no Analyzer e inspecione os arquivos dex.
      3. 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.
  3. 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.
  4. Adicione pacotes de apps por último. Se os pacotes de apps não usarem muita reflexão, inclua-os em packageScope e adicione regras de retenção de forma incremental conforme necessário. Se os pacotes de apps usarem muita reflexão, inclua-os em packageScope e adicione regras de retenção em todo o pacote para os pacotes necessários. Itere as regras de retenção para refiná-las.
  5. 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 packageScope e o app estiver estável, remova o packageScope para otimizar todo o app no modo completo.