Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Notas de la versión del complemento de Android para Gradle

El sistema de compilación de Android Studio está basado en Gradle, y el complemento de Gradle para Android agrega varias funciones que son específicas para la compilación de apps de Android. Si bien el complemento de Android suele actualizarse en el paso de bloqueo con Android Studio, el complemento (y el resto del sistema Gradle) se pueden ejecutar independientemente de Android Studio y se pueden actualizar por separado.

En esta página, se explica cómo mantener tus herramientas de Gradle actualizadas y cuál es el contenido de las actualizaciones recientes.

Para obtener detalles sobre cómo configurar tus compilaciones de Android con Gradle, consulta las siguientes páginas:

Para obtener más información sobre el sistema de compilación de Gradle, consulta la Guía del usuario de Gradle.

Cómo actualizar el complemento de Android para Gradle

Si actualizas Android Studio, es posible que recibas una solicitud para actualizar automáticamente el complemento de Android para Gradle a la versión más reciente disponible. Puedes aceptar la actualización o especificar de forma manual una versión, según los requisitos de compilación del proyecto.

Puedes especificar la versión del complemento en el menú File > Project Structure > Project en Android Studio o en el archivo build.gradle de nivel superior. La versión del complemento se aplica a todos los módulos integrados en ese proyecto de Android Studio. En el siguiente ejemplo, se configura la versión 3.4.2 del archivo build.gradle:

    buildscript {
        repositories {
            // Gradle 4.1 and higher include support for Google's Maven repo using
            // the google() method. And you need to include this repo to download
            // Android Gradle plugin 3.0.0 or higher.
            google()
            ...
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.4.2'
        }
    }
    

Precaución: No se deben usar dependencias dinámicas en los números de versión, como 'com.android.tools.build:gradle:2.+'. El uso de esta función puede causar actualizaciones de versión inesperadas y dificultades para resolver diferencias entre versiones.

Si no se descargó la versión especificada del complemento, Gradle la descargará la próxima vez que compiles el proyecto o hagas clic en Tools > Android > Sync Project with Gradle Files en la barra de menú de Android Studio.

Cómo actualizar Gradle

Si actualizas Android Studio, es posible que recibas una solicitud para actualizar también Gradle a la versión más reciente disponible. Puedes aceptar la actualización o especificar manualmente una versión, según los requisitos de compilación del proyecto.

En la siguiente tabla, se muestra qué versión de Gradle se requiere para cada versión del complemento de Android para Gradle. Si quieres obtener el mejor rendimiento, deberías usar la versión más reciente de Gradle y del complemento.

Versión del complementoVersión requerida de Gradle
1.0.0 - 1.1.32.2.1 - 2.3
1.2.0 - 1.3.12.2.1 - 2.9
1.5.02.2.1 - 2.13
2.0.0 - 2.1.22.10 - 2.13
2.1.3 - 2.2.32.14.1+
2.3.0+3.3+
3.0.0+4.1+
3.1.0+4.4+
3.2.0 - 3.2.14.6+
3.3.0 - 3.3.24.10.1+
3.4.0+5.1.1+

Puedes especificar la versión de Gradle en el menú File > Project Structure > Project de Android Studio o bien mediante la edición de la referencia de distribución de Gradle en el archivo gradle/wrapper/gradle-wrapper.properties. En el siguiente ejemplo, se especifica la versión de Gradle 5.1.1 en el archivo gradle-wrapper.properties.

    ...
    distributionUrl = https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
    ...
    

3.4.0 (abril de 2019)

Esta versión del complemento de Android requiere lo siguiente:

3.4.2 (julio de 2019)

Esta actualización menor es compatible con Android Studio 3.4.2 e incluye varias correcciones de errores y mejoras de rendimiento. Para ver una lista de las correcciones de errores más importantes, consulta la publicación relacionada en el blog de actualizaciones de versiones.

3.4.1 (mayo de 2019)

Esta actualización menor es compatible con Android Studio 3.4.1 e incluye varias correcciones de errores y mejoras de rendimiento. Para ver una lista de las correcciones de errores más importantes, consulta la publicación relacionada en el blog de actualizaciones de versiones.

Funciones nuevas

  • Nuevas configuraciones de dependencia de comprobación de lint: cambió el comportamiento de lintChecks y se introdujo una configuración de dependencia nueva, lintPublish, para brindar mayor control sobre qué comprobaciones de lint se empaquetan en las bibliotecas de Android.

    • lintChecks: Esta es una configuración existente que debes usar para las comprobaciones de lint que solo deseas ejecutar cuando compilas el proyecto de forma local. Si anteriormente usabas la configuración de dependencia lintChecks para incluir comprobaciones de lint en el archivo AAR publicado, debes migrar esas dependencias para usar la configuración de lintPublish nueva que se describe a continuación.
    • lintPublish: Usa esta configuración nueva en proyectos de biblioteca para las comprobaciones de lint que desees incluir en el archivo AAR publicado, como se muestra a continuación. Esto significa que los proyectos que consumen la biblioteca también aplican esas comprobaciones de lint.

    En el siguiente ejemplo de código, se usan ambas configuraciones de dependencia en un proyecto de biblioteca local de Android.

    dependencies {
          // Executes lint checks from the ':lint' project at build time.
          lintChecks project(':lint')
          // Packages lint checks from the ':lintpublish' in the published AAR.
          lintPublish project(':lintpublish')
        }
        
  • En general, debería mejorar la velocidad de compilación para las tareas de empaquetado y firma. Si observas una regresión de rendimiento relacionada con estas tareas, informa un error.

Cambios en el comportamiento

  • Advertencia de desuso del complemento de la función Apps instantáneas Android: Si todavía usas el complemento com.android.feature para compilar apps instantáneas, el complemento de Gradle para Android 3.4.0 te mostrará una advertencia de desuso. Para asegurarte de que podrás seguir compilando apps instantáneas en versiones futuras del complemento, migra tus apps con el complemento de funciones dinámicas, que también te permite publicar las experiencias de apps instantáneas e instaladas desde un único Android App Bundle.

  • R8 habilitado en la configuración predeterminada: R8 integra en un solo paso los procesos de eliminación de accesos directos, reducción, ofuscación, optimización y conversión a dex. Esto mejora notablemente el rendimiento de las compilaciones. R8 se incorporó en el complemento de Android para Gradle 3.3.0 y ahora está habilitado en la configuración predeterminada para proyectos de bibliotecas de apps y Android que usan el complemento 3.4.0 y versiones posteriores.

    En la siguiente imagen, se proporciona una descripción general del proceso de compilación antes de la incorporación de R8.

    Antes de R8, ProGuard era un paso de compilación independiente de la conversión a dex y la eliminación de accesos directos.

    Con R8, ahora los procesos de eliminación de accesos directos, reducción, ofuscación, optimización y conversión a dex (D8) se completan en un único paso, como se muestra a continuación.

    Con R8, la eliminación de accesos directos, la reducción, la ofuscación, la optimización y la conversión a dex se llevan a cabo en un único paso de compilación.

    Ten en cuenta que R8 está diseñado para trabajar con las reglas de ProGuard existentes, de modo que es probable que R8 funcione correctamente sin necesidad de que realices ninguna acción. Sin embargo, dado que se trata de una tecnología diferente a la de ProGuard, diseñada específicamente para proyectos de Android, es posible que durante la reducción y la optimización se quite código que ProGuard no quitaría. Por lo tanto, en esta situación poco probable, es posible que sea necesario agregar reglas adicionales para mantener ese código en la compilación de salida.

    Si tienes inconvenientes con el uso de R8, consulta las Preguntas frecuentes sobre compatibilidad de R8 para comprobar si hay una solución a tu problema. Si no la hay, informa un error. Para inhabilitar R8, agrega una de las siguientes líneas al archivo gradle.properties del proyecto:

    # Disables R8 for Android Library modules only.
        android.enableR8.libraries = false
        # Disables R8 for all modules.
        android.enableR8 = false
        
  • Se dio de baja ndkCompile: Si intentas usar ndkBuild para compilar las bibliotecas nativas, se mostrará un error de compilación. En su lugar, debes usar CMake o ndk-build para agregar código C y C++ a tu proyecto.

Errores conocidos

  • El uso correcto de nombres de paquetes únicos no se aplica actualmente, pero será más estricto en las versiones posteriores del complemento. En 3.4.0, puedes optar por comprobar si tu proyecto declara nombres de paquete aceptables. Para ello, agrega la siguiente línea al archivo gradle.properties.

    android.uniquePackageNames = true
        

    Para obtener más información sobre cómo configurar un nombre de paquete mediante el complemento de Android para Gradle, consulta Cómo establecer el ID de aplicación.

3.3.0 (enero de 2019)

Esta versión del complemento de Android requiere lo siguiente:

3.3.2 (marzo de 2019)

Esta actualización menor es compatible con Android Studio 3.3.2 e incluye varias correcciones de errores y mejoras de rendimiento. Para ver una lista de las correcciones de errores más importantes, consulta la publicación relacionada en el blog de actualizaciones de versiones.

3.3.1 (febrero de 2019)

Esta actualización menor es compatible con Android Studio 3.3.1 e incluye varias correcciones de errores y mejoras de rendimiento.

Funciones nuevas

  • Sincronización de ruta de clase mejorada: Cuando se resuelven dependencias en las rutas de clase de tiempo de compilación y ejecución, el complemento de Android para Gradle intenta corregir determinados conflictos de versiones descendentes para las dependencias que aparecen en varias rutas de clase.

    Por ejemplo, si la ruta de clase de tiempo de ejecución incluye una biblioteca A versión 2.0 y la de compilación incluye una biblioteca A versión 1.0, el complemento actualizará la dependencia automáticamente en la ruta de clase de compilación a la versión 2.0 de la biblioteca A para evitar errores.

    Sin embargo, si la ruta de clase incluye una biblioteca A versión 1.0 y la compilación incluye una A versión 2.0, el complemento no pasará la dependencia de la clase de ruta de compilación a la versión anterior (la biblioteca A versión 1.0), y se mostrará un error. Para obtener más información, consulta Cómo solucionar conflictos entre rutas de clase.

  • Compilación incremental de Java mejorada cuando se usan procesadores de anotaciones: Esta actualización disminuye el tiempo de compilación, ya que mejora el soporte de compilación de Java incremental cuando se usan procesadores de anotaciones.

    • Para proyectos que usan Kapt (la mayoría de los proyectos específicos de Kotlin e híbridos de Kotlin y Java): Está habilitada la compilación de Java incremental, incluso cuando se usa la vinculación de datos o el complemento retro-lambda. El procesamiento de anotaciones de la tarea Kapt aún no es incremental.
    • Para proyectos que no usan Kapt (solo Java): Si todos los procesadores de anotaciones que usas admiten el procesamiento de anotaciones incremental, la compilación incremental de Java estará habilitada de forma predeterminada. Para supervisar la adopción incremental del procesador de anotaciones, consulta el error 5277 de Gradle.

      Sin embargo, si uno o más procesadores de anotaciones no admiten compilaciones incrementales, la compilación incremental de Java no estará habilitada. En su lugar, puedes incluir la siguiente marca en el archivo gradle.properties:

      android.enableSeparateAnnotationProcessing=true
          

      Cuando incluyes esta marca, el complemento de Android para Gradle ejecuta los procesadores de anotaciones en una tarea separada y permite que se ejecuten de forma incremental las tareas de compilación de Java.

  • Información de depuración mejorada cuando se usa una API obsoleta: Si el complemento detecta que se está usando una API que ya no se admite, ahora puede proporcionar información más detallada para ayudarte a determinar si se está usando la API. Para ver la información adicional, debes incluir lo siguiente en el archivo gradle.properties del proyecto:

    android.debug.obsoleteApi=true
        

    También puedes habilitar la marca pasando -Pandroid.debug.obsoleteApi=true desde la línea de comandos.

  • Puedes ejecutar pruebas de instrumentación en módulos de funciones dinámicas desde la línea de comandos.

Cambios en el comportamiento

  • Configuración de tareas diferidas: El complemento ahora usa la API de creación de tareas nuevas de Gradle para evitar la inicialización y configuración de tareas que no son necesarias para completar la compilación actual (o que no están en el gráfico de tareas de ejecución). Por ejemplo, si tienes muchas variantes de compilación, como "actualización" y "depuración", y estás compilando la versión de "depuración" de tu app, el complemento evita la inicialización y la configuración de tareas de la versión de "actualización".

    Si se llama a determinados métodos anteriores en la API de variantes, como variant.getJavaCompile(), es posible que aún se fuerce la configuración de tareas. A fin de asegurarte de que esté optimizada la compilación para la configuración de tareas diferidas, invoca métodos nuevos que, en su lugar, muestren un objeto TaskProvider, como variant.getJavaCompileProvider().

    Si ejecutas tareas de compilación personalizadas, obtén información sobre cómo adaptarte a la API de creación de tareas nuevas de Gradle.

  • Para un tipo de compilación determinado, cuando se configura useProguard false, el complemento usa R8 en lugar de ProGuard para reducir y ocultar el código y los recursos de la app. Si deseas obtener más información sobre R8, consulta esta publicación del blog para desarrolladores de Android.

  • Generación de clase R más rápida para proyectos de biblioteca: Anteriormente, el complemento de Android para Gradle generaba un archivo R.java en cada una de las dependencias del proyecto y, luego, compilaba esas clases R junto con el resto de las clases de tu app. El complemento ahora genera un JAR que contiene directamente la clase R compilada de la app, sin compilar primero las clases R.java intermedias. Esta optimización puede optimizar la velocidad de indexación en Android Studio y mejorar de manera considerable el rendimiento de la compilación para proyectos que incluyen muchos subproyectos y dependencias de biblioteca.

  • Cuando se compila Android App Bundle, los APK generados desde ese paquete de apps orientados a Android 6.0 (nivel de API 23) o a una versión posterior, ahora incluyen de forma predeterminada versiones sin comprimir de las bibliotecas nativas. Esta optimización evita la necesidad de que el dispositivo haga una copia de la biblioteca y, por lo tanto, reduce el tamaño de la app en el disco. Si prefieres inhabilitar esta optimización, agrega lo siguiente al archivo gradle.properties:

    android.bundle.enableUncompressedNativeLibs = false
        
  • El complemento aplica las versiones mínimas de algunos complementos de terceros.

  • Sincronización de proyectos de una sola variante: Sincronizar el proyecto con tu configuración de compilación es un paso importante para permitir que Android Studio comprenda cómo se estructura el proyecto. Sin embargo, en el caso de proyectos grandes, el proceso puede consumir mucho tiempo. Si tu proyecto usa múltiples variantes de compilación, ahora puedes optimizar las sincronizaciones del proyecto limitándolas solo a la variante que hayas seleccionado.

    Debes usar Android Studio 3.3 o una versión posterior con el complemento de Android para Gradle 3.3.0 o una versión posterior a fin de habilitar esta optimización. Si se cumplen estos requisitos, el IDE te solicitará que habilites esta optimización cuando sincronices el proyecto. La optimización también estará habilitada de forma predeterminada en proyectos nuevos.

    Para habilitar esta optimización manualmente, haz clic en File > Settings > Experimental> Gradle (Android Studio > Preferences > Experimental > Gradle en Mac) y selecciona la casilla de verificación Only sync the active variant.

    Nota: Esta optimización es completamente compatible con proyectos que incluyen Java y lenguajes C++, y ofrece compatibilidad limitada con Kotlin. Cuando se habilita la optimización para proyectos con contenido de Kotlin, la sincronización de Gradle vuelve a usar variantes completas de forma interna.

  • Descarga automática de paquetes de SDK faltantes: Se expandió esta funcionalidad para brindar compatibilidad con el NDK. Si necesitas obtener más información, consulta Cómo descargar automáticamente los paquetes que faltan con Gradle.

Correcciones de errores

  • El complemento de Android para Gradle 3.3.0 corrige los siguientes errores:

    • El proceso de compilación llama a android.support.v8.renderscript.RenderScript en a la versión de AndroidX, a pesar de que está habilitado Jetifier.
    • Conflictos que se producen cuando androidx-rs.jar incluye annotation. con paquetes estáticos.AnyRes
    • Cuando se usa RenderScript, ya no es necesario configurar manualmente la versión de las herramientas de compilación en archivos build.gradle.

3.2.0 (septiembre de 2018)

Esta versión del complemento de Android requiere lo siguiente:

3.2.1 (octubre de 2018)

Con esta actualización, ya no es necesario especificar la versión de las herramientas de compilación de SDK. El complemento de Android para Gradle ahora usa la versión 28.0.3 de forma predeterminada.

Funciones nuevas

  • Compatibilidad con compilación de Android App Bundle: El paquete de app es un formato de carga nuevo que incluye todos los recursos y códigos compilados de la app, a la vez que se aplaza la generación de APK y el proceso de firma en Google Play Store. Ya no es necesario compilar, firmar y administrar varios APK, y los usuarios obtienen descargas de menor tamaño optimizadas para su dispositivo. Si quieres obtener más información, consulta Android App Bundles.

  • Compatibilidad con velocidades de compilación incremental mejoradas cuando se usan los procesadores de anotaciones: El DSL de AnnotationProcessorOptions ahora amplía CommandLineArgumentProvider, que te permite a ti o al autor del procesador de anotaciones tomar anotaciones de los argumentos del procesador mediante anotaciones de tipo de propiedad de compilación incremental. El uso de estas anotaciones mejora la corrección y el rendimiento de las compilaciones limpias incrementales y en caché. Para obtener más información, consulta Cómo transmitir argumentos a procesadores de anotaciones.

  • Herramienta de migración para AndroidX: Cuando se usa el complemento de Android para Gradle 3.2.0 con Android 3.2 y versiones posteriores, se pueden migrar las dependencias de Maven y las dependencias locales del proyecto para usar las nuevas bibliotecas de AndroidX. Para ello, selecciona Refactor > Migrate to AndroidX en la barra de menú. El uso de esta herramienta de migración también configura las siguientes marcas como true en el archivo gradle.properties:

    • android.useAndroidX: Cuando se configura en true, el complemento de Android usa la biblioteca de AndroidX adecuada en lugar de una biblioteca de compatibilidad. Si no se especifica esta marca, el complemento la configura como false de forma predeterminada.
    • android.enableJetifier: Cuando se configura en true, el complemento de Android migra automáticamente las bibliotecas existentes de terceros para usar AndroidX sobrescribiendo los objetos binarios. Si no se especifica esta marca, el complemento la configura en false de forma predeterminada. Puedes configurar esta marca en true solo si android.useAndroidX también está configurado en true; de lo contrario, se mostrará un error de compilación.

    Para obtener más información, consulta la descripción general de AndroidX.

  • Reductor de código nuevo, R8: R8 es una herramienta nueva para reducir y ofuscar código que reemplaza a ProGuard. Puedes comenzar a usar la versión preliminar de R8 si incluyes lo siguiente en el archivo gradle.properties del proyecto:

    android.enableR8 = true
        

Cambios en el comportamiento

  • La eliminación de accesos directos con D8 ahora está habilitada de forma predeterminada.
  • AAPT2 ahora está en el repositorio Maven de Google. Para usar AAPT2, asegúrate de tener la dependencia google() en el archivo build.gradle, como se muestra a continuación:

    buildscript {
              repositories {
                  google() // here
                  jcenter()
              }
              dependencies {
                  classpath 'com.android.tools.build:gradle:3.2.0'
              }
          }
          allprojects {
              repositories {
                  google() // and here
                  jcenter()
          }
        
  • El multidex nativo ahora está habilitado de forma predeterminada. Las versiones anteriores de Android Studio habilitaban multidex nativo cuando se implementaba la versión de depuración de una app en un dispositivo con la API de Android nivel 21 o una versión posterior. Ya sea si haces una implementación en un dispositivo o compilas un APK para actualización, el complemento de Android para Gradle habilita multidex nativo en todos los módulos con minSdkVersion=21 o una versión posterior.

  • El complemento ahora aplica una versión mínima del complemento protobuf (0.8.6), Kotlin (1.2.50) y Crashlytics (1.25.4).

  • El complemento com.android.feature ahora aplica el uso de solo letras, dígitos y guiones bajos cuando se especifica un nombre de módulo. Por ejemplo, si el nombre del módulo incluye guiones, se mostrará un error. Este comportamiento coincide con el del complemento del módulo de funciones dinámicas.

Correcciones de errores

  • Ahora se puede almacenar JavaCompile en la memoria caché en proyectos con vinculación de datos (Problema #69243050)
  • Elusión de compilación mejorada para módulos de biblioteca con vinculación de datos (Problema #77539932)
  • Ahora puedes volver a habilitar la configuración on demand si la inhabilitaste en versiones anteriores debido a errores de compilación impredecibles (Problema #77910727)

3.1.0 (marzo de 2018)

Esta versión del complemento de Android requiere lo siguiente:

  • Gradle 4.4 o una versión posterior. Para obtener más información, consulta la sección sobre cómo actualizar Gradle.
  • Herramientas de compilación 27.0.3 o una versión posterior. Ten en cuenta que ya no es necesario especificar una versión para las herramientas de compilación mediante la propiedad android.buildToolsVersion. El complemento usa la versión mínima requerida de forma predeterminada.

Compilador de DEX nuevo, D8

De forma predeterminada, Android Studio ahora usa un compilador de DEX nuevo denominado D8. La compilación de DEX es el proceso de transformar el código de byte .class en .dex para el tiempo de ejecución de Android (o Dalvik, para las versiones anteriores de Android). En comparación con el compilador anterior, denominado DX, D8 compila más rápido y genera archivos DEX más pequeños. Además, mantiene el mismo rendimiento de tiempo de ejecución de la app o lo mejora.

D8 no debería modificar el flujo de trabajo diario de desarrollo de apps. Sin embargo, si tienes problemas relacionados con el compilador nuevo, informa un error. Puedes inhabilitar D8 de forma temporal y usar DX. Para ello, incluye lo siguiente en el archivo gradle.properties del proyecto:

android.enableD8=false
    

Para los proyectos que usan funciones del lenguaje Java 8, la eliminación incremental de accesos directos estará habilitada de forma predeterminada. Para inhabilitarla, especifica lo siguiente en el archivo gradle.properties del proyecto:

android.enableIncrementalDesugaring=false.
    

Vista previa para usuarios: Si ya estás usando una versión preliminar de D8, ten en cuenta que ahora compila las bibliotecas incluidas en las herramientas de compilación del SDK, no en JDK. Por lo tanto, si accedes a API que existen en JDK pero no en las bibliotecas de compilación de SDK, se mostrará un error de compilación.

Cambios en el comportamiento

  • Cuando compilas varios APK y orientas cada uno de ellos a un ABI diferente, el complemento ya no genera APK para los siguientes ABI de manera predeterminada: mips, mips64 y armeabi.

    Para compilar un APK que se oriente a estos ABI, usa NDK r16b o una versión anterior y especifica los ABI en el archivo build.gradle, como se muestra a continuación:

        splits {
          abi {
              include 'armeabi', 'mips', 'mips64'
              ...
          }
        }
        

  • Cuando se compilan APK de configuración para una app instantánea Android, las divisiones de configuración de idioma ahora se agrupan por el idioma raíz de forma predeterminada. Por ejemplo, si la app incluye recursos para las configuraciones regionales zh-TW o zh-CN, Gradle empaquetará esos recursos en una división de configuración de idioma zh. Para anular este comportamiento, define tus propios grupos mediante la propiedad include, como se muestra a continuación:

    splits {
            language {
                enable true
                // Each string defines a group of locales that
                // Gradle should package together.
                include "in,id",
                        "iw,he",
                        "fil,tl,tgl",
                        "yue,zh,zh-TW,zh-CN"
            }
        }
        
  • La caché de compilación ahora desaloja las entradas de caché que tienen más de 30 días.

  • Al pasar "auto" a resConfig, ya no se seleccionan automáticamente los recursos para empaquetar en el APK. Si continúas usando "auto", el complemento empaqueta todos los recursos de string que proporcionan la app y sus dependencias. Por lo tanto, en su lugar, debes especificar cada configuración regional que quieras que el complemento empaquete en el APK.

  • Dado que los módulos locales no pueden depender del APK de prueba de la app, si se agregan dependencias a las pruebas instrumentadas mediante la configuración de androidTestApi, en lugar de androidTestImplementation, Gradle mostrará la siguiente advertencia:

      WARNING: Configuration 'androidTestApi' is obsolete
          and has been replaced with 'androidTestImplementation'
        

Correcciones

  • Se corrige el error por el que Android Studio no reconoce correctamente las dependencias en compilaciones compuestas.
  • Se corrige el error en el que se muestra un error de sincronización de proyecto cuando se carga el complemento de Android varias veces en una única compilación (por ejemplo, cuando varios subproyectos incluyen el complemento de Android en la ruta de la clase buildscript).

3.0.0 (octubre de 2017)

El complemento de Android para Gradle 3.0.0 incluye una variedad de cambios que están destinados a solucionar problemas de rendimiento de proyectos grandes.

Por ejemplo, en un proyecto preliminar de muestra con aproximadamente 130 módulos y una gran cantidad de dependencias externas (pero sin código ni recursos), puedes experimentar mejoras de rendimiento similares a las siguientes:

Versión del complemento de Android y Versión de Gradle Complemento de Android 2.2.0 y Gradle 2.14.1 Complemento de Android 2.3.0 y Gradle 3.3 Complemento de Android 3.0.0 y Gradle 4.1
Configuración (p. ej., ejecución de ./gradlew --help) Aprox. 2 min Aprox. 9 s Aprox. 2.5 s
Cambio en Java de 1 línea (cambio de implementación) Aprox. 2 min y 15 s Aprox. 29 s Aprox. 6.4 s

Algunos de estos cambios dividen las compilaciones existentes. Por lo tanto, debes considerar el esfuerzo de migrar el proyecto antes de usar el nuevo complemento.

Si no experimentas las mejoras de rendimiento que se describen anteriormente, informa un error e incluye un seguimiento de la compilación mediante Gradle Profiler.

Esta versión del complemento de Android requiere lo siguiente:

  • Gradle 4.1 o una versión posterior. Para obtener más información, consulta la sección sobre cómo actualizar Gradle.
  • Herramientas de compilación 26.0.2 o una versión posterior. Con esta actualización, ya no es necesario especificar una versión para las herramientas de compilación. El complemento usa la versión mínima requerida de forma predeterminada. Por lo tanto, ahora puedes quitar la propiedad android.buildToolsVersion.

3.0.1 (noviembre de 2017)

Esta es una actualización menor que brinda compatibilidad con Android Studio 3.0.1 e incluye correcciones de errores y mejoras de rendimiento.

Optimizaciones

  • Se mejoró el paralelismo en proyectos que tienen varios módulos mediante un gráfico de tareas refinado.
  • Cuando se realizan cambios en una dependencia, Gradle lleva a cabo compilaciones más rápidas, ya que vuelve a compilar módulos que no tienen acceso a la API de esa dependencia. Debes restringir qué dependencias filtran sus API a otros módulos. Para ello, usa las configuraciones de dependencia nuevas de Gradle: implementation, api, compileOnly y runtimeOnly.
  • La velocidad de compilación incremental es mayor debido a la conversión a dex por clase. Cada clase se compila en archivos DEX independientes y solo las clases que se modifican se vuelven a convertir a dex. También se mejoraron las velocidades de compilación para apps que configuran minSdkVersion en un valor 20 o inferior, y usan legacy multi-dex.
  • Velocidades de compilación mejoradas mediante la optimización de determinadas tareas para usar resultados en caché. Si quieres beneficiarte de esta optimización, primero debes habilitar la caché de compilación de Gradle.
  • Procesamiento incremental de recursos mejorado mediante el uso de AAPT2, que ahora está habilitado de forma predeterminada. Si tienes problemas al usar AAPT2, informa un error. También puedes inhabilitar esta herramienta configurando android.enableAapt2=false en el archivo gradle.properties y reiniciando el daemon de Gradle mediante la ejecución de ./gradlew --stop desde la línea de comandos.

Funciones nuevas

  • Administración de dependencias con detección de variantes. Cuando se compila la variante de un módulo, el complemento hace coincidir automáticamente las variantes de dependencias de módulos de biblioteca locales con la del módulo que estás compilando.
  • Se incluye un complemento de módulo de función nuevo compatible con Apps instantáneas Android y su SDK (que puedes descargar mediante SDK Manager). Para obtener más información sobre cómo crear módulos de función con el complemento nuevo, consulta Estructura de una app instantánea con varias funciones.
  • Compatibilidad integrada para uso de determinadas funciones de lenguaje y bibliotecas Java 8. Se dio de baja Jack y ya no se usa. Primero, debes inhabilitar Jack para usar la compatibilidad con Java 8 integrada y mejorada en la cadena de herramientas predeterminada. Para obtener más información, consulta Cómo usar funciones del lenguaje Java 8.
  • Se agregó compatibilidad para ejecutar pruebas con Android Test Orchestrator, que permite ejecutar cada una de las pruebas de la app dentro de la invocación de Instrumentation. Dado que cada prueba se ejecuta en su propia instancia de Instrumentation, no se acumula cualquier estado compartido entre las pruebas en la CPU o en la memoria del dispositivo. Incluso si falla una de las pruebas, se elimina solo su propia instancia de Instrumentation, de modo que aún se siguen ejecutando el resto de las pruebas.
    • Se agregó testOptions.execution para determinar si se usará la organización de prueba en el dispositivo. Si deseas usar Android Test Orchestrator, debes especificar ANDROID_TEST_ORCHESTRATOR, como se muestra a continuación. De forma predeterminada, esta propiedad se configura en HOST, que inhabilita la organización en el dispositivo y es el método estándar para ejecutar pruebas.
    android {
      testOptions {
        execution 'ANDROID_TEST_ORCHESTRATOR'
      }
    }
    
* La nueva configuración de dependencia `androidTestUtil` permite instalar otro APK de asistencia de prueba antes de ejecutar las pruebas de instrumentación, como Android Test Orchestrator:
    dependencies {
      androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
      ...
    }
    
* Se agregó `testOptions.unitTests.includeAndroidResources` para brindar compatibilidad con pruebas de unidades admitidas que requieren recursos de Android, como [Roboelectric](http://robolectric.org/). Cuando se configura esta propiedad en `true`, el complemento lleva a cabo la combinación de recursos, elementos y manifiestos antes de ejecutar las pruebas de la unidad. Luego, las pruebas pueden inspeccionar `com/android/tools/test_config.properties` en la ruta de clase para las siguientes claves: *`android_merged_assets`: la ruta absoluta al directorio de elementos combinados.

Nota: Para los módulos de biblioteca, los elementos combinados no contienen los elementos de las dependencias (consulta el [Problema #65550419](https://issuetracker.google.com/65550419)).

* `android_merged_manifest`: Es la ruta absoluta del archivo de manifiesto combinado. * `android_merged_resources`: Es la ruta absoluta al directorio de recursos combinados, que contiene todos los recursos del módulo y todas sus dependencias. * `android_custom_package`: Es el nombre del paquete de la clase R final. Si se modifica de forma dinámica el ID de aplicación, es posible que el nombre de este paquete no coincida con el atributo `package` del manifiesto de la app. * Compatibilidad con [fuentes como recursos] (/guide/topics/ui/look-and-feel/fonts-in-xml.html) (una función nueva que se presenta en [Android 8.0 (nivel de API 26)](/about/versions/oreo/index.html)). * Compatibilidad con APK específicos de lenguaje con [SDK de Apps instantáneas Android 1.1](/topic/instant-apps/release-notes.html#android_instant_apps_development_sdk_v110) y versiones posteriores. Para obtener más información, consulta [Cómo configurar la compilación para pantalla dividida] (/topic/instant-apps/guides/config-splits.html). * Ahora es posible cambiar el directorio de salida del proyecto de compilación nativo externo, como se muestra a continuación:
    android {
        ...
        externalNativeBuild {
            // For ndk-build, instead use the ndkBuild block.
            cmake {
                ...
                // Specifies a relative path for outputs from external native
                // builds. You can specify any path that's not a subdirectory
                // of your project's temporary build/ directory.
                buildStagingDirectory "./outputs/cmake"
            }
        }
    }
    
* Ahora puedes [usar CMake 3.7 o una versión posterior](/studio/projects/add-native-code.html#vanilla_cmake) cuando compiles proyectos nativos desde Android Studio. * La nueva configuración de dependencia `lintChecks` permite compilar un JAR que define reglas de lint personalizadas, y empaquetarlo en tus proyectos AAR y APK. Las reglas de lint personalizadas deben pertenecer a un proyecto separado que genere un único JAR e incluya solo dependencias [`compileOnly`](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_plugin_and_dependency_management). Luego, otros módulos de app y biblioteca pueden depender del proyecto de lint mediante la configuración `lintChecks`:
    dependencies {
        // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
        // and package it with your module. If the module is an Android library,
        // other projects that depend on it automatically use the lint checks.
        // If the module is an app, lint includes these rules when analyzing the app.
        lintChecks project(':lint-checks')
    }
    

Cambios en el comportamiento

  • El complemento de Android 3.0.0 quita determinadas API y, si se usan, se daña la compilación. Por ejemplo, ya no es posible usar la API de variantes para acceder a objetos outputFile() ni usar processManifest.manifestOutputFile() para obtener el archivo de manifiesto de cada variante. Si necesitas obtener más información, consulta Cambios en la API.
  • Ya no es necesario especificar una versión para las herramientas de compilación (por lo tanto, ahora se puede quitar la propiedad android.buildToolsVersion). De forma predeterminada, el complemento usa automáticamente la versión mínima requerida de las herramientas de compilación correspondiente a la versión del complemento de Android que estás usando.
  • Ahora se habilita la compresión de PNG en el bloque buildTypes, como se muestra a continuación. La compresión de PNG ahora está habilitada de forma predeterminada para todas las compilaciones, excepto para las de depuración, ya que aumenta el tiempo de compilación en proyectos que incluyen muchos archivos PNG. Por lo tanto, para mejorar los tiempos de compilación en otros tipos de compilaciones, debes inhabilitar la compresión de PNG o convertir las imágenes a WebP.
    android {
      buildTypes {
        release {
          // Disables PNG crunching for the release build type.
          crunchPngs false
        }
      }
    }
    
* El complemento de Android ahora compila automáticamente los objetivos ejecutables que se configuran en los proyectos CMake externos. * Ahora debes agregar procesadores de anotaciones (/studio/build/dependencies#annotation_processor) a la ruta de clase del procesador mediante la configuración de dependencia `annotationProcessor`. * El uso del elemento obsoleto `ndkCompile` ahora es más restringido. En su lugar, debes hacer la migración usando CMake o ndk-build para compilar el código nativo que deseas empaquetar en el APK. Para obtener más información, consulta Cómo migrar desde ndkcompile (/studio/projects/add-native-code.html#ndkCompile). ## 2.3.0 (febrero de 2017) {:#2-3-0}

2.3.3 (junio de 2017)

Esta es una actualización menor que agrega compatibilidad con Android Studio 2.3.3.

2.3.2 (mayo de 2017)

Esta es una actualización menor que agrega compatibilidad con Android Studio 2.3.2.

2.3.1 (abril de 2017)

Esta es una actualización menor del complemento de Android 2.3.0 que corrige un error en el que algunos dispositivos Android físicos no funcionaban correctamente con Instant Run (consulta el Problema #235879)).

Dependencias:
Novedades:
  • Usa Gradle 3.3, que incluye mejoras de rendimiento y funciones nuevas. Para obtener más información, consulta las notas de la versión de Gradle.
  • Caché de compilación: Almacena ciertos resultados que genera el complemento de Android cuando se compila el proyecto (como AAR sin empaquetar y dependencias remotas previamente convertidas a archivos dex). Las compilaciones limpias son mucho más rápidas mientras se usa la caché, ya que el sistema puede reutilizar esos archivos almacenados en caché en compilaciones posteriores, en lugar de volver a crearlos. Los proyectos que usan el complemento de Android 2.3.0 y versiones posteriores usan la caché de compilación de forma predeterminada. Para obtener más información, consulta Cómo mejorar la velocidad de compilación con la caché de compilación.
Cambios:
## 2.2.0 (septiembre de 2016) {:#2-2-0}
Dependencias:
Novedades:
  • Usa Gradle 2.14.1, que incluye mejoras de rendimiento y funciones nuevas, y corrige una vulnerabilidad de seguridad que permite la elevación de privilegios cuando se usa el daemon de Gradle. Para obtener más información, consulta las notas de la versión de Gradle.
  • Con el DSL de externalNativeBuild {}, Gradle ahora permite vincular a fuentes nativas y compilar bibliotecas nativas mediante CMake o ndk-build. Después de compilar las bibliotecas nativas, Gradle las empaqueta en el APK. Para obtener más información sobre cómo usar CMake y ndk-build con Gradle, consulta Cómo agregar código C y C++ a tu proyecto.
  • Cuando ejecutas una compilación desde la línea de comandos, Gradle ahora intenta descargar automáticamente los componentes de SDK faltantes o las actualizaciones de las que depende el proyecto. Para obtener más información, consulta Cómo descargar automáticamente los paquetes que faltan con Gradle.
  • Una nueva función de almacenamiento en caché experimental permite a Gradle acelerar los tiempos de compilación mediante la conversión a dex, el almacenamiento y la reutilización de las versiones anteriores de las bibliotecas convertidas a Dex. Para obtener más información sobre cómo usar esta función experimental, consulta la guía Caché de compilación.
  • Mejora el rendimiento de compilación mediante la adopción de una canalización de empaquetado predeterminada nueva que controla la compresión, la firma y el uso de zipalign en una tarea. Puedes volver a usar las herramientas de empaquetado anteriores agregando android.useOldPackaging=true al archivo gradle.properties. Mientras se usa la nueva herramienta de empaquetado, no está disponible la tarea zipalignDebug. Sin embargo, puedes crear una llamando al método createZipAlignTask(String taskName, File inputFile, File outputFile).
  • La firma de APK ahora usa el esquema de firma de APK v2, además de la de JAR tradicional. Todas las plataformas Android aceptan los APK resultantes. Cualquier modificación a estos APK después de firmar invalida las firmas v2 y evita la instalación en un dispositivo. Para inhabilitar esta función, agrega lo siguiente al archivo build.gradle a nivel de módulo:
        android {
          ...
          signingConfigs {
            config {
              ...
              v2SigningEnabled false
            }
          }
        }
        
  • Para compilaciones multidex, ahora puedes usar las reglas de ProGuard para determinar qué clases de Gradle debes compilar en el archivo DEX principal de la app. Dado que el sistema de Android primero carga el archivo DEX principal cuando se inicia la app, puedes priorizar ciertas clases en el inicio mediante la compilación en ese archivo DEX. Después de crear un archivo de configuración especial para el archivo DEX principal, pasa la ruta del archivo de configuración a Gradle mediante buildTypes.multiDexKeepProguard. El uso de este DSL es diferente del uso de buildTypes.proguardFiles, que proporciona reglas generales de ProGuard para la app y no especifica las clases del archivo DEX principal.
  • Agrega compatibilidad con la marca android:extractNativeLibs, que puede reducir el tamaño de la app cuando la instalas en un dispositivo. Cuando configuras esta marca como false en el elemento <application> del manifiesto de la app, Gradle empaqueta las versiones sin comprimir y alineadas de las bibliotecas nativas del APK. Esto evita que PackageManager copie las bibliotecas nativas del APK en el sistema de archivos del dispositivo durante la instalación y permite realizar actualizaciones delta de la app más pequeña.
  • Ahora puedes especificar versionNameSuffix y applicationIdSuffix para tipos de productos. (Problema 59614)
Cambios:
  • getDefaultProguardFile ahora muestra los archivos ProGuard predeterminados que proporciona el complemento de Android para Gradle y ya no usa los del SDK de Android.
  • Rendimiento y funciones mejorados del compilador Jack:
    • Jack ahora es compatible con la cobertura de prueba JaCoCco cuando se configura testCoverageEnabled en true.
    • Compatibilidad mejorada para procesadores de anotaciones. Los procesadores de la ruta de clase, como cualquier dependencia de compile, se aplican automáticamente a la compilación. También puedes especificar un procesador de anotaciones en la compilación y pasar los argumentos mediante el DSL de javaCompileOptions.annotationProcessorOptions {} del archivo build.gradle a nivel de módulo:
          android {
            ...
            defaultConfig {
              ...
              javaCompileOptions {
                annotationProcessorOptions {
                  className 'com.example.MyProcessor'
                  // Arguments are optional.
                  arguments = [ foo : 'bar' ]
                }
              }
            }
          }
          

      Si deseas aplicar un procesador de anotaciones durante el tiempo de compilación, pero no quieres incluirlo en el APK, usa el alcance de la dependencia annotationProcessor:

          dependencies {
              compile 'com.google.dagger:dagger:2.0'
              annotationProcessor 'com.google.dagger:dagger-compiler:2.0'
             // or use buildVariantAnnotationProcessor to target a specific build variant
          }
          
    • Puedes configurar marcas adicionales para Jack mediante jackOptions.additionalParameters(). En el siguiente fragmento de código, se configura el parámetro jack.incremental en true:
          android {
            defaultConfig {
              ...
              jackOptions {
                enabled true
                additionalParameters("jack.incremental" : true)
              }
            }
          }
          

      Para obtener una lista de los parámetros que puedes configurar, ejecuta lo siguiente desde la línea de comandos:

          java -jar /build-tools/jack.jar --help-properties
          

    • De forma predeterminada, si el tamaño del montón del daemon de Gradle es de al menos 1.5 GB, Jack ahora se ejecutará en el mismo proceso que Gradle. Para ajustar el tamaño del montón del daemon, agrega lo siguiente al archivo gradle.properties:

          # This sets the daemon heap size to 1.5GB.
          org.gradle.jvmargs=-Xmx1536M
          

2.1.0 (abril de 2016)

2.1.3 (agosto de 2016)

Esta actualización requiere Gradle 2.14.1 o una versión posterior. Gradle 2.14.1 incluye mejoras de rendimiento, funciones nuevas y una corrección de seguridad importante. Para obtener más información, consulta las notas de la versión de Gradle.

Dependencias:
Novedades:
  • Se agregó compatibilidad con la versión preliminar de N para desarrolladores, JDK 8 y lenguaje Java 8 mediante el conjunto de herramientas de Jack. Para obtener más información, consulta la Guía de versiones preliminares de N.

    Nota: Por el momento, Instant Run no funciona con Jack y se inhabilitará durante el uso del nuevo conjunto de herramientas. Solo debes usar Jack si estás desarrollando para contenido para las versiones preliminares de N y quieres usar las funciones del lenguaje Java 8 compatibles.

  • Se agregó compatibilidad predeterminada para la compilación incremental de Java con el fin de reducir el tiempo de compilación durante el desarrollo. Para ello, se vuelven a compilar partes de la fuente que cambiaron o que es necesario volver a compilar. Para inhabilitar esta función, agrega el siguiente código al archivo build.gradle a nivel de módulo:
        android {
          ...
          compileOptions {
            incremental false
          }
        }
        
  • Se agregó compatibilidad con el proceso de conversión a Dex, que lleva a cabo la conversión a dex durante la compilación, en lugar de en procesos de VM externos separados. Esto no solo acelera las compilaciones incrementales, sino también las compilaciones completas. Esta función está habilitada de forma predeterminada para proyectos que tienen configurado el tamaño de montón máximo del daemon de Gradle en al menos 2,048 MB. Para ello, incluye lo siguiente en el archivo gradle.properties del proyecto:

        org.gradle.jvmargs = -Xmx2048m
        

    Si se definió un valor para javaMaxHeapSize en el archivo build.gradle a nivel de módulo, es necesario configurar org.gradle.jvmargs en el valor javaMaxHeapSize + 1,024 MB. Por ejemplo, si configuraste javaMaxHeapSize en "2048m", deberás agregar lo siguiente al archivo gradle.properties del proyecto:

        org.gradle.jvmargs = -Xmx3072m
        

    Para inhabilitar la conversión a Dex en proceso, agrega el siguiente código al archivo build.gradle a nivel de módulo:

        android {
          ...
          dexOptions {
              dexInProcess false
          }
        }
        

2.0.0 (abril de 2016)

Dependencias:
Novedades:
  • Habilita Instant Run al admitir la inyección de códigos de bytes y al enviar actualizaciones de código y recursos a una app en ejecución en el emulador o en un dispositivo físico.
  • Se agregó compatibilidad con compilaciones incrementales, incluso si no se está ejecutando la app. Se mejoraron los tiempos de compilación completa mediante la aplicación de cambios incrementales en el dispositivo conectado a través de Android Debug Bridge.
  • Se agregó maxProcessCount para controlar cuántos procesos de dex subordinados se pueden generar al mismo tiempo. En el siguiente código, en el archivo build.gradle a nivel de módulo, se configura el número máximo de procesos simultáneos en 4:
        android {
          ...
          dexOptions {
            maxProcessCount = 4 // this is the default value
          }
        }
        
  • Se agregó un reductor de código experimental para compatibilidad con conversión a Dex y para reducir la conversión a Dex de las dependencias, que no se admiten con Proguard. Esto mejora la velocidad de compilación de la variante de compilación de la depuración. Debido a que el reductor experimental no admite la optimización y la ofuscación, debes habilitar las compilaciones de versiones. A fin de habilitar el reductor experimental para las compilaciones de depuración, agrega lo siguiente al archivo build.gradle a nivel de módulo:
        android {
          ...
          buildTypes {
            debug {
              minifyEnabled true
              useProguard false
            }
            release {
              minifyEnabled true
              useProguard true // this is a default setting
            }
          }
        }
        
  • Se agregó compatibilidad de registro y rendimiento mejorado para el reductor de recursos, que ahora registra todas las operaciones en un archivo resources.txt ubicado en la misma carpeta que los archivos de registro de Proguard.
Comportamiento modificado:
  • Cuando se configura minSdkVersion en 18 o en un valor superior, la firma del APK usa SHA256.
  • Las claves de DSA y ECDSA ahora pueden firmar paquetes APK.

    Nota: El proveedor de almacén de claves de Android ya no admite claves de DSA en Android 6.0 (nivel de API 23) o una versión posterior.

Errores corregidos:
  • Se corrigió un error que generaba dependencias de AAR duplicadas en las configuraciones de compilación principal y de prueba.

Versiones anteriores