Reduce el tiempo de construcci贸n de tus proyectos de Android

Buenos dias Comenzamos el lunes con material, cuya traducci贸n fue preparada espec铆ficamente para estudiantes del curso "Desarrollador de Android". Curso avanzado " .



Recientemente migr茅 la base de c贸digo de Android a Kure en AndroidX. Me pareci贸 que esta es una gran oportunidad para trabajar en la velocidad de construcci贸n del proyecto. Gradle siempre ha tenido una mala reputaci贸n debido a la lentitud y al consumo de recursos, pero me sorprendi贸 mucho que cambios menores en la configuraci贸n del ensamblaje pudieran aumentar su velocidad de manera tan significativa.

Mire las m茅tricas de escaneo de ensamblaje antes / despu茅s de la optimizaci贸n


antes de la optimizaci贸n


despu茅s de la optimizaci贸n 锔忥笍

驴Disminuido de 5.5 minutos a 17 segundos? 隆Vu茅lvete loco!

No es tan dif铆cil exagerar con la optimizaci贸n para reducir a煤n m谩s el tiempo de montaje. Pero para que la publicaci贸n sea comprensible para los principiantes, me centrar茅 deliberadamente en las medidas menores e indoloras que he tomado para acercarme a este indicador.

Primero de todo!


Antes de comenzar la optimizaci贸n, es importante probar nuestro proyecto para averiguar cu谩nto tiempo lleva construirlo. Gradle tiene una opci贸n de escaneo conveniente que puede usar para analizar el rendimiento de su tarea. Inicie el terminal en Android Studio y ejecute el siguiente comando:

./gradlew assembleDebug --scan 

Al completar con 茅xito el ensamblaje, se le solicitar谩 que acepte los t茅rminos del servicio para descargar los resultados del escaneo. Ingrese s铆 para continuar. Una vez completada la publicaci贸n, recibir谩 un enlace al terminal para verificar el escaneo. 脕brelo.

Hay bastantes opciones en el sitio, pero por brevedad solo consideraremos lo m谩s importante.

Resumen muestra informaci贸n resumida sobre las tareas completadas y su tiempo de finalizaci贸n. Pero lo que nos interesa aqu铆 es la secci贸n de Rendimiento . Realiza un desglose m谩s detallado del tiempo de construcci贸n total, como se muestra a continuaci贸n.



En la secci贸n Rendimiento, hay una pesta帽a Configuraci贸n y sugerencias que proporciona recomendaciones para mejorar la velocidad de compilaci贸n. Miremos a ellos.



En esta secci贸n, podemos encontrar algunas soluciones simples para mejorar la velocidad. Entonces, continuemos y apliquemos estas correcciones en nuestro proyecto.

Paso # 1: herramientas de actualizaci贸n


El equipo de Android mejora y desarrolla constantemente el sistema de compilaci贸n. Por lo tanto, en la mayor铆a de los casos, puede obtener una mejora significativa simplemente instalando la 煤ltima versi贸n del kit de herramientas.

Durante esta refactorizaci贸n, nuestro proyecto estaba en la versi贸n 3.2.1 del complemento Gradle para Android Studio ( varias versiones anteriores a la 煤ltima versi贸n ).

Puede seguir este enlace para obtener la 煤ltima versi贸n de Gradle Plugin. Al momento de escribir esto, la 煤ltima era la versi贸n 3.4.0.

Pero hay una trampa aqu铆 que debemos recordar:



( Nota: cuando se utiliza Gradle versi贸n 5.0 o superior, el tama帽o predeterminado del demonio Gradle se reduce de 1 GB a 512 MB. Esto puede conducir a un bajo rendimiento de compilaci贸n. Para anular esta configuraci贸n predeterminada, especifique el tama帽o de memoria para el demonio Gradle en gradle.properties tu proyecto)

https://developer.android.com/studio/releases/gradle-plugin

Cuando use Gradle 5.0 y versiones posteriores, necesitaremos aumentar expl铆citamente el tama帽o de la memoria para que nuestra velocidad de construcci贸n no se deteriore. 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 a la secci贸n de dependencia :

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

Tambi茅n debe actualizar la URL de distribuci贸n en el archivo de propiedades de Gradle Wrapper ubicado en gradle/wrapper/gradle-wrapper.properties . Actualice la URL a lo siguiente.

( Este enlace estar谩 disponible en la p谩gina del complemento Android Gradle ) .

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

Encontrar谩 un error al usar Kotlin si la versi贸n del complemento Kotlin Gradle es inferior a 1.3.0. Si es as铆, use la informaci贸n sobre herramientas IDE para actualizar el complemento Gradle para Kotlin a la 煤ltima versi贸n (en el momento de escribir este art铆culo, esta es la versi贸n 1.3.31 ).

Ok, ejecutemos la compilaci贸n nuevamente desde la terminal para ver si hemos realizado alguna mejora.



Paso 2: Actualiza las configuraciones


Entonces, pudimos reducir aproximadamente 2.5 minutos del tiempo de compilaci贸n, pero esto a煤n no es lo suficientemente bueno. Despu茅s de estudiar los registros de compilaci贸n en la terminal, me encontr茅 con una l铆nea que nos interesar谩:



(> Tarea: aplicaci贸n: compileDevelopDebugJavawithJavac

Gradle puede deshabilitar la compilaci贸n incremental porque los siguientes procesadores de anotaciones no son incrementales: butterknife-compiler-10.1.0.jar (com.jakewharton: butterknife-compiler: 10.1.0), dagger-compiler-2.9.jar (com.google. daga: compilador de dagas: 2.9).

Considere configurar el indicador experimental android.enableSeparateAnnotationProcessing-true en el archivo gradle.properties para iniciar el procesamiento de anotaciones en una tarea separada y realizar una compilaci贸n incremental).

La compilaci贸n incremental b谩sicamente evita la compilaci贸n innecesaria de todo el conjunto de archivos de origen y, en cambio, solo compila los archivos que se han modificado. De los registros est谩 claro que no usamos esta funci贸n. Sugiere que usemos android.enableSeparateAnnotationProcessing=true , pero, en cualquier caso, no deber铆amos usar la configuraci贸n "annotationProcessor" ya que Kotlin se usa en nuestro proyecto.

Afortunadamente, la versi贸n 1.3.30 de Kotlin agrega soporte para el procesamiento paso a paso de anotaciones.



https://kotlinlang.org/docs/reference/kapt.html

(Procesamiento incremental de anotaciones (desde 1.3.30)


A partir de la versi贸n 1.3.30, kapt admite el procesamiento de anotaciones incrementales como una funci贸n experimental. Actualmente, el procesamiento de anotaciones se puede realizar de forma incremental solo si todos los procesadores de anotaciones utilizados son incrementales.
Para habilitar el procesamiento de anotaciones incrementales, agregue esta l铆nea al archivo gradle.properties :

kapt.incremental.apt=true

Tenga en cuenta que el procesamiento de anotaciones incrementales requiere que tambi茅n se habilite la compilaci贸n incremental ).

Entonces, comencemos:

  1. 1. Cambie la configuraci贸n del procesador de anotaci贸n a kapt
  2. 2. Habilite el indicador de procesamiento de anotaci贸n incremental experimental

Abra el archivo build.gradle su m贸dulo y agregue la siguiente l铆nea en la parte superior del archivo:

apply plugin: 'kotlin-kapt'

Luego cambie todas las configuraciones de annotationProcessor en la secci贸n de dependencias para usar kapt. Por ejemplo:

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


Ahora abra el 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 nuevamente.



Bueno, parece que hemos progresado un poco.

Paso # 3: Propiedades de Gradle


Estamos en la 煤ltima etapa. 驴Recuerdas el truco que encontramos al actualizar la versi贸n del complemento Gradle? Resulta que las versiones m谩s nuevas de Gradle reducen el tama帽o de la memoria usada a 512 MB. Esto es para garantizar que las m谩quinas d茅biles no consuman demasiada memoria. Tengo una computadora con 16 gigabytes de RAM, as铆 que puedo dar el lujo de alimentar de 2 a 3 gigas al demonio Gradle, pero sus n煤meros pueden variar.

Abra el archivo gradle.properties ubicado en la ra铆z de su proyecto y agregue la siguiente l铆nea. Aseg煤rese de elegir el tama帽o que se adapte a sus requisitos y especificaciones de la computadora.

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

Mientras hacemos esto, tambi茅n habilitemos ensamblajes paralelos y ajustes a pedido en las propiedades.

As铆 es como se ve mi versi贸n final del archivo gradle.properties :

 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 : este indicador permite a Gradle ensamblar m贸dulos dentro de un proyecto en paralelo, en lugar de secuencialmente. Esto solo es 煤til para proyectos de m贸dulos m煤ltiples.
  • org.gradle.configureondemand : este indicador configura solo los m贸dulos que son necesarios para el proyecto y no los recopila todos.

Una vez hecho esto, veamos qu茅 tenemos ahora los indicadores de velocidad de ensamblaje:




Ah铆 tienes!

Observaciones finales


Esto de ninguna manera es una cobertura extensa de todas las formas de optimizar la velocidad de ensamblaje. Hay muchas otras cosas que no he cubierto en esta publicaci贸n, como usar minSdk 21 cuando uso MultiDex, bibliotecas de indexaci贸n previa, deshabilitar la compresi贸n PNG, etc., son solo algunas de ellas.

Pero la mayor铆a de estas configuraciones requieren una comprensi贸n m谩s profunda del sistema de compilaci贸n de Android y experiencia trabajando con grandes proyectos de m煤ltiples m贸dulos (donde los beneficios son m谩s obvios). Los pasos que mencion茅 anteriormente se implementan f谩cilmente incluso por los desarrolladores junior y tienen beneficios significativos. 隆Espero que esto te ayude a aumentar la velocidad de construcci贸n!

隆Hasta la pr贸xima, la paz sea contigo!

Source: https://habr.com/ru/post/457374/


All Articles