Otimizar pacotes especificados com packageScope (experimental)

É possível otimizar pacotes específicos usando o R8 com packageScope. Ela foi criada como uma primeira etapa opcional para apps que ainda não usam o R8 e não é recomendada para apps que já usam o R8.

Considerar o uso de packageScope

Se o app já usa o R8, não use packageScope, porque é uma configuração subótima em termos de desempenho e tamanho do app. Em vez disso, melhore a configuração do R8 do seu app com regras de manutenção aprimoradas ou, se estiver usando o modo de compatibilidade, migre para o modo completo do R8.

Para apps que ainda não usam o R8, mas estão adotando o R8, use packageScope para gerenciar a transição de forma incremental. Como o R8 aplica otimizações avançadas que podem alterar o comportamento do app, restringir essas otimizações a pacotes específicos que são seguros para otimizar, como o AndroidX e o Kotlin, permite que você tenha ganhos de performance com risco mínimo. Depois que o app estiver estável, você poderá expandir gradualmente essas otimizações para o restante da codebase e das dependências, testando a estabilidade em cada etapa.

Pré-requisitos

Para usar o R8 com packageScope, é necessário ter o Plug-in do Android para Gradle 9.0 ou mais recente.

Configurar a otimização

Para ativar a otimização com o 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 seu projeto:

android.r8.gradual.support=true

Configurar o bloco de otimização

No arquivo build.gradle.kts (ou build.gradle) no nível do módulo, adicione um bloco optimization à configuração de 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 sua lista de pacotes em setOf().

Kotlin

android {
  buildTypes {
    release {
      proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro")
      optimization {
        enable = true
        packageScope = setOf("androidx.**","kotlin.**", "kotlinx.**")
      }
    }
  }
}

Groovy

android {
  buildTypes {
    release {
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
      optimization {
        enable = true
        packageScope = ["androidx.**", "kotlin.**", "kotlinx.**"]
      }
    }
  }
}

Testar a otimização

Depois de aplicar ou atualizar a declaração packageScope, teste seu app para verificar se não ocorreram falhas inesperadas ou mudanças de comportamento.

Transição da otimização de pacotes específicos para a otimização de todo o app

Para maximizar os benefícios da otimização, faça uma transição gradual do uso de packageScope para o R8 em todo o app. Esse processo envolve aumentar gradualmente a cobertura da 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. Avalie as dependências. Revise as bibliotecas do app. Bons candidatos para adicionar à 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, serialização ou chamadas de código nativo (JNI) pesadas.
    2. Priorize 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. 1. Abra no Analyzer e inspecione os arquivos dex. 1. Ordene os pacotes por tamanho. Os maiores pacotes oferecem o maior retorno do investimento (ROI) para otimização. Segmentar essas primeiro oferece a redução de tamanho mais significativa no início do processo, desde que essas bibliotecas não tenham regras de manutenção muito amplas. Consulte Escolha bibliotecas com sabedoria para mais informações.
  3. Verifique as 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 os pacotes de apps por último. Se os pacotes do app 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 do app usarem muita reflexão, inclua os pacotes 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. Use o 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.