12 - Optimizacion y rendimiento

Objetivo del tema

Identificaras tecnicas para acelerar builds con Gradle, aprovechar el build cache, controlar el Gradle Daemon y ajustar recursos para builds de gran escala.

Al finalizar, podras habilitar caches distribuidas, configurar paralelismo, administrar memoria y aplicar lockfiles para garantizar reproducibilidad.

12.1 Build cache y Gradle Daemon

El build cache almacena salidas de tareas para reutilizarlas en ejecuciones futuras. El build cache puede ser local o remoto. El Gradle Daemon mantiene un proceso en memoria para evitar arrancar la JVM en cada build.

# gradle.properties
org.gradle.caching=true
org.gradle.daemon=true
org.gradle.caching.debug=false

Habilita caches remotas con settings.gradle o build.gradle utilizando buildCache { remote(HttpBuildCache) { ... } } y autentica con tokens seguros.

12.2 Paralelismo y configuracion de memoria

Gradle puede ejecutar tareas y proyectos en paralelo para aprovechar CPUs multinucleo. Ajusta la memoria de la JVM para evitar GC frecuentes y mejorar tiempos de respuesta.

# gradle.properties
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.workers.max=4
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8

Usa ./gradlew build --scan para medir cuellos de botella; los Gradle Build Scans resaltan tareas lentas y recomiendan ajustes de configuracion.

12.3 Lockfiles para reproducibilidad

Los lockfiles congelan versiones de dependencias para garantizar builds reproducibles. Gradle permite activar dependency locking y generar archivos gradle.lockfile por configuracion.

dependencyLocking {
  lockAllConfigurations()
}

tasks.register('bloquearDependencias') {
  dependsOn 'dependencies'
  doLast {
    println 'Lockfiles actualizados. Verifica gradle.lockfile y compromete los cambios.'
  }
}

// Generar lockfiles
// ./gradlew dependencies --write-locks

Cuando actualices dependencias, elimina o actualiza los lockfiles de forma controlada para mantener la consistencia entre entornos.

12.4 Mejores practicas de optimizacion

Para builds grandes, combina cache, paralelismo y configuracion modular. Analiza con Build Scans u otras herramientas y automatiza limpiezas de cache cuando cambie la configuracion del proyecto.

  • Evita tareas que escriban fuera de la carpeta build/; esto facilita cachear resultados.
  • Divide proyectos monoliticos en modulos con dependencias declarativas.
  • Minimiza trabajo durante la fase de configuracion usando tasks.register en lugar de tasks.create.
  • Documenta flags de rendimiento en la wiki del equipo para que todos los builds utilicen la misma configuracion.

Resumen didactico

La optimizacion en Gradle se basa en cachear resultados, reutilizar el Daemon, paralelizar tareas y fijar dependencias con lockfiles. Con estas tecnicas obtendras builds mas rapidos, reproducibles y faciles de mantener incluso en equipos grandes.