Complemento de Android para Gradle 9.0.1 (enero de 2026)

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.android no 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.multiplatform en el mismo subproyecto de Gradle que los complementos com.android.library y com.android.application no 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 applicationVariants y APIs similares por la nueva API de androidComponents. Esto puede ser más complejo, ya que la API de androidComponents está 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 y
unitTestVariants
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)
    }
}
Es posible que no haya un reemplazo directo para todas las APIs anteriores. Informa un problema si hay un caso de uso que no se incluye en las nuevas APIs de variantes.
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 y
testServer
Registro de entornos de pruebas personalizados para ejecutar pruebas en dispositivos Android y emuladores. Cambia a dispositivos administrados por Gradle.
sdkDirectory,
ndkDirectory,
bootClasspath,
adbExecutable y
adbExe
Usar varios componentes del SDK de Android para tareas personalizadas Cambia a androidComponents.sdkComponents.
registerArtifactType,
registerBuildTypeSourceProvider,
registerProductFlavorSourceProvider,
registerJavaArtifact,
registerMultiFlavorSourceProvider y
wrapJavaSourceSet
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.newDsl 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.builtInKotlin Habilita Kotlin integrado false → true Migra a Kotlin integrado si puedes o inhabilita la opción.
android.uniquePackageNames 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.useAndroidx Usa las dependencias de androidx de forma predeterminada. false → true Adopta las dependencias de androidx.
android.default.androidx.test.runner 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.dependency.useConstraints 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.enableAppCompileTimeRClass 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.sdk.defaultTargetSdkToCompileSdkIfUnset 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.onlyEnableUnitTestForTheTestedBuildType 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.proguard.failOnMissingFiles 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.r8.optimizedResourceShrinking 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.r8.strictFullModeForKeepRules 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.defaults.buildfeatures.resvalues 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.defaults.buildfeatures.shaders 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.r8.proguardAndroidTxt.disallowed 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.r8.globalOptionsInConsumerRules.disallowed 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.sourceset.disallowProvider 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.custom.shader.path.required 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 de wearApp y el DSL de AndroidSourceSet.wearAppConfigurationName. Consulta Distribuye a Wear OS para obtener información sobre cómo publicar tu app en Wear OS.
  • androidDependencies y sourceSets informan 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 CommonExtension a ApplicationExtension, LibraryExtension, DynamicFeatureExtension y TestExtension.

    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:

APIs que se quitaron

El complemento de Android para Gradle 9.0 quita lo siguiente:

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.defaults.buildfeatures.aidl 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
  }
}
en el archivo de compilación de Gradle de cada subproyecto que contenga fuentes de AIDL
android.defaults.buildfeatures.renderscript 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.r8.integratedResourceShrinking La reducción de recursos ahora siempre se ejecuta como parte de R8, y se quitó la implementación anterior.
android.enableNewResourceShrinker.preciseShrinking 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:

  • keep no cambia las verificaciones.
  • remove_message reescribe cada llamada de método de verificación en una llamada a getClass() en el primer argumento de la llamada (lo que mantiene la verificación de nulos, pero sin ningún mensaje).
  • remove quita 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:

  1. Compila una biblioteca con métodos de interfaz default/static/private en DEX con minSdk < 24 y reglas que conserven los métodos de interfaz.
  2. Compila una app con la biblioteca en la ruta de clase y -applymapping.
  3. 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:

  1. Aplica la expansión de sintaxis a la biblioteca con métodos de interfaz default/static/private para clasificar archivos con minSdk < 24.
  2. Compila el artefacto con expansión de sintaxis usando R8 y reglas que mantengan los métodos de interfaz en las clases complementarias.
  3. Compila la app con la biblioteca en la ruta de clase.
  4. 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
Solicitud de función: Insertar la versión ideal del AGP como una propiedad
Se estabilizó SingleArtifact.VERSION_CONTROL_INFO_FILE.
La salida de logcat de androidTest connectedCheck está dañada
La compatibilidad integrada con Kotlin en AGP no debería sincronizarse con los conjuntos de fuentes de Kotlin
missingDimensionStrategy prefiere una variante que coincida con su propio nombre, incluso de una dimensión no relacionada.
La compatibilidad integrada con Kotlin en AGP no debería sincronizarse con los conjuntos de fuentes de Kotlin
AGP 9.0.0-rc01 no resuelve las bibliotecas de Kotlin a través de la función kotlin()
Built-in-kotlin no publica la restricción de dependencia de kotlin-stdlib en el pom de Maven.
Se agregó un caso de prueba para la divergencia entre compileSdk y targetSdk
Un valor de resConfigs vacío genera un error de aapt poco claro
El proyecto de Java puro depende de la stdlib de Kotlin.
Se quitaron las propiedades obsoletas de KotlinMultiplatformAndroidCompilationBuilder en AGP 9.0.
`com.android.tools.build:gradle:9.0.0-alpha05` debería tener una dependencia de la API en KGP y gradle-api
Se cambió el nombre del complemento de Gradle com.android.experimental.built-in-kotlin
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` no funciona
Las verificaciones de metadatos de Aar en el SDK de compilación usan el DSL antiguo
Se quitó la propiedad obsoleta `com.android.build.api.dsl.ManagedDevices.devices`.
La compatibilidad integrada con Kotlin en AGP no debería sincronizarse con los conjuntos de fuentes de Kotlin
Se produce un error en la publicación de la biblioteca de Android si el archivo de conservación del consumidor contiene -dontobfuscate
No hay opciones para imprimir la asignación de recursos optimizados
Hacer que sea un error llamar a finalizeDsl después de que se haya pasado esta fase
El AGP inicializa la configuración de Jetifier incluso cuando Jetifier está inhabilitado
La compilación en Kotlin no agrega kotlinStdlib como una dependencia de tiempo de compilación cuando `kotlin.stdlib.default.dependency` es verdadero para los archivos pom y de módulo
El nuevo DSL de optimización no crea configuration.txt de forma predeterminada
AGP 8.13.0 no puede verificar el gráfico de navegación en un módulo
AGP usa la API de Gradle obsoleta: notación de varias cadenas
Se advierte a los usuarios que intentan usar la biblioteca de multidex heredada con minSdkVersion >=21
Una compilación falla si hay tareas de generación de código
Con `android.builtInKotlin=false`, `android.newDsl=false` y `android.enableLegacyVariantApi=false`, el uso del complemento `kotlin-android` fallará con el mensaje "API 'applicationVariants' is obsolete"
La versión integrada de Kotlin no puede resolver la dependencia kotlin-stdlib sin versión cuando kotlin.stdlib.default.dependency=false
DexData abre un archivo sin cerrarlo, lo que impide la limpieza
AndroidSourceDirectorySet debería dejar de extender PatternFilterable en AGP 9.0
Error de dispositivo de prueba en módulos de solo prueba
Error incorrecto cuando se usan receptores de contexto en dispositivos de prueba
Errores incorrectos del IDE para el código de Kotlin en testFixtures
El complemento `legacy-kapt` omite el procesamiento de anotaciones, a diferencia de `kotlin-kapt`
compileSdkSpec.minorApiLevel no funciona con SettingsExtension.
[fused lib - public] Generated fused library does not include sources
extractNativeLibs y useEmbeddedDex no deben provenir del manifiesto
Advertencias de R8 en AGP 9.0.0-alpha09
Se quitó AndroidSourceSet.jni obsoleto en AGP 9.0
Se quitó Installation.installOptions() en AGP 9.0
Se quitó BuildType.isRenderscriptDebuggable en AGP 9.0.
Quita android.defaults.buildfeatures.renderscript
`com.android.kotlin.multiplatform.library` falla con dispositivos administrados por Gradle.
Se quitaron las marcas predeterminadas de gradle.properties `android.defaults.buildfeatures.aidl`
La compilación falla cuando no existe el archivo de ProGuard.
remove buildconfig defaults gradle.properties flags
Se cambia el valor predeterminado de targetSdk de la app para que se base en compileSdk y no en minSdk.
Cuando se habilita `isIncludeAndroidResources`, `process{Variant}UnitTestManifest` no puede combinar los usos de tools:overrideLibrary en AGP 8.12.0
El AGP genera advertencias de baja en Gradle para las tareas de prueba de JVM
DependencyReportTask no es compatible con la caché de configuración.
Cambia la versión predeterminada de Java de origen y destino de Java 8 a Java 11 en AGP 9.0
Se cambió el valor predeterminado de android.useAndroidX a verdadero
Se mejoró la excepción que se produce cuando se aplica el complemento de kapt con Kotlin integrado.
android.proguard.failOnMissingFiles no funciona para consumerProguardFiles.
Se actualizó la dependencia del complemento de Gradle para Kotlin a la versión 2.2.10.
Crea KotlinJvmAndroidCompilation con la API de KGP
Se aplicó el modo de API explícita de Kotlin a las fuentes de prueba
Lint
AGP 8.11.0: La tarea lintAnalyzeRelease falla cuando se aplican archivos .gradle.kts con apply(from = "...")
La verificación de lint SdkIntAtLeast no comprueba si el valor anotado es correcto
Kotlin integrado no agrega .kotlin_module a META-INF
La ruta de clase de Lint contiene clases duplicadas en diferentes versiones
La solución alternativa para anular recursos privados no funciona (tools:override = "true")
Error: Cuando se quitan los recursos no utilizados, no se quitan sus traducciones ni se pregunta al respecto.
Lint arroja la advertencia "Could not clean up K2 caches"
Lint arroja la advertencia "Could not clean up K2 caches"
Integración de lint
Errores de caché de AndroidLintAnalysisTask en diferentes proveedores de JDK o versiones secundarias debido a diferencias en systemPropertyInputs.javaVersion
Lint usa automáticamente el SDK instalado más reciente, a pesar de compileSdk, no se registra como entrada de tarea y rompe el almacenamiento en caché
Reductor (R8)
La reducción de recursos optimizada de R8 falla de forma silenciosa si se usan IDs de recursos finales