Cómo mejorar la velocidad de compilación de sus proyectos de Android

Recientemente, emprendí la tarea de migrar el código base de Android en Kure a AndroidX. Parecía la oportunidad perfecta para intentar arreglar las velocidades de construcción del proyecto.

Gradle siempre ha tenido una mala reputación por ser lento y consumir muchos recursos, pero me sorprendió bastante cómo los cambios menores en la configuración de compilación del proyecto podían mejorar enormemente las velocidades de compilación.

Para darle un adelanto del tiempo que pude perder de nuestras compilaciones limpias, aquí hay una métrica de antes y después del análisis de compilación.

¿Bajar de 5,5 minutos a 17 segundos? Eso es una locura.

Es fácil exagerar con las optimizaciones que puede realizar para reducir aún más el tiempo de compilación. Pero me voy a centrar intencionalmente en las medidas menores e indoloras que tomé para acercarme a esta métrica con el fin de mantener esta publicación amigable para principiantes.

¡Pero primero!

Antes de comenzar con la optimización, es importante comparar nuestro proyecto para ver cuánto tiempo lleva construir actualmente. Gradle tiene una práctica opción de escaneo que puede usar para analizar el rendimiento de su tarea. Encienda la terminal en Android Studio y ejecute el siguiente comando:

./gradlew assembleDebug --scan

Una vez que la compilación se complete correctamente, se le solicitará que acepte los términos de servicio para cargar los resultados del análisis de compilación. Escriba para continuar. Una vez que haya terminado de publicar, obtendrá un enlace en el terminal para verificar su escaneo de compilación. Abre el enlace.

Hay bastantes opciones en el sitio, pero en aras de la brevedad, solo echaremos un vistazo a lo más importante.

El resumenLa vista muestra un resumen de las tareas que se ejecutaron y cuánto tardaron en completarse. Pero lo que nos interesa aquí es la sección Rendimiento . Le brinda un desglose más detallado del tiempo total de construcción como se muestra a continuación.

En la sección de rendimiento, hay una pestaña Configuración y sugerencias que le brinda sugerencias sobre cómo puede mejorar sus velocidades de compilación. Veamos eso.

Podemos encontrar algunas soluciones fáciles para nuestra velocidad de compilación en esta sección. Así que sigamos adelante y apliquemos estas sugerencias en nuestro proyecto.

Paso # 1: actualice sus herramientas

El equipo de Android está mejorando y evolucionando constantemente el sistema de compilación de Android. Por lo tanto, la mayoría de las veces puede recibir mejoras significativas simplemente adoptando la última versión de las herramientas.

En el momento de esta refactorización, nuestro proyecto estaba en la versión 3.2.1 del complemento de Gradle para Android Studio (que es algunas versiones anteriores a la última versión).

Puede visitar este enlace para obtener la versión de la última versión del complemento de Gradle.

En el momento de escribir esta publicación, la última versión es la 3.4.0.

Pero viene con un problema que debemos tener en cuenta para más adelante:

Al usar Gradle 5.0 y superior , necesitaremos aumentar explícitamente el tamaño del montón para asegurarnos de que nuestra velocidad de compilación no empeore. Volveremos a esto en un minuto.

Abra el archivo build.gradle de nivel superior que encontrará en la raíz de su proyecto y agregue la siguiente línea en la sección de dependencias:

classpath 'com.android.tools.build:gradle:3.4.0'

También necesitará actualizar la URL de distribución en el archivo de propiedades del contenedor de gradle ubicado en gradle / wrapper / gradle-wrapper.properties. Actualice la URL a la siguiente.

(Este enlace estará disponible en la página de lanzamiento del complemento de Gradle de Android).

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

Si está utilizando Kotlin en su proyecto, se encontrará con un error si la versión de su complemento Kotlin Gradle es inferior a 1.3.0 . Si ese es el caso, use el indicador del IDE para actualizar su complemento Kotlin Gradle a la última versión (que en el momento de escribir esta publicación resulta ser la versión 1.3.31 ).

Muy bien, ejecutemos la compilación nuevamente desde la terminal para ver si logramos alguna mejora.

Paso # 2: Actualice sus configuraciones

Así que pudimos perder alrededor de 2.5 minutos del tiempo de construcción, pero aún no es lo suficientemente bueno. Al investigar los registros de compilación en la terminal, encontré una línea que nos interesa:

La compilación incremental básicamente evita la compilación inútil de todo el conjunto de archivos fuente y, en cambio, compila solo los archivos que han cambiado. Al mirar los registros, está claro que no estamos aprovechando esta función. Nos sugiere que usemos android.enableSeparateAnnotationProcessing = true pero dado que estamos usando Kotlin en nuestros proyectos, no deberíamos usar la configuración 'annotationProcessor' de todos modos.

Afortunadamente, la versión 1.3.30 de Kotlin agregó soporte para el procesamiento de anotaciones incrementales.

Entonces vamos

  1. Cambie la configuración del procesador de anotaciones a kapt
  2. Habilitar la marca experimental de procesamiento de anotaciones incrementales

Abra el archivo build.gradle de nivel de módulo y agregue la siguiente línea en la parte superior del archivo:

apply plugin: 'kotlin-kapt'

A continuación, cambie todas las configuraciones de annotationProcessor en la sección de dependencias para usar kapt. He aquí un ejemplo:

//Before annotationProcessor 'com.google.dagger:dagger-compiler:2.9' //After kapt 'com.google.dagger:dagger-compiler:2.9'

Ahora abra su archivo gradle.properties ubicado en la raíz de su proyecto y agregue la siguiente línea:

kapt.incremental.apt=true

Ejecutemos la compilación de nuevo. ??????

Muy bien, parece que estamos llegando.

Paso # 3: Propiedades de Gradle

Estamos en la última etapa ahora. ¿Recuerdas el problema con el que nos encontramos al actualizar nuestra versión del complemento de Gradle? Resulta que las versiones más nuevas de Gradle reducen el tamaño del montón a 512 MB. Esto es para asegurarse de que las máquinas de gama baja no se ahoguen. Estoy en una máquina de 16 gigas, por lo que puedo permitirme dar entre 2 y 3 gigas al demonio Gradle, pero tu rendimiento puede variar.

Open the gradle.properties file located at the root of your project and add the following line. Remember to select the size according to your requirements and machine specification.

org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

While we’re at it, let’s also enable parallel builds and configure on demand in the properties.

Here’s what my final gradle.properties file looks like:

org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.configureondemand=true kapt.incremental.apt=true
  • org.gradle.parallel - This flag allows Gradle to build modules within a project in parallel instead of sequentially. This is only beneficial in a multi-module project.
  • org.gradle.configureondemand - This flag configures only the modules needed by the project, instead of building all of them.

With these, let’s see where we are on our build speed metric:

And there we go. ???

Closing remarks

This is by no means an extensive coverage of all the ways one can optimize the build speed of their project. There are tons of other things which I did not go over in this post like using minSdk 21 when using MultiDex, pre-dexing your libraries, disabling PNG crunching, and so on — to name a few.

But most of these configurations require a deeper understanding of Android’s build system and experience working on large multi-module projects (which is where the benefits are most apparent). The steps I mentioned above are easy to incorporate in a project even by junior devs and have considerable payoffs. I hope this helps you trim down your build speeds!

Alright until next time, peace! ✌?