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 | Notas | |
---|---|---|---|
Gradle | 7.0.2 | 7.0.2 | Para obtener más información, consulta cómo actualizar Gradle. |
Herramientas de desarrollo del SDK | 30.0.2 | 30.0.2 | Instala o configura las herramientas de compilación del SDK. |
NDK | N/A | 21.4.7075529 | Instala o configura una versión diferente del NDK. |
JDK | 11 | 11 | Para obtener más información, consulta cómo configurar la versión de JDK. |
Se requiere JDK 11 para ejecutar AGP 7.0
Cuando usas el complemento de Android para Gradle 7.0 durante la compilación de 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 de herramientas de línea de comandos del SDK de Android actual.
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 bibliotecas, 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 dependencias en paralelo y generará un solo informe, que incluirá 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 se muestra como "UP-TO-DATE" en los resultados 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 (problema #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 ignorar esta advertencia. Dos motivos comunes para ignorar la advertencia son los siguientes:
-
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).
-
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ó porapi
oimplementation
.
También se aplica a las variantes *Compile. Por ejemplo:debugCompile
. -
provided
Se reemplazó porcompileOnly
.
También se aplica a las variantes *Provided. Por ejemplo:releaseProvided
. -
apk
Se reemplazó porruntimeOnly
. -
publish
Se reemplazó porruntimeOnly
.
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 el tiempo de 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.
Problemas 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 de lint está actualizada (problema #191897708). Para obtener más información, consulta Cambios de comportamiento de lint. Este problema 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 (problema #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.