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 y funciones de Google Workspace.

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 para compilar tu app, JDK 11 ahora necesarias para ejecutar Gradle. Android Studio Arctic Fox incluye JDK 11 y configura Gradle para usarlo de forma predeterminada, lo que significa que la mayoría de los los usuarios no necesitan realizar cambios en la configuración de sus proyectos.

Si necesitas configurar manualmente Versión de JDK que usa AGP dentro de Android Studio, debes usar JDK 11. o una superior.

Cuando uses AGP independiente de Android Studio, actualiza la versión de JDK haciendo lo siguiente: Configura la variable de entorno JAVA_HOME. o la opción de línea de comandos -Dorg.gradle.java.home al 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 el JDK 11. Para seguir usando SDK Manager y el Administrador de AVD con AGP 7.0 y versiones posteriores, debes cambiar a las versiones nuevas de las herramientas en actual Herramientas de línea de comandos del SDK de Android paquete.

API de variantes estable

La nueva API de variantes ahora es estable. Consulta las nuevas interfaces en la com.android.build.api.variant el paquete, y los ejemplos en el Proyecto gradle-recipes de GitHub. Como parte del nuevo de variantes, pusimos a disposición varios archivos intermedios, llamados artefactos, mediante Artefactos interfaz de usuario. Esos artefactos, como el manifiesto fusionado, pueden obtenerse y personalizarse con complementos y código de terceros.

Agregaremos nuevas funcionalidades para seguir ampliando la API de Variant. y aumentar la cantidad de artefactos intermedios que ponemos a disposición personalización.

Cambios de comportamiento de lint

En esta sección, se describen varios cambios de comportamiento de Lint en Android Gradle. plugin 7.0.0.

Lint mejorado para dependencias de biblioteca

Ahora lint se ejecuta con checkDependencies = true más rápido. que antes. Para proyectos de Android que consistan en una app con biblioteca las dependencias, se recomienda configurar checkDependencies como true como se muestra a continuación y para ejecutar lint mediante ./gradlew :app:lint, que analizará todas las dependencias módulos en paralelo y producir un único informe con los problemas del la aplicación 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, el análisis de lint del módulo no necesita ejecutarse de nuevo. Cuando esto sucede, el la ejecución de la tarea aparece como “UP-TO-DATE” en Gradle salida. Con este cambio, cuando se ejecuta lint en un módulo de aplicación con checkDependencies = true, solo los módulos que cambiaron necesitan para ejecutar sus análisis. Como resultado, lint puede ejecutarse aún más rápido.

Tampoco se debe ejecutar la tarea de informe de lint si sus entradas cambió. Un problema conocido relacionado es que no hay lint. resultado de texto impreso en stdout cuando la tarea 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. Si ejecutas lint desde el módulo de aplicaciones correspondiente, se ejecutará en sus módulos de funciones dinámicas e incluyen todos los errores en el código de lint de la app . Un problema conocido relacionado es que, cuando se ejecuta 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 apps las dependencias (problema #191977888).

Cómo ejecutar lint solo en la variante predeterminada

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

Advertencias de clases faltantes en el reductor R8

R8 con mayor precisión y maneja de forma coherente las clases faltantes y la opción -dontwarn. Por lo tanto, debes comenzar a evaluar las advertencias de clases faltantes que se emitieron por R8.

Cuando R8 encuentra una referencia de clase que no está definida en tu app o una de sus dependencias, emitirá una advertencia que aparecerá en tu compilación salida. Por ejemplo:

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

Esta advertencia significa que la definición de la clase No se pudo encontrar java.lang.instrument.ClassFileTransformer cuando analices el código de tu app. Si bien esto suele significar que hay un error, es posible que quiera ignorar esta advertencia. Dos motivos comunes para ignorar la advertencia:

  1. Las bibliotecas que se orientan a la JVM y la clase faltante son 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 un -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 faltantes y las escribes en una ruta de archivo como la siguiente: app/build/outputs/mapping/release/missing_rules.txt Agrega el 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 puedes convertirlos en errores estableciendo android.r8.failOnMissingClasses = true in gradle.properties En AGP 8.0, estas advertencias se convertirán en errores que dañan tu compilación. Es posible mantener el comportamiento de AGP 7.0 si haces lo siguiente: agregando la opción -ignorewarnings a tu proguard-rules.pro, pero no se recomienda.

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 anteriormente en AGP 2.3 para complementar la caché de compilación de Gradle, se reemplazó la caché de compilación de AGP. por completo a través de la caché de compilación de Gradle en AGP 4.1. Este cambio no afecta tiempo de compilación.

En AGP 7.0, la propiedad android.enableBuildCache, propiedad android.buildCacheDir y el Se quitó cleanBuildCache tarea.

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 permite nuevas funciones del lenguaje, como los métodos de interfaz privada, el ícono para clases anónimas, y sintaxis de variables locales para parámetros lambda.

Para habilitar esta función, establece compileOptions en los valores deseados Versión de Java y establece compileSdkVersion en 30 o superior:

// 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 agregaron los siguientes parámetros de configuración (o permisos de dependencias) quitada:

  • compile de
    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 de
    Se reemplazó por compileOnly.
    También se aplica a las variantes *Proporcionadas, por ejemplo: releaseProvided
  • apk de
    Se reemplazó por runtimeOnly.
  • publish de
    Se reemplazó por runtimeOnly.

En la mayoría de los casos, el AGP El Asistente de actualización migrará automáticamente tu proyecto a la nueva parámetros de configuración.

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

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

Adición de bibliotecas nativas a recursos de Java La carpeta no es compatible.

Anteriormente, se podía agregar una biblioteca nativa en una carpeta de recursos de Java y registra la carpeta con android.sourceSets.main.resources.srcDirs para que la biblioteca nativa se extraiga y se agregue a la biblioteca APK A partir de AGP 7.0, no se admite, y las bibliotecas nativas no se admiten en un Se ignoran la carpeta de recursos de Java. En su lugar, usa el método DSL diseñado para bibliotecas nativas, android.sourceSets.main.jniLibs.srcDirs. Para más información, consulta cómo configurar conjuntos de orígenes.

Problemas conocidos

En esta sección, se describen los problemas conocidos relacionados con 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 Kotlin Complemento multiplataforma 1.5.0 y posterior. Proyectos que usan Kotlin La compatibilidad multiplataforma debe actualizarse a Kotlin 1.5.0 para usar Android Gradle Complemento 7.0.0. Como solución alternativa, puedes cambiar el complemento de Android para Gradle a una versión inferior. a 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á actualizado (problema #191897708). Para obtener más información, consulta Cambios de comportamiento de lint. Esta edición se corregirá 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 una del módulo de la app, no se verifican las dependencias de la biblioteca de funciones dinámicas, a menos que también son dependencias de la app (problema #191977888). Como solución alternativa, la tarea de lint se puede ejecutar en esas bibliotecas. Para obtener más contexto, Consulta Cambios de comportamiento de lint.