Complemento de Android para Gradle 3.6.0 (febrero de 2020)

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

Funciones nuevas

Esta versión del complemento de Android para Gradle incluye las siguientes funciones nuevas:

Vinculación de vistas

La vinculación de vistas proporciona seguridad en el tiempo de compilación cuando se hace referencia a vistas en el código. Ahora puedes reemplazar findViewById() con la referencia de clase de vinculación generada automáticamente. A fin de comenzar a usar la vinculación de vistas, incluye lo siguiente en el archivo build.gradle de cada módulo:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

Para obtener más información, consulta la documentación sobre la vinculación de vistas.

Compatibilidad con el complemento de Maven Publish

El complemento de Android para Gradle incluye compatibilidad con el complemento de Maven Publish para Gradle, que te permite publicar artefactos de compilación en un repositorio de Maven de Apache. El complemento de Android para Gradle crea un componente para cada artefacto de variante de compilación en tu app o módulo de biblioteca que puedes usar a los efectos de personalizar una publicación en un repositorio de Maven.

Si quieres obtener más información, consulta la página que indica cómo usar el complemento de Maven Publish.

Nueva herramienta de empaquetado predeterminada

Cuando compilas la versión de depuración de tu app, el complemento usa una herramienta de empaquetado nueva, llamada zipflinger, a fin de compilar tu APK. Esa nueva herramienta debería proporcionar mejoras en la velocidad de compilación. Si no funciona como esperabas, informa un error. Para volver a usar la herramienta de empaquetado anterior, incluye lo siguiente en tu archivo gradle.properties:

        android.useNewApkCreator=false
      

Atribución de compilación nativa

Ahora puedes determinar el tiempo que tarda Clang en compilar y vincular cada archivo C/C++ de tu proyecto. Gradle puede generar un registro de Chrome que contenga marcas de tiempo para esos eventos del compilador a fin ayudarte a entender mejor el tiempo que lleva compilar el proyecto. Para generar ese archivo de atribución de compilación, haz lo siguiente:

  1. Agrega la marca -Pandroid.enableProfileJson=true cuando ejecutes una compilación de Gradle. Por ejemplo:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Abre el navegador Chrome y escribe chrome://tracing en la barra de búsqueda.

  3. Haz clic en el botón Load y navega hasta <var>project-root</var>/build/android-profile para encontrar el archivo. El nombre del archivo es profile-<var>timestamp</var>.json.gz.

Puedes ver los datos de la atribución de compilación nativa cerca de la parte superior del visor:

Registro de atribución de compilación nativa en Chrome

Cambios en el comportamiento

Si usas esta versión del complemento, es posible que ocurran los siguientes cambios de comportamiento.

Bibliotecas nativas empaquetadas sin comprimir de forma predeterminada

Cuando compilas la app, el complemento ahora establece extractNativeLibs en "false" de forma predeterminada. Es decir, tus bibliotecas nativas están alineadas con la página y empaquetadas sin comprimir. Si bien esto genera un tamaño de carga más grande, los usuarios se benefician de lo siguiente:

  • Un tamaño de instalación de app más pequeño, ya que la plataforma puede acceder a las bibliotecas nativas directamente desde el APK instalado, sin crear una copia de las bibliotecas
  • Un tamaño de descarga menor, ya que la compresión de Play Store suele ser mejor cuando incluyes bibliotecas nativas sin comprimir en tu APK o Android App Bundle

Si quieres que el complemento de Android para Gradle empaquete bibliotecas nativas comprimidas, incluye lo siguiente en el manifiesto de tu app:

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

Nota: El atributo de manifiesto extractNativeLibs se reemplazó por la opción DSL de useLegacyPackaging. A fin de obtener más información, consulta la nota de la versión Cómo usar el DSL para empaquetar bibliotecas nativas comprimidas.

Versión predeterminada del NDK

Si descargas varias versiones del NDK, el complemento de Android para Gradle ahora selecciona una versión predeterminada que usará en la compilación de tus archivos de código fuente. Anteriormente, el complemento seleccionaba la última versión descargada del NDK. Usa la propiedad android.ndkVersion en el archivo build.gradle del módulo para anular el valor predeterminado que seleccionó el complemento.

Generación simplificada de la clase R

El complemento de Android para Gradle simplifica la ruta de clase de compilación, ya que genera solo una clase R para cada módulo de biblioteca en tu proyecto y comparte esas clases R con otras dependencias del módulo. Esa optimización debería generar compilaciones más rápidas, pero es necesario que tengas en cuenta lo siguiente:

  • Como el compilador comparte clases R con dependencias upstream de módulos, es importante que cada módulo de tu proyecto utilice un nombre de paquete único.
  • La configuración que se utilice para incluir la biblioteca como una dependencia determinará en qué medida las otras dependencias del proyecto podrán ver su clase R. Por ejemplo, si la Biblioteca A incluye a la Biblioteca B como una dependencia "api", la Biblioteca A y otras que dependan de ella tendrán acceso a la clase R de la Biblioteca B. Sin embargo, es posible que otras bibliotecas no tengan acceso a la clase R de la Biblioteca B si la Biblioteca A usa la configuración de dependencia implementation. Para obtener más información, consulta las opciones de configuración de dependencias.

Eliminación de los recursos que faltan de la configuración predeterminada

En el caso de los módulos de biblioteca, si incluyes un recurso para un idioma que no agregaste al conjunto predeterminado de recursos (por ejemplo, si incluyes hello_world como un recurso de strings en /values-es/strings.xml, pero no lo defines en /values/strings.xml), el complemento de Android para Gradle dejará de incluir ese recurso cuando compile tu proyecto. Este cambio en el comportamiento debería dar como resultado menos excepciones Resource Not Found en tiempo de ejecución y una mejor velocidad de compilación.

D8 ahora respeta la política de retención de CLASS para las anotaciones

Cuando compilas tu app, D8 ahora respeta cuando las anotaciones aplican una política de retención de CLASS, y esas anotaciones ya no están disponibles durante el tiempo de ejecución. Este comportamiento también ocurre cuando se configura el SDK de destino de la app en el nivel de API 23, que antes permitía el acceso a esas anotaciones durante el tiempo de ejecución al momento de compilar la app con versiones más antiguas del complemento de Android para Gradle y D8.

Otros cambios en el comportamiento

  • aaptOptions.noCompress ya no distingue entre mayúsculas y minúsculas en todas las plataformas (tanto para APK como para paquetes), y respeta las rutas de acceso que utilizan caracteres en mayúsculas.
  • La vinculación de datos ahora es incremental de forma predeterminada. Si deseas obtener más información, consulta el error #110061530.

  • Todas las pruebas de unidades, incluidas las de Robolectric, ahora se pueden almacenar por completo en caché. Si deseas obtener más información, consulta el error #115873047.

Correcciones de errores

Esta versión del complemento de Android para Gradle incluye las siguientes correcciones de errores:

  • Las pruebas de unidades de Robolectric ahora son compatibles con los módulos de bibliotecas que usan la vinculación de datos. Si deseas obtener más información, consulta el error #126775542.
  • Ahora puedes ejecutar tareas de connectedAndroidTest en varios módulos mientras el modo de ejecución paralela de Gradle está habilitado.

Errores conocidos

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

Rendimiento lento de la tarea de Android Lint

Android Lint puede tardar mucho más en completarse en algunos proyectos debido a una regresión en su infraestructura de análisis, lo que genera un cálculo más lento de tipos inferidos para lambdas en ciertas construcciones de código.

El problema se informa como un error en IDEA y se corregirá en el complemento de Android para Gradle 4.0.

Falta la clase de manifiesto {:#agp-missing-manifest}

Si tu app define permisos personalizados en su manifiesto, el complemento de Android para Gradle suele generar una clase Manifest.java que incluye tus permisos personalizados como constantes de string. El complemento empaqueta esa clase con tu app de modo que puedas hacer referencia más fácilmente a esos permisos durante el tiempo de ejecución.

La generación de la clase del manifiesto no funciona en el complemento de Android para Gradle 3.6.0. Si creas tu app con esa versión del complemento y hace referencia a la clase de manifiesto, es posible que veas una excepción ClassNotFoundException. Para solucionar este problema, realiza una de las siguientes acciones:

  • Haz referencia a tus permisos personalizados por su nombre completamente calificado. Por ejemplo, "com.example.myapp.permission.DEADLY_ACTIVITY".

  • Define tus propias constantes, como se muestra a continuación:

                public final class CustomPermissions {
                  public static final class permission {
                    public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
                  }
                }