O Plug-in do Android para Gradle 9.0 é uma versão principal que traz mudanças na API e no comportamento.
Para atualizar para o Plug-in do Android para Gradle 9.0.1, use o Assistente de upgrade do Plug-in do Android para Gradle. O assistente de upgrade do AGP ajuda a preservar os comportamentos atuais ao fazer upgrade do projeto, sempre que apropriado. Assim, você pode fazer upgrade do projeto para usar o AGP 9.0, mesmo que não esteja pronto para adotar todos os novos padrões do AGP 9.0.
Também há duas habilidades de agente disponíveis para facilitar o processo de upgrade. Para um app que não é KMP, tente a habilidade de upgrade do AGP 9 no repositório de habilidades do Android. Para um app KMP, teste a habilidade de upgrade do AGP 9 (link em inglês) da JetBrains. Para mais informações sobre o uso de habilidades no Android Studio, consulte Estender o Modo Agente com habilidades.
Compatibilidade
O nível máximo da API com suporte do Plug-in do Android para Gradle 9.0 é o 36.1. Confira outras informações de compatibilidade:
| Versão mínima | Versão padrão | Observações | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | Para saber mais, consulte Como atualizar o Gradle. |
| Ferramentas de build do SDK | 36.0.0 | 36.0.0 | Instale ou configure as ferramentas de build do SDK. |
| NDK | N/A | 28.2.13676358 | Instale ou configure uma versão diferente do NDK. |
| JDK | 17 | 17 | Para saber mais, consulte Como configurar a versão do JDK. |
| Plug-in do Kotlin para Gradle (KGP) | 2.2.10 | 2.2.10 | Para saber mais, consulte Dependência de tempo de execução no plug-in do Gradle para Kotlin. |
As classes DSL android agora implementam apenas as novas interfaces públicas.
Nos últimos anos, introduzimos
novas interfaces para nossa DSL e API para
controlar melhor quais APIs são públicas. As versões 7.x e 8.x do AGP ainda usavam os tipos de DSL antigos (por exemplo, BaseExtension), que também implementavam as novas interfaces públicas, para manter a compatibilidade enquanto o trabalho nas interfaces avançava.
O AGP 9.0 usa exclusivamente nossas novas interfaces de DSL, e as implementações mudaram para novos tipos que estão totalmente ocultos. Isso também remove o acesso à API de variante antiga e descontinuada.
Para atualizar para o AGP 9.0, talvez seja necessário fazer o seguinte:
- Verifique se o projeto é compatível com o Kotlin
integrado:o
plug-in
org.jetbrains.kotlin.androidnão é compatível com a nova DSL. Mudar projetos KMP para o Plug-in do Android para Gradle para KMP:o uso do plug-in
org.jetbrains.kotlin.multiplatformno mesmo subprojeto do Gradle que os plug-inscom.android.libraryecom.android.applicationnão é compatível com a nova DSL.Atualize os arquivos de build:embora a mudança de interfaces tenha como objetivo manter a DSL o mais semelhante possível, pode haver algumas pequenas mudanças.
Atualize sua lógica de build personalizada para referenciar a nova DSL e API:substitua todas as referências à DSL interna pelas interfaces de DSL públicas. Na maioria dos casos, essa será uma substituição direta. Substitua qualquer uso de
applicationVariantse APIs semelhantes pela nova APIandroidComponents. Isso pode ser mais complexo, já que a APIandroidComponentsfoi projetada para ser mais estável e manter os plug-ins compatíveis por mais tempo. Confira nossas instruções do Gradle para ver exemplos.Atualize os plug-ins de terceiros:alguns plug-ins de terceiros ainda podem depender de interfaces ou APIs que não estão mais expostas. Migre para versões desses plug-ins que sejam compatíveis com o AGP 9.0.
A mudança para as novas interfaces de DSL impede que plug-ins e scripts de build do Gradle usem várias APIs descontinuadas, incluindo:
API descontinuada no bloco android |
Função | Substituição |
|---|---|---|
applicationVariants,libraryVariants,testVariants eunitTestVariants
|
Pontos de extensão para plug-ins adicionarem novas funcionalidades ao AGP. |
Substitua-o pela API
androidComponents.onVariants, por exemplo:
androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter
|
Permite que as variantes selecionadas sejam desativadas. |
Substitua-a pela API
androidComponents.beforeVariants, por exemplo:
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider etestServer
|
Registro de ambientes de teste personalizados para executar testes em dispositivos Android e emuladores. | Mude para dispositivos gerenciados pelo Gradle. |
sdkDirectory,ndkDirectory,bootClasspath,adbExecutable eadbExe
|
Usar vários componentes do SDK do Android para tarefas personalizadas. |
Mude para
androidComponents.sdkComponents.
|
registerArtifactType,registerBuildTypeSourceProvider,registerProductFlavorSourceProvider,registerJavaArtifact,registerMultiFlavorSourceProvider ewrapJavaSourceSet |
Funcionalidade obsoleta relacionada principalmente ao processamento de fontes geradas no Android Studio, que parou de funcionar no AGP 7.2.0. | Não há uma substituição direta para essas APIs. |
dexOptions
|
Configurações obsoletas relacionadas à ferramenta dx, que foi
substituída por d8. Nenhuma das configurações
tem efeito desde o Plug-in do Android para Gradle 7.0.
|
Não há substituição direta. |
generatePureSplits
|
Gere divisões de configuração para apps instantâneos. | A capacidade de enviar divisões de configuração agora está integrada aos Android App Bundles. |
aidlPackagedList
|
Arquivos AIDL para empacotar no AAR para expor como API para bibliotecas e apps que dependem dessa biblioteca. |
Isso ainda é exposto em
LibraryExtension,
mas não nos outros tipos de extensão.
|
Se você atualizar para o AGP 9.0 e receber a seguinte mensagem de erro, isso significa que seu projeto ainda está referenciando alguns dos tipos antigos:
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
Se você tiver problemas com plug-ins de terceiros incompatíveis, poderá desativar e
recuperar as implementações antigas da DSL, bem como a API de variante antiga.
Ao fazer isso, as novas interfaces também ficam disponíveis, e você ainda pode
atualizar sua própria lógica de build para a nova API. Para recusar, inclua esta linha no
arquivo gradle.properties:
android.newDsl=false
Como alternativa, para uma migração mais gradual, o AGP 9.4 permite que você desative módulos individuais. Para saber como fazer isso, consulte Desativação do módulo da API Variant.
As classes anteriores foram marcadas como descontinuadas no AGP 9.0. Isso significa que os projetos
que desativarem a flag newDsl vão receber avisos de descontinuação, inclusive no
próprio bloco android.
Também é possível começar a fazer upgrade para as novas APIs antes de fazer upgrade para o AGP 9.0. As novas interfaces estão presentes em muitas versões do AGP, então é possível ter uma combinação de novas e antigas. A documentação de referência da API AGP mostra a superfície da API para cada versão do AGP e quando cada classe, método e campo foi adicionado.
Estamos entrando em contato com os autores de plug-ins usados com frequência para ajudá-los a adaptar e lançar plug-ins totalmente compatíveis com os novos modos. Além disso, vamos continuar aprimorando o Assistente de upgrade do AGP no Android Studio para orientar você durante a migração.
Se você perceber que a nova DSL ou a API Variant não têm recursos ou funcionalidades, registre um problema assim que possível.
Kotlin integrado
O Plug-in do Android para Gradle 9.0 introduz suporte integrado ao Kotlin e o ativa
por padrão. Isso significa que não é mais necessário aplicar o
plug-in org.jetbrains.kotlin.android (ou kotlin-android) nos arquivos de build
para compilar arquivos de origem do Kotlin.
Isso simplifica a integração do Kotlin com o AGP, evita o uso de
APIs descontinuadas e melhora o desempenho em alguns casos.
Portanto, ao fazer upgrade do projeto para o AGP 9.0, você também precisa migrar para o Kotlin integrado ou desativar.
Também é possível desativar seletivamente o suporte integrado ao Kotlin para subprojetos do Gradle que não têm fontes do Kotlin.
Dependência de tempo de execução para o plug-in do Gradle para Kotlin
Para oferecer suporte integrado ao Kotlin, o Plug-in do Android para Gradle 9.0 agora tem uma dependência de tempo de execução para o plug-in do Gradle do Kotlin (KGP) 2.2.10. Isso significa que você não precisa mais declarar uma versão do KGP. Se você usar uma versão anterior à 2.2.10, o Gradle vai fazer upgrade automático do KGP para a versão 2.2.10. Da mesma forma, se você usar uma versão do KSP anterior à 2.2.10-2.0.2, o AGP vai fazer upgrade dela para a 2.2.10-2.0.2 para corresponder à versão do KGP.
Fazer upgrade para uma versão mais recente do KGP
Para usar uma versão mais recente do KGP ou do KSP, adicione o seguinte ao arquivo de build de nível superior:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
Fazer downgrade para uma versão anterior do KGP
Só é possível fazer downgrade da versão do KGP se você desativou o Kotlin integrado. Isso ocorre porque o AGP 9.0 ativa o Kotlin integrado por padrão, e o Kotlin integrado requer o KGP 2.2.10 ou mais recente.
Para usar uma versão anterior do KGP ou do KSP, declare essa versão no arquivo de build de nível superior usando uma declaração de versão estrita:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
A versão mínima do KGP para downgrade é a 2.0.0.
Suporte do IDE para preparação de teste
O AGP 9.0 oferece suporte completo ao ambiente de desenvolvimento integrado do Android Studio para preparações de teste.
Plug-in de biblioteca combinada
O plug-in de biblioteca combinada (pré-lançamento) permite publicar várias bibliotecas como um único AAR de biblioteca do Android. Isso pode facilitar para os usuários dependerem dos artefatos publicados.
Para saber como começar, consulte Publicar várias bibliotecas do Android como uma só com a biblioteca combinada.
Mudanças de comportamento
O Plug-in do Android para Gradle 9.0 tem os seguintes novos comportamentos:
| Comportamento | Recomendação |
|---|---|
O Plug-in do Android para Gradle 9.0 usa a versão r28c do NDK por padrão.
|
Considere especificar explicitamente a versão do NDK que você quer usar. |
| Por padrão, o Plug-in do Android para Gradle 9.0 exige que os consumidores de uma biblioteca usem a mesma versão do SDK de compilação ou uma mais recente. |
Use o mesmo SDK de compilação ou um mais recente ao consumir uma biblioteca.
Se isso não for possível ou se você quiser dar mais tempo para os consumidores de uma biblioteca
que você publica, defina
AarMetadata.minCompileSdk
explicitamente.
|
O AGP 9.0 inclui atualizações nos padrões das seguintes propriedades do Gradle. Isso permite que você preserve o comportamento do AGP 8.13 ao fazer upgrade:
| Propriedade | Função | Mudança do AGP 8.13 para o AGP 9.0 | Recomendação |
|---|---|---|---|
android. |
Use as novas interfaces DSL sem expor as implementações legadas
do bloco android.Isso também significa que a API de variante legada, como android.applicationVariants,
não está mais acessível.
|
false → true |
Para desativar, defina
android.newDsl=false.Quando todos os plug-ins e a lógica de build usados pelo projeto forem compatíveis, remova a desativação. |
android. |
Ativa o Kotlin integrado. | false → true |
Migre para o Kotlin integrado, se possível, ou desative. |
android. |
Garante que cada biblioteca tenha um nome de pacote diferente. | false → true |
Especifique nomes de pacotes exclusivos para todas as bibliotecas do seu projeto. Se isso não for possível, desative essa flag durante a migração. |
android. |
Use as dependências androidx
por padrão.
|
false → true |
Adote as dependências
androidx.
|
android. |
Execute testes no dispositivo com a classe
androidx.test.runner.AndroidJUnitRunner
por padrão, substituindo o padrão da classe descontinuada
InstrumentationTestRunner
por
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
Adote
AndroidJUnitRunner
ou especifique explicitamente seu testInstrumentationRunner personalizado.
|
android. |
Controla o uso de restrições de dependência entre configurações. O padrão no AGP 9.0 é false, que usa apenas restrições em testes de dispositivos de aplicativos (AndroidTest).
Definir como true vai reverter para o comportamento da versão 8.13.
|
true → false |
Não use restrições de dependência em todos os lugares, a menos que seja necessário. Aceitar o novo padrão dessa flag também ativa otimizações no processo de importação do projeto, o que reduz o tempo de importação para builds com muitos subprojetos de biblioteca do Android. |
android. |
Compilar o código em aplicativos em uma classe R não final, alinhando
a compilação do aplicativo com a da biblioteca. Isso melhora a incrementalidade e abre caminho para futuras otimizações de desempenho no fluxo de processamento de recursos. |
false → true |
Muitos projetos podem simplesmente adotar o novo comportamento sem mudanças na origem. Se os campos da classe R forem usados em qualquer lugar que exija uma constante, como casos de switch, refatore para usar instruções if encadeadas. |
android. |
Usa a versão do SDK de compilação como o valor padrão para a versão do SDK de destino
em apps e testes. Antes dessa mudança, a versão do SDK de destino era definida como padrão para a versão mínima do SDK. |
false → true |
Especifique explicitamente a versão do SDK de destino para apps e testes. |
android. |
Cria apenas componentes de teste de unidade para o tipo de build testado. No projeto padrão, isso resulta em um único teste de unidade para depuração, em que o comportamento anterior era executar testes de unidade para depuração ou lançamento. |
false → true |
Se o projeto não exigir que os testes sejam executados para depuração e lançamento, não será necessário fazer mudanças. |
android. |
Falha no build com um erro se algum dos arquivos de manutenção especificados na DSL do AGP não existir no disco. Antes dessa mudança, erros de digitação em nomes de arquivos faziam com que os arquivos fossem ignorados silenciosamente. | false → true |
Remova todas as declarações inválidas de arquivos do ProGuard |
android. |
Permite que o R8 mantenha menos recursos do Android ao considerar classes e recursos do Android juntos. | false → true |
Se as regras de manutenção do seu projeto já estiverem completas, nenhuma mudança será necessária. |
android. |
Permite que o R8 mantenha menos ao não manter implicitamente o construtor padrão
quando uma classe é mantida.
Ou seja, -keep class A não implica mais
-keep class A { <init>(); } |
false → true |
Se as regras de manutenção do seu projeto já estiverem completas, nenhuma mudança será necessária.
Substitua -keep class A
por
-keep class A { <init>(); }
nas regras de manutenção do projeto em todos os casos em que você precisar que o construtor
padrão seja mantido.
|
android. |
Ativa
resValues
em todos os subprojetos
|
true → false |
Ative o resValues apenas nos subprojetos que precisam dele,
definindo o seguinte nos arquivos de build do Gradle desses projetos:
android {
buildFeatures {
resValues = true
}
} |
android. |
Ativa a compilação de sombreador em todos os subprojetos. | true → false |
Ative a compilação de sombreadores apenas nos subprojetos que contêm sombreadores a serem
compilados, definindo o seguinte nos arquivos de build do Gradle
desses projetos:
android {
buildFeatures {
shaders = true
}
} |
android. |
No AGP 9.0, o getDefaultProguardFile() só vai oferecer suporte a proguard-android-optimize.txt, em vez de proguard-android.txt. Isso evita o uso acidental da flag dontoptimize, que está incluída em proguard-android.txt.
|
false → true |
É possível especificar explicitamente dontoptimize em um proguardFile personalizado se você quiser evitar a otimização, além de usar proguard-android-optimize.txt. Se possível, remova a flag dontoptimize desse arquivo, porque ela reduz os benefícios de otimização do R8. Caso contrário, desative a opção definindo android.r8.globalOptionsInConsumerRules.disallowed=false.
|
android. |
A partir do AGP 9.0, a publicação de bibliotecas e módulos de recursos do Android vai falhar se os arquivos de retenção do consumidor tiverem configurações problemáticas do Proguard. Os arquivos de manutenção do consumidor que incluem opções globais, como dontoptimize ou dontobfuscate, só podem ser usados em módulos de aplicativos e podem reduzir os benefícios de otimização para os usuários da biblioteca. A compilação do módulo do app Android vai ignorar silenciosamente essas opções globais se elas estiverem incorporadas em uma dependência pré-compilada (JAR ou AAR). Para saber quando isso ocorre, verifique o arquivo configuration.txt (geralmente em um caminho como <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) para encontrar comentários como: # REMOVED CONSUMER RULE: dontoptimize
|
false → true |
As bibliotecas publicadas precisam remover todas as regras incompatíveis. As bibliotecas internas precisam mover as regras incompatíveis, mas necessárias, para um proguardFile em um módulo de app. Para desativar, defina android.r8.globalOptionsInConsumerRules.disallowed=false. Quando todos os arquivos do Keep do consumidor forem compatíveis, remova a desativação.
|
android. |
Não permite a transmissão de provedores para fontes geradas usando a DSL
AndroidSourceSet.
|
false → true |
Use a API
Sources
em androidComponents para registrar as fontes geradas.
|
android. |
Exige que o caminho do compilador de sombreador seja definido explicitamente em
local.properties
se a compilação de sombreador estiver ativada.
|
false → true |
Adicione glslc.dir=/path/to/shader-tools ao local.properties do seu projeto.
|
Recursos removidos
O Plug-in do Android para Gradle 9.0 remove as seguintes funcionalidades:
- Suporte a apps para Wear OS incorporados
O AGP 9.0 remove o suporte à incorporação de apps para Wear OS, que não é mais compatível com o Google Play. Isso inclui remover as configuraçõeswearAppe a DSLAndroidSourceSet.wearAppConfigurationName. Consulte Distribuir para Wear OS para saber como publicar seu app para Wear OS. - Tarefa de relatório
androidDependenciesesourceSets - Suporte a APKs divididos por densidade
O AGP 9.0 remove o suporte à criação de APKs divididos com base na densidade da tela. A funcionalidade e as APIs relacionadas foram removidas. Para dividir APKs com base na densidade da tela usando o AGP 9.0 ou mais recente, use pacotes de app.
DSL alterada
O Plug-in do Android para Gradle 9.0 tem as seguintes mudanças interruptivas na DSL:
A parametrização de
CommonExtensionfoi removida.Por si só, essa é apenas uma alteração interruptiva no nível da origem para ajudar a evitar futuras alterações interruptivas no nível da origem, mas também significa que os métodos de bloqueio precisam ser movidos de
CommonExtensionparaApplicationExtension,LibraryExtension,DynamicFeatureExtensioneTestExtension.Ao fazer upgrade do projeto para o AGP 9.0, refatore o código do plug-in do Gradle que usa esses parâmetros ou os métodos de bloco. Por exemplo, o plug-in a seguir é atualizado para remover o parâmetro de tipo e não depender dos métodos de bloqueio removidos:
AGP 8.13
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }AGP 9.0
val commonExtension: CommonExtension = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig.apply { minSdk { version = release(28) } } }Para plug-ins que segmentam uma variedade de versões do AGP, o uso direto do getter é compatível com versões do AGP anteriores à 9.0.
DSL removida
O Plug-in do Android para Gradle 9.0 remove:
AndroidSourceSet.jni, porque não era funcional.AndroidSourceSet.wearAppConfigurationName, em relação à remoção do suporte a apps para Wear OS incorporados.BuildType.isRenderscriptDebuggable, porque não era funcional.DependencyVariantSelection. Ele foi substituído porDependencySelection, que é exposto comokotlin.android.localDependencySelection.Installation.installOptions(String). Ele foi substituído pela propriedade mutável deInstallation.installOptions.O bloco experimental, mas nunca estabilizado,
PostProcessing.ProductFlavor.setDimension, que é substituído pela propriedadedimension.LanguageSplitOptions, que só era útil para o Google Play Instant, que foi descontinuado.DensitySplit, porque o recurso não é mais compatível. A substituição é usar pacotes de apps.
APIs removidas
O Plug-in do Android para Gradle 9.0 remove:
AndroidComponentsExtension.finalizeDSl. Ele foi substituído porfinalizeDsl.Component.transformClassesWith. Ele foi substituído porInstrumentation.transformClassesWith.Component.setAsmFramesComputationMode. Ele foi substituído porInstrumentation.setAsmFramesComputationMode.ComponentBuilder.enabled. Ele foi substituído porComponentBuilder.enable.DependenciesInfoBuilder.includedInApk. Ele foi substituído porincludeInApk.DependenciesInfoBuilder.includedInBundle. Ele foi substituído porincludeInBundle.GeneratesApk.targetSdkVersion. Ele foi substituído portargetSdk.Variant.minSdkVersion. Ele foi substituído porminSdk.Variant.maxSdkVersion. Ele foi substituído pormaxSdk.Variant.targetSdkVersion. Ele foi substituído portargetSdk.Variant.unitTest, porque não era aplicável ao plug-incom.android.test.unitTestestá disponível em subtiposVariantBuilderque estendemHasUnitTest.VariantBuilder.targetSdketargetSdkPreview, porque não eram significativos nas bibliotecas. UseGeneratesApkBuilder.targetSdkouGeneratesApkBuilder.targetSdkPreview.VariantBuilder.enableUnitTest, porque não era aplicável ao plug-incom.android.test.enableUnitTestestá disponível em subtiposVariantBuilderque estendemHasUnitTestBuilder.VariantBuilder.unitTestEnabledfoi removido em favor do nome mais consistenteenableUnitTestnos subtiposVariantBuilderque estendemHasUnitTestBuilder.VariantOutput.enable. Ele foi substituído porenabled.As funções
FeaturePlugineFeatureExtension, que foram descontinuadas e desativadas.As APIs
BaseExtension.registerTransformdescontinuadas e desativadas, que permaneceram apenas para permitir a compilação com a versão mais recente do AGP, enquanto visavam a execução no AGP 4.2 ou versões anteriores.
Propriedades do Gradle removidas
As propriedades do Gradle a seguir foram adicionadas inicialmente como formas de desativar globalmente recursos que eram ativados por padrão.
Esses recursos foram desativados por padrão desde o AGP 8.0 ou versões anteriores. Ative esses recursos apenas nos subprojetos que os usam para um build mais eficiente.
| Propriedade | Função | Substituição |
|---|---|---|
android. |
Ativa a compilação da AIDL em todos os subprojetos. |
Ative a compilação da AIDL apenas nos subprojetos em que há
origens da AIDL
definindo a seguinte propriedade nos arquivos de build do Gradle desses projetos:
android {
buildFeatures {
aidl = true
}
} |
android. |
Ativa a compilação do RenderScript em todos os subprojetos. |
Ative a compilação do RenderScript apenas nos subprojetos em que há
origens do RenderScript
definindo a seguinte propriedade nos arquivos de build do Gradle desses projetos:
android {
buildFeatures {
renderScript = true
}
} |
Propriedades do Gradle aplicadas
O AGP 9.0 vai gerar um erro se você definir as seguintes propriedades do Gradle.
O Assistente de upgrade do Plug-in do Android para Gradle não vai fazer upgrade de projetos para o AGP 9.0 que usam essas propriedades.
| Propriedade | Função |
|---|---|
android. |
A redução de recursos agora é sempre executada como parte do R8. A implementação anterior foi removida. |
android. |
A redução de recursos agora sempre usa a redução precisa de recursos, o que permite remover mais itens. |
Mudanças no R8
As mudanças do R8 a seguir estão incluídas no AGP 9.0.0.
Nova opção de configuração -processkotlinnullchecks
Adicionamos a nova opção -processkotlinnullchecks do R8 para configurar o R8 para
processar verificações de nulo do Kotlin. A opção usa um argumento obrigatório que precisa ser um dos três valores a seguir: keep, remove_message e remove.
A opção processa as seguintes verificações de nulo adicionadas pelo compilador
do Kotlin:
class kotlin.jvm.internal.Intrinsics {
void checkNotNull(java.lang.Object);
void checkNotNull(java.lang.Object, java.lang.String);
void checkExpressionValueIsNotNull(
java.lang.Object, java.lang.String);
void checkNotNullExpressionValue(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkFieldIsNotNull(java.lang.Object, java.lang.String);
void checkFieldIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkParameterIsNotNull(java.lang.Object, java.lang.String);
void checkNotNullParameter(java.lang.Object, java.lang.String);
}
Os valores das opções, ordenados do mais fraco ao mais forte, têm o seguinte efeito:
keepnão muda as verificações.remove_messagereescreve cada chamada de método de verificação para uma chamada paragetClass()no primeiro argumento da chamada (mantendo a verificação de nulo, mas sem nenhuma mensagem).removeremove completamente as verificações.
Por padrão, o R8
usa remove_message. Qualquer especificação de -processkotlinnullchecks
vai substituir isso. Se especificado várias vezes, o valor mais forte será
usado.
Parar de propagar informações de manutenção para métodos complementares
Quando as regras de manutenção correspondem a métodos de interface sujeitos à simplificação, o R8 transferia internamente os bits de não permitir otimização e não permitir redução para os métodos complementares sintetizados.
A partir do AGP 9.0, as regras de manutenção não se aplicam mais a métodos complementares. Isso é consistente com o fato de que as regras de manutenção não são relevantes para outros campos/métodos/classes sintetizados pelo compilador.
Ao transferir os bits disallow optimization e disallow shrinking para os métodos complementares, o seguinte caso de uso era aceito:
- Compile uma biblioteca com métodos de interface
default/static/privatepara DEX comminSdk< 24 e regras que mantêm os métodos de interface. - Compile um app com a biblioteca no caminho de classe e
-applymapping. - Mescle o app e a biblioteca.
Isso só funciona com -applymapping, porque o bit disallow
obfuscation não é transferido para os métodos complementares. Ou seja, as
classes complementares geradas na etapa 1 teriam nomes de métodos
ofuscados.
A partir de agora, esse caso de uso não é mais compatível com minSdk <
24. A solução alternativa é fazer o seguinte:
- Remova o sugar sintático da biblioteca com métodos de interface
default/static/privatepara arquivos de classe comminSdk< 24. - Compile o artefato simplificado usando o R8 e as regras que mantêm os métodos de interface nas classes complementares.
- Compile o app com a biblioteca no classpath.
- Mescle o app e o artefato simplificado.
Outro efeito colateral disso é que não é mais possível manter os atributos de classe interna e de método de fechamento para classes anônimas e locais dentro de métodos complementares de interface.
Mudar o arquivo de origem emitido padrão para r8-map-id-<MAP_ID>
Essa mudança está no AGP a partir da versão 8.12.0.
O atributo de arquivo de origem emitido padrão para uma classe muda de
SourceFile para r8-map-id-<MAP_ID> quando o retracing é necessário (ou seja,
quando a ofuscação ou a otimização está ativada).
Dado um stack trace ofuscado, o novo atributo de arquivo de origem possibilita extrair o ID do arquivo de mapeamento necessário para o retrace, que pode ser usado para oferecer suporte ao retrace automatizado de stack traces no Logcat.
Se um atributo de arquivo de origem personalizado for usado (-renamesourcefileattribute),
ele vai continuar tendo precedência.
No modo de compatibilidade do ProGuard (quando gradle.properties contém
android.enableR8.fullMode=false), a emissão de um atributo de arquivo de origem de
r8-map-id-<MAP_ID> só entra em vigor se o atributo SourceFile
não for mantido. Os apps que usam o modo de compatibilidade do ProGuard e querem
incluir o ID do arquivo de mapeamento nos stack traces precisam remover
-keepattributes SourceFile (ou migrar para o modo completo do R8).
O ID do mapa usado em r8-map-id-<MAP_ID> é o hash completo do mapa, e não um prefixo de 7 caracteres do hash do mapa que foi usado anteriormente.
Ativar o uso de nomes sintéticos minimizados na simplificação de sintaxe do L8
O nome das classes sintéticas geradas pelo D8 normalmente contém a substring
$$ExternalSynthetic, que informa que se trata de uma classe sintética gerada pelo D8.
Além disso, o nome do sintético também codifica o tipo sintético (por
exemplo, Backport, Lambda). Isso tem um impacto negativo no tamanho do DEX
resultante, já que os nomes de classe ocupam mais espaço no pool de strings.
O AGP 9.0 configura o L8 (simplificação da biblioteca principal) para que o arquivo DEX
que contém todas as classes j$ use um novo formato de nome de classe reduzido
para classes sintéticas. O novo nome da classe usa um ID numérico (por exemplo, $1).
Remover suporte para -addconfigurationdebugging
O AGP 9.0 remove o suporte para -addconfigurationdebugging. O compilador agora
informa um aviso se a flag for usada.
Remoção do suporte para gerar regras L8 do D8/R8
Essa mudança é relevante apenas para desenvolvedores que usam a linha de comando ou as APIs do D8/R8 diretamente.
O R8 9.0 remove o suporte à geração de regras de manutenção para o L8 do D8 e do R8.
Em vez disso, use TraceReferences para essa finalidade.
Mais especificamente, os métodos
D8Command.builder.setDesugaredLibraryKeepRuleConsumer e
R8Command.Builder.setDesugaredLibraryKeepRuleConsumer foram removidos, e o
suporte para --desugared-lib-pg-conf-output foi removido das opções de linha de comando
do D8 e do R8.
Problemas corrigidos
Plug-in do Android para Gradle 9.0.0
| Problemas corrigidos | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Plug-in do Android para Gradle |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Integração com o Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Redutor (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||