El complemento de Android para Gradle 9.0 es una versión importante que incluye cambios en la API y el comportamiento.
Para actualizar al complemento de Android para Gradle 9.0.1, usa el Asistente de actualización del complemento de Android para Gradle. El asistente de actualización del AGP ayuda a conservar los comportamientos existentes cuando actualizas tu proyecto, si es apropiado, lo que te permite actualizar tu proyecto para usar AGP 9.0, incluso si no estás listo para implementar todos los nuevos valores predeterminados en AGP 9.0.
También hay dos habilidades de agente disponibles para facilitar el proceso de actualización. Para una app que no sea de KMP, prueba la habilidad de actualización de AGP 9 del repositorio de habilidades de Android. Para una app de KMP, prueba la habilidad de actualización de AGP 9 de JetBrains. Para obtener más información sobre el uso de habilidades en Android Studio, consulta Cómo extender el modo de agente con habilidades.
Compatibilidad
El nivel de API máximo que admite el complemento de Android para Gradle 9.0 es el nivel de API 36.1. A continuación, se incluye otra información sobre la compatibilidad:
| Versión mínima | Versión predeterminada | Notas | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | Para obtener más información, consulta cómo actualizar Gradle. |
| Herramientas de desarrollo del SDK | 36.0.0 | 36.0.0 | Instala o configura SDK Build Tools. |
| NDK | N/A | 28.2.13676358 | Instala o configura una versión diferente del NDK. |
| JDK | 17 | 17 | Para obtener más información, consulta cómo configurar la versión de JDK. |
| Complemento de Gradle para Kotlin (KGP) | 2.2.10 | 2.2.10 | Para obtener más información, consulta Dependencia del entorno de ejecución en el complemento de Gradle para Kotlin. |
Las clases de DSL de android ahora solo implementan las nuevas interfaces públicas.
En los últimos años, presentamos
interfaces nuevas para nuestra DSL y API con el objetivo de
controlar mejor qué APIs son públicas. Las versiones 7.x y 8.x del AGP aún usaban los tipos de DSL antiguos (por ejemplo, BaseExtension), que también implementaban las nuevas interfaces públicas, para mantener la compatibilidad a medida que se avanzaba en las interfaces.
AGP 9.0 usa nuestras nuevas interfaces de DSL de forma exclusiva, y las implementaciones cambiaron a tipos nuevos que están completamente ocultos. Esto también quita el acceso a la API de variantes anterior, que ya no está disponible.
Para actualizar a AGP 9.0, es posible que debas hacer lo siguiente:
- Asegúrate de que tu proyecto sea compatible con Kotlin
integrado: El complemento
org.jetbrains.kotlin.androidno es compatible con el nuevo DSL. Cambia los proyectos de KMP al complemento de biblioteca de Android para Gradle para KMP: El uso del complemento
org.jetbrains.kotlin.multiplatformen el mismo subproyecto de Gradle que los complementoscom.android.libraryycom.android.applicationno es compatible con el nuevo DSL.Actualiza tus archivos de compilación: Si bien el cambio de interfaces tiene como objetivo mantener la DSL lo más similar posible, puede haber algunos cambios pequeños.
Actualiza la lógica de compilación personalizada para hacer referencia a la nueva DSL y API: Reemplaza cualquier referencia a la DSL interna por las interfaces de la DSL pública. En la mayoría de los casos, será un reemplazo uno a uno. Reemplaza cualquier uso de la API de
applicationVariantsy APIs similares por la nueva API deandroidComponents. Esto puede ser más complejo, ya que la API deandroidComponentsestá diseñada para ser más estable y mantener la compatibilidad de los complementos por más tiempo. Consulta nuestras Recetas de Gradle para ver ejemplos.Actualiza los complementos de terceros: Es posible que algunos complementos de terceros aún dependan de interfaces o APIs que ya no se exponen. Migra a versiones de esos complementos que sean compatibles con AGP 9.0.
El cambio a las nuevas interfaces de DSL evita que los complementos y las secuencias de comandos de compilación de Gradle usen varias APIs obsoletas, incluidas las siguientes:
API obsoleta en el bloque android |
Función | Reemplazo |
|---|---|---|
applicationVariants,libraryVariants,testVariants yunitTestVariants
|
Puntos de extensión para que los complementos agreguen nuevas funciones al AGP |
Reemplázala por la API de
androidComponents.onVariants, por ejemplo:
androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter
|
Permite inhabilitar las variantes seleccionadas. |
Reemplázala por la API de
androidComponents.beforeVariants, por ejemplo:
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider ytestServer
|
Registro de entornos de pruebas personalizados para ejecutar pruebas en dispositivos Android y emuladores. | Cambia a dispositivos administrados por Gradle. |
sdkDirectory,ndkDirectory,bootClasspath,adbExecutable yadbExe
|
Usar varios componentes del SDK de Android para tareas personalizadas |
Cambia a
androidComponents.sdkComponents.
|
registerArtifactType,registerBuildTypeSourceProvider,registerProductFlavorSourceProvider,registerJavaArtifact,registerMultiFlavorSourceProvider ywrapJavaSourceSet |
Funcionalidad obsoleta relacionada principalmente con el manejo de fuentes generadas en Android Studio, que dejó de funcionar en AGP 7.2.0 | No hay un reemplazo directo para estas APIs. |
dexOptions
|
Son parámetros de configuración obsoletos relacionados con la herramienta dx, que se reemplazó por d8. Ninguno de los parámetros de configuración
tiene efecto desde el complemento de Android para Gradle 7.0.
|
No hay un reemplazo directo. |
generatePureSplits
|
Genera divisiones de configuración para apps instantáneas. | La capacidad de enviar divisiones de configuración ahora está integrada en los Android App Bundles. |
aidlPackagedList
|
Son los archivos AIDL que se empaquetarán en el AAR para exponerlo como API para las bibliotecas y apps que dependen de esta biblioteca. |
Esto todavía se expone en LibraryExtension, pero no en los otros tipos de extensiones.
|
Si actualizas al AGP 9.0 y ves el siguiente mensaje de error, significa que tu proyecto aún hace referencia a algunos de los tipos antiguos:
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
Si te bloquean los complementos de terceros incompatibles, puedes inhabilitar y recuperar las implementaciones anteriores para el DSL, así como la API de variantes anterior.
Mientras haces esto, las interfaces nuevas también están disponibles, y puedes actualizar tu propia lógica de compilación a la API nueva. Para inhabilitar esta opción, incluye esta línea en
tu archivo gradle.properties:
android.newDsl=false
Como alternativa, para una migración más gradual, AGP 9.4 te permite inhabilitar módulos individuales. Para obtener más información, consulta Inhabilitación del módulo de la API de Variant.
Las clases anteriores se marcaron como obsoletas en AGP 9.0. Esto significa que los proyectos
que inhabiliten la marca newDsl verán advertencias de baja, incluso en
el propio bloque android.
También puedes comenzar a actualizar a las nuevas APIs antes de actualizar a AGP 9.0. Las nuevas interfaces están presentes en muchas versiones de AGP, por lo que puedes tener una combinación de interfaces nuevas y antiguas. En la documentación de referencia de la API de AGP, se muestra la plataforma de la API para cada versión de AGP y cuándo se agregó cada clase, método y campo.
Nos comunicaremos con los autores de los complementos de uso frecuente para ayudarlos a adaptar y lanzar complementos que sean totalmente compatibles con los nuevos modos, y seguiremos mejorando el Asistente de actualización del AGP en Android Studio para guiarte durante la migración.
Si detectas que faltan capacidades o funciones en el nuevo DSL o en la API de Variant, informa el problema lo antes posible.
Kotlin integrado
El complemento de Android para Gradle 9.0 presenta compatibilidad integrada con Kotlin y la habilita
de forma predeterminada. Esto significa que ya no tienes que aplicar el complemento org.jetbrains.kotlin.android (o kotlin-android) en tus archivos de compilación para compilar archivos de origen de Kotlin.
Esto simplifica la integración de Kotlin con el AGP, evita el uso de APIs obsoletas y, en algunos casos, mejora el rendimiento.
Por lo tanto, cuando actualices tu proyecto a AGP 9.0, también deberás migrar a Kotlin integrado o inhabilitar la opción.
También puedes inhabilitar de forma selectiva la compatibilidad integrada con Kotlin para los subproyectos de Gradle que no tengan fuentes de Kotlin.
Dependencia del entorno de ejecución en el complemento de Gradle para Kotlin
Para proporcionar compatibilidad integrada con Kotlin, el complemento de Android para Gradle 9.0 ahora tiene una dependencia de tiempo de ejecución del complemento de Kotlin para Gradle (KGP) 2.2.10. Eso significa que ya no tienes que declarar una versión de KGP y, si usas una versión de KGP anterior a la 2.2.10, Gradle actualizará automáticamente tu versión de KGP a la 2.2.10. Del mismo modo, si usas una versión de KSP anterior a la 2.2.10-2.0.2, el AGP la actualizará a la 2.2.10-2.0.2 para que coincida con la versión de KGP.
Actualiza a una versión más reciente del KGP
Para usar una versión posterior de KGP o KSP, agrega lo siguiente a tu archivo de compilación de nivel 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")
}
}
Cambia a una versión inferior del KGP
Solo puedes cambiar a una versión anterior del KGP si inhabilitaste Kotlin integrado. Esto se debe a que el AGP 9.0 habilita Kotlin integrado de forma predeterminada, y Kotlin integrado requiere KGP 2.2.10 o una versión posterior.
Para usar una versión anterior de KGP o KSP, declara esa versión en tu archivo de compilación de nivel superior con una declaración de versión estricta:
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") }
}
}
}
Ten en cuenta que la versión mínima del KGP a la que puedes cambiar es la 2.0.0.
Compatibilidad del IDE con los dispositivos de prueba
El AGP 9.0 ofrece compatibilidad total con el IDE de Android Studio para los dispositivos de prueba.
Complemento de biblioteca fusionada
El complemento de biblioteca fusionada (versión preliminar) te permite publicar varias bibliotecas como un solo AAR de biblioteca de Android. Esto puede facilitar que tus usuarios dependan de tus artefactos publicados.
Para obtener información sobre cómo comenzar, consulta Cómo publicar varias bibliotecas de Android como una sola con Fused Library.
Cambios en el comportamiento
El complemento de Android para Gradle 9.0 tiene los siguientes comportamientos nuevos:
| Comportamiento | Recomendación |
|---|---|
El complemento de Android para Gradle 9.0 usa la versión r28c del NDK de forma predeterminada.
|
Considera especificar de forma explícita la versión del NDK que quieres usar. |
| De forma predeterminada, el complemento de Android para Gradle 9.0 requiere que los consumidores de una biblioteca usen la misma versión del SDK de compilación o una posterior. |
Usa el mismo SDK de compilación o uno superior cuando consumas una biblioteca.
Si esto no es posible o si quieres darles más tiempo para cambiar a los consumidores de una biblioteca que publicas, configura AarMetadata.minCompileSdk de forma explícita.
|
AGP 9.0 incluye actualizaciones de los siguientes valores predeterminados de las propiedades de Gradle. Esto te da la opción de conservar el comportamiento de AGP 8.13 cuando actualices:
| Propiedad | Función | Cambio de AGP 8.13 a AGP 9.0 | Recomendación |
|---|---|---|---|
android. |
Usa las nuevas interfaces de DSL sin exponer las implementaciones heredadas del bloque android.Esto también significa que ya no se puede acceder a la API de variantes heredada, como android.applicationVariants.
|
false → true |
Puedes inhabilitar esta opción configurando android.newDsl=false.Una vez que todos los complementos y la lógica de compilación que usa tu proyecto sean compatibles, quita la inhabilitación. |
android. |
Habilita Kotlin integrado | false → true |
Migra a Kotlin integrado si puedes o inhabilita la opción. |
android. |
Aplica que cada biblioteca tenga un nombre de paquete distinto. | false → true |
Especifica nombres de paquetes únicos para todas las bibliotecas de tu proyecto. Si no es posible, puedes inhabilitar esta marca mientras realizas la migración. |
android. |
Usa las dependencias de androidx de forma predeterminada.
|
false → true |
Adopta las dependencias de androidx.
|
android. |
Ejecuta pruebas integradas en el dispositivo con la clase androidx.test.runner.AndroidJUnitRunner de forma predeterminada, lo que reemplaza el valor predeterminado de la clase InstrumentationTestRunner obsoleta.
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
Adopta
AndroidJUnitRunner
o especifica tu testInstrumentationRunner personalizado de forma explícita.
|
android. |
Controla el uso de restricciones de dependencia entre configuraciones. El valor predeterminado en AGP 9.0 es false, que solo usa restricciones en las pruebas de dispositivos de aplicaciones (AndroidTest).
Si estableces este parámetro en true, se revertirá al comportamiento de la versión 8.13.
|
true → false |
No uses restricciones de dependencia en todas partes, a menos que las necesites. Si aceptas el nuevo valor predeterminado de esta marca, también se habilitarán las optimizaciones en el proceso de importación del proyecto, lo que debería reducir el tiempo de importación para las compilaciones con muchos subproyectos de biblioteca de Android. |
android. |
Compilar código en aplicaciones con una clase R no final, lo que alinea la compilación de la aplicación con la de la biblioteca Esto mejora la incrementalidad y prepara el camino para futuras optimizaciones del rendimiento en el flujo de procesamiento de recursos. |
false → true |
Muchos proyectos pueden adoptar el nuevo comportamiento sin cambios en el código fuente. Si los campos de la clase R se usan en cualquier lugar que requiera una constante, como los casos de cambio, refactoriza para usar sentencias if encadenadas. |
android. |
Usa la versión del SDK de compilación como el valor predeterminado para la versión del SDK de destino en las apps y las pruebas. Antes de este cambio, la versión del SDK de destino se establecía de forma predeterminada en la versión mínima del SDK. |
false → true |
Especifica la versión del SDK de destino de forma explícita para las apps y las pruebas. |
android. |
Solo crea componentes de prueba de unidades para el tipo de compilación probado. En el proyecto predeterminado, esto genera una sola prueba de unidades para la depuración, mientras que el comportamiento anterior era ejecutar pruebas de unidades para la depuración o la versión. |
false → true |
Si tu proyecto no requiere que se ejecuten pruebas para la depuración y el lanzamiento, no es necesario realizar ningún cambio. |
android. |
Falla la compilación con un error si alguno de los archivos de conservación especificados en el DSL de AGP no existe en el disco. Antes de este cambio, los errores tipográficos en los nombres de archivo provocaban que los archivos se ignoraran de forma silenciosa. | false → true |
Quita las declaraciones de archivos de ProGuard no válidas. |
android. |
Permite que R8 conserve menos recursos de Android, ya que considera las clases y los recursos de Android juntos. | false → true |
Si las reglas de conservación de tu proyecto ya están completas, no es necesario realizar ningún cambio. |
android. |
Permite que R8 conserve menos elementos, ya que no conserva de forma implícita el constructor predeterminado cuando se conserva una clase.
Es decir, -keep class A ya no implica -keep class A { <init>(); }. |
false → true |
Si las reglas de conservación de tu proyecto ya están completas, no es necesario realizar ningún cambio.
Reemplaza -keep class A
por
-keep class A { <init>(); }
en las reglas de conservación de tu proyecto en los casos en los que necesites que se conserve el constructor
predeterminado.
|
android. |
Habilita resValues en todos los subproyectos.
|
true → false |
Habilita resValues solo en los subproyectos que lo necesiten. Para ello, establece lo siguiente en los archivos de compilación de Gradle de esos proyectos:
android {
buildFeatures {
resValues = true
}
} |
android. |
Habilita la compilación de sombreadores en todos los subproyectos. | true → false |
Habilita la compilación de sombreadores solo en los subproyectos que contengan sombreadores para compilar. Para ello, establece lo siguiente en los archivos de compilación de Gradle de esos proyectos:
android {
buildFeatures {
shaders = true
}
} |
android. |
En el AGP 9.0, getDefaultProguardFile() solo admitirá proguard-android-optimize.txt en lugar de proguard-android.txt. Esto es para evitar el uso accidental de la marca dontoptimize, que se incluye en proguard-android.txt.
|
false → true |
Puedes especificar de forma explícita dontoptimize en un proguardFile personalizado si quieres evitar la optimización, además de usar proguard-android-optimize.txt. Si es posible, asegúrate de quitar la marca dontoptimize de este archivo, ya que reduce los beneficios de optimización de R8. De lo contrario, inhabilita la opción estableciendo android.r8.globalOptionsInConsumerRules.disallowed=false.
|
android. |
A partir de AGP 9.0, la publicación de módulos de funciones y bibliotecas de Android fallará si los archivos de conservación del consumidor contienen configuraciones de Proguard problemáticas. Los archivos de conservación del consumidor que incluyen opciones globales, como dontoptimize o dontobfuscate, solo se deben usar en módulos de aplicación y pueden reducir los beneficios de optimización para los usuarios de la biblioteca. La compilación del módulo de la app para Android ignorará de forma silenciosa esas opciones globales si están incorporadas en una dependencia precompilada (JAR o AAR). Para ver cuándo ocurre esto, revisa configuration.txt (por lo general, en una ruta como <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) y busca comentarios como los siguientes: # REMOVED CONSUMER RULE: dontoptimize
|
false → true |
Las bibliotecas publicadas deben quitar las reglas incompatibles. En su lugar, las bibliotecas internas deben mover las reglas incompatibles, pero obligatorias, a un proguardFile en un módulo de la app. Inhabilita la opción estableciendo android.r8.globalOptionsInConsumerRules.disallowed=false. Una vez que todos tus archivos de Keep de consumidor sean compatibles, quita la inhabilitación.
|
android. |
No permite pasar proveedores para fuentes generadas con el DSL AndroidSourceSet.
|
false → true |
Usa la API de Sources en androidComponents para registrar las fuentes generadas.
|
android. |
Requiere que la ruta de acceso del compilador de sombreadores se establezca de forma explícita en local.properties si la compilación de sombreadores está habilitada.
|
false → true |
Agrega glslc.dir=/path/to/shader-tools al archivo local.properties de tu proyecto.
|
Funciones quitadas
El complemento de Android para Gradle 9.0 quita las siguientes funciones:
- Compatibilidad con apps para Wear OS incorporadas
AGP 9.0 quita la compatibilidad con la incorporación de apps para Wear OS, que ya no se admite en Play. Esto incluye quitar los parámetros de configuración dewearAppy el DSL deAndroidSourceSet.wearAppConfigurationName. Consulta Distribuye a Wear OS para obtener información sobre cómo publicar tu app en Wear OS. androidDependenciesysourceSetsinforman una tarea- Compatibilidad con APKs divididos por densidad
El AGP 9.0 quita la compatibilidad para crear APKs divididos según la densidad de la pantalla. Se quitaron la funcionalidad y las APIs relacionadas. Para dividir los APKs según la densidad de la pantalla con AGP 9.0 o versiones posteriores, usa paquetes de aplicación.
DSL modificada
El complemento de Android para Gradle 9.0 tiene los siguientes cambios rotundos en el DSL:
Se quitó la parametrización de
CommonExtension.En sí, este es solo un cambio rotundo a nivel de la fuente para ayudar a evitar futuros cambios rotundos a nivel de la fuente, pero también significa que los métodos de bloque deben pasar de
CommonExtensionaApplicationExtension,LibraryExtension,DynamicFeatureExtensionyTestExtension.Cuando actualices tu proyecto a AGP 9.0, refactoriza el código del complemento de Gradle que usa esos parámetros o los métodos de bloque. Por ejemplo, el siguiente complemento se actualiza para quitar el parámetro de tipo y no depender de los métodos de bloque quitados:
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) } } }En el caso de los complementos que se orientan a un rango de versiones del AGP, el uso directo del método get es compatible con el objeto binario de las versiones del AGP anteriores a la 9.0.
Se quitó el DSL
El complemento de Android para Gradle 9.0 quita lo siguiente:
AndroidSourceSet.jni, porque no funcionaba.AndroidSourceSet.wearAppConfigurationName, ya que se relaciona con la compatibilidad con la app para Wear OS incorporada que se quitó.BuildType.isRenderscriptDebuggable, porque no funcionaba.DependencyVariantSelection. Se reemplaza porDependencySelection, que se expone comokotlin.android.localDependencySelection.Installation.installOptions(String): Se reemplaza por la propiedad mutable deInstallation.installOptions.El bloque experimental, pero nunca estabilizado,
PostProcessing.ProductFlavor.setDimension, que se reemplaza por la propiedaddimensionLanguageSplitOptions, que solo era útil para Google Play Instant, que ya no está disponible.DensitySplit, porque la función ya no es compatible. El reemplazo consiste en usar paquetes de aplicaciones.
APIs que se quitaron
El complemento de Android para Gradle 9.0 quita lo siguiente:
AndroidComponentsExtension.finalizeDSl. Se reemplaza porfinalizeDslComponent.transformClassesWith. Se reemplaza porInstrumentation.transformClassesWithComponent.setAsmFramesComputationMode. Se reemplaza porInstrumentation.setAsmFramesComputationModeComponentBuilder.enabled. Se reemplaza porComponentBuilder.enable.DependenciesInfoBuilder.includedInApk. Se reemplaza porincludeInApkDependenciesInfoBuilder.includedInBundle. Se reemplaza porincludeInBundleGeneratesApk.targetSdkVersion. Se reemplaza portargetSdkVariant.minSdkVersion. Se reemplaza porminSdkVariant.maxSdkVersion. Se reemplaza pormaxSdkVariant.targetSdkVersion. Se reemplaza portargetSdkVariant.unitTest, ya que no se aplicaba al complementocom.android.test.unitTestestá disponible en los subtipos deVariantBuilderque extiendenHasUnitTest.VariantBuilder.targetSdkytargetSdkPreview, ya que no eran significativos en las bibliotecas En su lugar, usaGeneratesApkBuilder.targetSdkoGeneratesApkBuilder.targetSdkPreview.VariantBuilder.enableUnitTest, ya que no se aplicaba al complementocom.android.test.enableUnitTestestá disponible en los subtipos deVariantBuilderque extiendenHasUnitTestBuilder.Se quitó
VariantBuilder.unitTestEnabledpara dar lugar aenableUnitTest, que tiene un nombre más coherente, en los subtiposVariantBuilderque extiendenHasUnitTestBuilder.VariantOutput.enable. Se reemplaza porenabledLos objetos
FeaturePluginyFeatureExtensionque dejaron de estar disponibles y se inhabilitaronLas APIs de
BaseExtension.registerTransformobsoletas e inhabilitadas, que solo se mantuvieron para permitir la compilación con la versión más reciente de AGP mientras se orientaban a la ejecución en AGP 4.2 o versiones anteriores.
Se quitaron las propiedades de Gradle
Las siguientes propiedades de Gradle se agregaron inicialmente como formas de inhabilitar de manera global las funciones que estaban habilitadas de forma predeterminada.
Estas funciones se inhabilitaron de forma predeterminada desde el AGP 8.0 o versiones anteriores. Habilita estas funciones solo en los subproyectos que las usen para obtener una compilación más eficiente.
| Propiedad | Función | Reemplazo |
|---|---|---|
android. |
Habilita la compilación de AIDL en todos los subproyectos. |
Habilita la compilación de AIDL solo en los subproyectos en los que haya fuentes de AIDL. Para ello, configura la siguiente propiedad en los archivos de compilación de Gradle de esos proyectos:
android {
buildFeatures {
aidl = true
}
} |
android. |
Habilita la compilación de RenderScript en todos los subproyectos. |
Habilita la compilación de RenderScript solo en los subproyectos en los que haya fuentes de RenderScript. Para ello, configura la siguiente propiedad en los archivos de compilación de Gradle de esos proyectos:
android {
buildFeatures {
renderScript = true
}
} |
Propiedades de Gradle aplicadas de forma forzosa
AGP 9.0 arroja un error si configuras las siguientes propiedades de Gradle.
El Asistente de actualización del complemento de Android para Gradle no actualizará los proyectos a AGP 9.0 que usen estas propiedades.
| Propiedad | Función |
|---|---|
android. |
La reducción de recursos ahora siempre se ejecuta como parte de R8, y se quitó la implementación anterior. |
android. |
La reducción de recursos ahora siempre usa la reducción precisa de recursos, lo que permite quitar más elementos. |
Cambios en R8
Los siguientes cambios de R8 se incluyen en AGP 9.0.0.
Nueva opción de configuración -processkotlinnullchecks
Agregamos la nueva opción de R8 -processkotlinnullchecks para configurar R8 de modo que procese las verificaciones nulas de Kotlin. La opción toma un argumento obligatorio que debe ser uno de los siguientes tres valores: keep, remove_message y remove.
La opción procesa las siguientes verificaciones de nulos que agrega el compilador de 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);
}
Los valores de las opciones, ordenados de menor a mayor, tienen el siguiente efecto:
keepno cambia las verificaciones.remove_messagereescribe cada llamada de método de verificación en una llamada agetClass()en el primer argumento de la llamada (lo que mantiene la verificación de nulos, pero sin ningún mensaje).removequita las verificaciones por completo.
De forma predeterminada, R8
usa remove_message. Cualquier especificación de -processkotlinnullchecks
anulará eso. Si se especifica varias veces, se usa el valor más
fuerte.
Deja de propagar información de conservación a métodos complementarios
Cuando las reglas de conservación coinciden con los métodos de interfaz que están sujetos a la expansión de sintaxis, R8 transfería internamente los bits de inhabilitación de optimización y de inhabilitación de reducción a los métodos complementarios sintetizados.
A partir de AGP 9.0, las reglas de conservación ya no se aplican a los métodos complementarios. Esto es coherente con el hecho de que las reglas de conservación no se aplican a otros campos, métodos o clases sintetizados por el compilador.
Cuando se transferían los bits disallow optimization y disallow shrinking a los métodos complementarios, se admitía el siguiente caso de uso:
- Compila una biblioteca con métodos de interfaz
default/static/privateen DEX conminSdk< 24 y reglas que conserven los métodos de interfaz. - Compila una app con la biblioteca en la ruta de clase y
-applymapping. - Combina la app y la biblioteca.
Ten en cuenta que esto solo funciona con -applymapping, ya que el bit disallow
obfuscation no se transfiere a los métodos complementarios, es decir, las clases complementarias generadas a partir del paso 1 tendrían nombres de métodos ofuscados.
En el futuro, este caso de uso ya no se admitirá para minSdk <
24. La solución alternativa es hacer lo siguiente:
- Aplica la expansión de sintaxis a la biblioteca con métodos de interfaz
default/static/privatepara clasificar archivos conminSdk< 24. - Compila el artefacto con expansión de sintaxis usando R8 y reglas que mantengan los métodos de interfaz en las clases complementarias.
- Compila la app con la biblioteca en la ruta de clase.
- Combina la app y el artefacto sin sintaxis enriquecida.
Otro efecto secundario de esto es que ya no es posible mantener los atributos de clase interna y método envolvente para las clases anónimas y locales dentro de los métodos complementarios de interfaz.
Cambia el archivo de origen emitido predeterminado a r8-map-id-<MAP_ID>
Este cambio se encuentra en el AGP a partir de la versión 8.12.0.
El atributo de archivo de origen emitido predeterminado para una clase cambia de SourceFile a r8-map-id-<MAP_ID> cuando se requiere un nuevo seguimiento (es decir, cuando se habilita la optimización o la ofuscación).
Dado un seguimiento de pila ofuscado, el nuevo atributo de archivo de origen permite extraer el ID del archivo de asignación que se requiere para el rastreo, que se puede usar para admitir el rastreo automatizado de seguimientos de pila en Logcat.
Si se usa un atributo de archivo de origen personalizado (-renamesourcefileattribute),
este atributo sigue teniendo prioridad.
En el modo de compatibilidad con ProGuard (cuando gradle.properties contiene android.enableR8.fullMode=false), emitir un atributo de archivo de origen de r8-map-id-<MAP_ID> solo tiene efecto si no se conserva el atributo SourceFile. Las apps que usan el modo de compatibilidad de ProGuard y quieren incluir el ID del archivo de asignación en sus seguimientos de pila deben quitar -keepattributes SourceFile (o migrar al modo completo de R8).
El ID de mapa que se usa en r8-map-id-<MAP_ID> es el hash de mapa completo y no un prefijo de 7 caracteres del hash de mapa que se usaba anteriormente.
Habilita el uso de nombres sintéticos minimizados en la expansión de sintaxis de L8
El nombre de las clases sintéticas que genera D8 suele contener la cadena secundaria $$ExternalSynthetic, que indica que se trata de un elemento sintético generado por D8.
Además, el nombre del elemento sintético también codifica el tipo de elemento sintético (por ejemplo, Backport, Lambda). Esto tiene un impacto negativo en el tamaño del DEX resultante, ya que los nombres de las clases ocupan más espacio en el grupo de cadenas.
El AGP 9.0 configura L8 (expansión de sintaxis de la biblioteca principal) para que el archivo DEX que contiene todas las clases j$ use un nuevo formato de nombre de clase abreviado para las clases sintéticas. El nombre de la clase nueva usa un ID numérico (por ejemplo, $1).
Quitar la compatibilidad con -addconfigurationdebugging
AGP 9.0 quita la compatibilidad con -addconfigurationdebugging. Ahora, el compilador informa una advertencia si se usa la marca.
Elimina la compatibilidad para generar reglas de L8 desde D8/R8
Este cambio solo es relevante para los desarrolladores que usan la línea de comandos o las APIs de D8/R8 directamente.
R8 9.0 quita la compatibilidad para generar reglas de conservación para L8 desde D8 y R8.
En su lugar, debes usar TraceReferences para este propósito.
Específicamente, se quitan los métodos D8Command.builder.setDesugaredLibraryKeepRuleConsumer y R8Command.Builder.setDesugaredLibraryKeepRuleConsumer, y se quita la compatibilidad con --desugared-lib-pg-conf-output de las opciones de línea de comandos de D8 y R8.
Errores corregidos
Complemento de Android para Gradle 9.0.0
| Errores corregidos | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Complemento de Android para Gradle |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Integración de lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Reductor (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||