Complemento de Android para Gradle 7.0.0 (julio de 2021)

El complemento de Android para Gradle 7.0.0 es una actualización importante que incluye una variedad de nuevas funciones y mejoras.

7.0.1 (agosto de 2021)

Esta actualización menor incluye diversas correcciones de errores. Para ver una lista de las correcciones de errores más importantes, consulta la publicación relacionada en el blog de actualizaciones de versiones.

Compatibilidad

Versión mínima Versión predeterminada
Gradle 7.0.2 7.0.2
Herramientas de desarrollo del SDK 30.0.2 30.0.2
NDK N/A 21.4.7075529
JDK 11 11

Se requiere JDK 11 para ejecutar AGP 7.0

Cuando usas el complemento de Android para Gradle 7.0 a fin de compilar tu app, ahora se requiere JDK 11 para ejecutar Gradle. Android Studio Arctic Fox empaqueta JDK 11 y configura Gradle para usarlo de forma predeterminada. Esto significa que la mayoría de los usuarios de Android Studio no necesitan hacer cambios en la configuración de sus proyectos.

Si necesitas configurar de forma manual la versión de JDK que usa AGP dentro de Android Studio, debes usar JDK 11 o una versión posterior.

Cuando uses AGP independiente de Android Studio, actualiza la versión de JDK configurando la variable de entorno JAVA_HOME o la opción de línea de comandos -Dorg.gradle.java.home en el directorio de instalación de JDK 11.

Ten en cuenta que SDK Manager y el Administrador de AVD en el paquete de herramientas del SDK obsoleto no funcionan con JDK 11. Para seguir usando SDK Manager y el Administrador de AVD con AGP 7.0 y versiones posteriores, debes cambiar a las nuevas versiones de las herramientas en el paquete actual de herramientas de línea de comandos del SDK de Android.

API de variantes estable

La nueva API de variantes ahora es estable. Consulta las interfaces nuevas en el paquete com.android.build.api.variant y los ejemplos en el proyecto gradle-recipes de GitHub. Como parte de la nueva API de Variant, pusimos a disposición varios archivos intermedios, llamados artefactos, a través de la interfaz Artifacts. Esos artefactos, como el manifiesto combinado, se pueden obtener y personalizar de manera segura con complementos y código de terceros.

Para seguir ampliando la API de Variant, incorporaremos nuevas funciones y aumentaremos la cantidad de artefactos intermedios que estarán disponibles para la personalización.

Cambios de comportamiento de lint

En esta sección, se describen varios cambios de comportamiento de lint en el complemento de Android para Gradle 7.0.0.

Lint mejorado para dependencias de biblioteca

Ahora lint se ejecuta con checkDependencies = true más rápido que antes. En el caso de los proyectos de Android que consisten en una app con dependencias de biblioteca, se recomienda establecer checkDependencies en true como se muestra a continuación y ejecutar lint a través de ./gradlew :app:lint, que analizará todos los módulos de dependencia en paralelo y generará un solo informe, con los problemas de la app y todas sus dependencias.

Groovy

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

Las tareas de lint ahora pueden estar actualizadas

Si las fuentes y los recursos de un módulo no cambiaron, no es necesario volver a ejecutar la tarea de análisis de lint para el módulo. Cuando esto sucede, la ejecución de la tarea aparece como "UP-TO-DATE" en el resultado de Gradle. Con este cambio, cuando ejecutes lint en un módulo de aplicación con checkDependencies = true, solo los módulos que hayan cambiado deberán ejecutar su análisis. Como resultado, lint puede ejecutarse aún más rápido.

Tampoco se debe ejecutar la tarea de generación de informe de lint si sus entradas no cambiaron. Un problema conocido relacionado es que no hay resultados de texto de lint impresos en stdout cuando la tarea de lint está UP-TO-DATE (error #191897708).

Cómo ejecutar lint en módulos de funciones dinámicas

AGP ya no permite ejecutar lint desde módulos de funciones dinámicas. Cuando se ejecute lint desde el módulo de aplicaciones correspondiente, se ejecutará en sus módulos de funciones dinámicas y se incluirán todos los errores en el informe de lint de la app. Un problema conocido relacionado es que, cuando lint se ejecuta con checkDependencies = true desde un módulo de app, las dependencias de la biblioteca de funciones dinámicas no se verifican, a menos que también sean dependencias de apps (problema #191977888).

Cómo ejecutar lint solo en la variante predeterminada

Cuando se ejecuta ./gradlew :app:lint, ahora lint solo se ejecuta para la variante predeterminada. En las versiones anteriores de AGP, lint se ejecutaba para todas las variantes.

Advertencias de clases faltantes en el reductor R8

R8 maneja las clases faltantes y la opción -dontwarn de manera más precisa y coherente. Por lo tanto, debes comenzar a evaluar las advertencias de clases faltantes que emite R8.

Cuando R8 encuentre una referencia de clase que no esté definida en tu app o en una de sus dependencias, emitirá una advertencia que se mostrará en el resultado de compilación. Por ejemplo:

R8: Missing class: java.lang.instrument.ClassFileTransformer

Esta advertencia indica que no se pudo encontrar la definición de clase java.lang.instrument.ClassFileTransformer cuando se analizaba el código de la app. Si bien esto suele significar que hay un error, es posible que quieras ignorarla. Dos motivos comunes para ignorar la advertencia son los siguientes:

  1. Las bibliotecas que se orientan a la JVM y a la clase faltante son del tipo de biblioteca de JVM (como en el ejemplo anterior).

  2. Una de tus dependencias usa una API de solo tiempo de compilación.

Para ignorar una advertencia de clase faltante, agrega una regla -dontwarn a tu archivo proguard-rules.pro. Por ejemplo:

-dontwarn java.lang.instrument.ClassFileTransformer

Para mayor comodidad, AGP generará un archivo que contenga todas las reglas potencialmente faltantes y las escribirá en una ruta de acceso de archivo como la siguiente: app/build/outputs/mapping/release/missing_rules.txt. Agrega las reglas a tu archivo proguard-rules.pro para ignorar las advertencias.

En AGP 7.0, los mensajes de clase faltantes aparecerán como advertencias, y podrás convertirlos en errores si configuras android.r8.failOnMissingClasses = true en gradle.properties. En AGP 8.0, estas advertencias se convertirán en errores que afectarán a tu compilación. Es posible conservar el comportamiento de AGP 7.0 si agregas la opción -ignorewarnings a tu archivo proguard-rules.pro, pero no es recomendable.

Se quitó la caché de compilación del complemento de Android para Gradle

Se quitó la caché de compilación de AGP en AGP 4.1. Introducida en AGP 2.3 para complementar la caché de compilación de Gradle, la caché de compilación de AGP se reemplazó por completo por la caché de compilación de Gradle en AGP 4.1. Este cambio no afecta el tiempo de compilación.

En AGP 7.0, se quitaron las propiedades android.enableBuildCache y android.buildCacheDir, y la tarea cleanBuildCache.

Usa el código fuente de Java 11 en tu proyecto

Ahora, puedes compilar código fuente hasta Java 11 en el proyecto de tu app, lo que te permite usar funciones de lenguaje más nuevas, como métodos de interfaz privada, el operador Diamante para clases anónimas y sintaxis de variables locales para parámetros lambda.

Para habilitar esta función, establece compileOptions como la versión de Java deseada y compileSdkVersion en 30 o más:

// build.gradle
android {
  compileSdkVersion 30
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_11
    targetCompatibility JavaVersion.VERSION_11
  }
  // For Kotlin projects
  kotlinOptions {
    jvmTarget = "11"
  }
}
// build.gradle.kts
android {
  compileSdkVersion(30)
  compileOptions {
    sourceCompatibility(JavaVersion.VERSION_11)
    targetCompatibility(JavaVersion.VERSION_11)
  }
  kotlinOptions {
    jvmTarget = "11"
  }
}

Se quitaron las configuraciones de dependencias

En AGP 7.0, se quitaron los siguientes parámetros de configuración (o permisos de dependencia):

  • compile
    Según el caso de uso, esto se reemplazó por api o implementation.
    También se aplica a las variantes *Compile. Por ejemplo: debugCompile.
  • provided
    Se reemplazó por compileOnly.
    También se aplica a las variantes *Provided. Por ejemplo: releaseProvided.
  • apk
    Se reemplazó por runtimeOnly.
  • publish
    Se reemplazó por runtimeOnly.

En la mayoría de los casos, el Asistente de actualización del AGP migrará automáticamente tu proyecto a las configuraciones nuevas.

Cambio de ruta de clase cuando compilas con el complemento de Android para Gradle

Si compilas con el complemento de Android para Gradle, la ruta de clase de la compilación puede cambiar. Debido a que AGP ahora usa configuraciones api/implementation internamente, es posible que se quiten algunos artefactos de la ruta de clase de la compilación. Si necesitas una dependencia de AGP durante la compilación, asegúrate de agregarla como una dependencia explícita.

No se admite la adición de bibliotecas nativas a una carpeta de recursos de Java

Anteriormente, podías agregar una biblioteca nativa en una carpeta de recursos de Java y registrar la carpeta con android.sourceSets.main.resources.srcDirs para que se extrajera la biblioteca nativa y se agregara al APK final. A partir de AGP 7.0, esto no es compatible y se ignoran las bibliotecas nativas en una carpeta de recursos de Java. En su lugar, usa el método DSL destinado a bibliotecas nativas, android.sourceSets.main.jniLibs.srcDirs. Para obtener más información, consulta cómo configurar conjuntos de orígenes.

Errores conocidos

En esta sección, se describen los problemas conocidos presentes en el complemento de Android para Gradle 7.0.0.

Incompatibilidad con el complemento multiplataforma 1.4.x de Kotlin

El complemento de Android para Gradle 7.0.0 es compatible con el complemento multiplataforma de Kotlin 1.5.0 y versiones posteriores. Los proyectos que utilizan la compatibilidad con varias plataformas de Kotlin deben actualizarse a Kotlin 1.5.0 para usar el complemento de Android para Gradle 7.0.0. Como solución alternativa, puedes cambiar el complemento de Android para Gradle a la versión inferior 4.2.x, aunque no se recomienda.

Para obtener más información, consulta KT-43944.

Falta el resultado de lint

No hay resultados de texto de lint impresos en stdout cuando la tarea lint está actualizada (error #191897708). Para obtener más información, consulta Cambios de comportamiento de lint. Ese error se solucionará en el complemento de Android para Gradle 7.1.

No se realizó la verificación de lint de todas las dependencias de la biblioteca de funciones dinámicas

Cuando ejecutas lint con checkDependencies = true desde un módulo de app, no se verifican las dependencias de la biblioteca de funciones dinámicas, a menos que también sean dependencias de apps (error #191977888). Como solución alternativa, la tarea de lint se puede ejecutar en esas bibliotecas. Para obtener más información, consulta Cambios de comportamiento de lint.