Cómo solucionar problemas de rendimiento de compilación con Build Analyzer

Puedes usar Build Analyzer para inspeccionar el rendimiento de la compilación de tu proyecto. El rendimiento de tu compilación puede verse afectado por varios factores que pueden cambiar entre las compilaciones. Para cada compilación que realizas, Build Analyzer intenta presentar la información más importante, de modo que puedas identificar y resolver rápidamente las regresiones de rendimiento de tu compilación.

En esta página, se proporciona una descripción general de Build Analyzer y una guía sobre el uso de la herramienta para mejorar el rendimiento de la compilación de tu proyecto. Si quieres ver más estrategias a fin de mejorar el rendimiento de la compilación, consulta Cómo optimizar tu velocidad de compilación.

Los datos que presenta el analizador cambian en función de cada compilación. En particular con compilaciones grandes y complejas, muchos factores pueden cambiar entre compilaciones, lo que cambia los datos que el analizador te muestra como factores importantes en la duración de la compilación. Por lo tanto, puede ser útil compilar tu proyecto varias veces y comparar los datos del analizador para identificar patrones.

Cómo comenzar

Cada vez que compilas tu app, Build Analyzer crea un informe y muestra los datos del último informe en la ventana Build.

Para comenzar, haz lo siguiente:

  1. Si todavía no lo hiciste, compila tu app de una de las siguientes maneras:
    • Haz clic en Build > Make Project en la barra de menú.
    • Para compilar un Android App Bundle o APK, haz clic en Build > Build Bundle(s)/APK(s) > Build Bundle(s) o Build > Build Bundle(s)/APK(s) > Build APK(s) en la barra de menú.
  2. Para abrir la ventana Build, selecciona View > Tool Windows > Build en la barra de menú.
  3. Para ver el informe de compilación en Build Analyzer, haz clic en la pestaña Build Analyzer de la ventana Build.

Cómo ver complementos con tareas que determinan la duración de la compilación

Cuando abres Build Analyzer por primera vez después de completar una compilación, la ventana muestra una descripción general del análisis de compilación, como se muestra en la figura 1.

Figura 1: La página de descripción general de Build Analyzer proporciona un resumen de los resultados.

Para ver un desglose de los complementos con tareas que determinan la duración de la compilación, haz clic en Plugins with tasks impacting build duration en la página de descripción general. También puedes seleccionar Tasks en el menú desplegable y confirmar que la opción Group by plugin esté seleccionada.

Figura 2: Build Analyzer proporciona un desglose de los complementos más responsables de la duración de la compilación.

En el panel de tareas, se muestran las tareas que contribuyen a la duración de la compilación. Todas las tareas con problemas tienen un ícono de advertencia junto a ellas.

En el gráfico, se muestra cuánto contribuye la tarea a la duración general de la compilación.

El panel de detalles especifica más información sobre los problemas que se detectaron para la tarea seleccionada.

Cada nodo muestra el tiempo total que lleva ejecutar los elementos secundarios directos del nodo. Estas duraciones te ayudan a enfocarte en inspeccionar las tareas con el mayor impacto en la duración de tu compilación.

Cómo ver tareas que determinan la duración de la compilación

Para ver un desglose de las tareas que contribuyen a la duración de tu compilación, haz clic en Tasks impacting build duration en la página de descripción general. También puedes seleccionar Tasks en el menú desplegable y confirmar que la opción Group by plugin no esté seleccionada.

Figura 3: Build Analyzer proporciona un desglose de las tareas más responsables de la duración de la compilación.

Gradle determina la ejecución de tareas según las interdependencias entre tareas, la estructura del proyecto y la carga de la CPU, y ejecuta las tareas de forma secuencial o en paralelo. Para una compilación determinada, Build Analyzer destaca el conjunto de tareas ejecutadas secuencialmente que determinaron la duración de la compilación actual. Resolver las ineficiencias de esas tareas destacadas es la mejor forma de reducir el tiempo de compilación general.

Es posible que veas un conjunto diferente de tareas que determinan la duración de la compilación con cada compilación que ejecutas. Por ejemplo, si realizas cambios en la configuración de la compilación, ejecutas una compilación con un conjunto diferente de tareas, como una compilación incremental, o ejecutas una compilación con diferentes restricciones, la ventana Build Speed podría destacar un conjunto diferente de tareas que afecta más la duración de esa compilación. Debido a esta variabilidad, te recomendamos que utilices la ventana Build Speed en varias compilaciones para reducir la duración de la compilación de forma coherente.

Las tareas se codifican según los siguientes colores:

  • Celeste: La tarea pertenece al complemento de Android para Gradle, al complemento de Java para Gradle o al complemento de Kotlin para Gradle.
  • Azul: La tarea pertenece a un complemento personalizado o de terceros, como un complemento que aplicaste después de crear un proyecto nuevo con Android Studio.
  • Púrpura: La tarea no pertenece a un complemento, pero se usa para modificar dinámicamente las propiedades del proyecto en el tiempo de ejecución. Por ejemplo, tareas que puedes definir dentro de tus archivos build.gradle.
  • Gris: La tarea, en relación con otras tareas destacadas por el analizador, no tiene un gran impacto en la duración de la compilación.

Puedes hacer clic en cada tarea secundaria para obtener más información sobre su ejecución. Por ejemplo, el analizador proporciona detalles adicionales, como el complemento principal, el tipo de tarea, otras tareas que hicieron que se ejecutara esta tarea y si la tarea se ejecutó de forma incremental, como se muestra en la figura 2. El analizador también puede generar advertencias que te ayuden a configurar la tarea para que se ejecute de manera más eficiente.

Cómo inspeccionar las advertencias

Si Build Analyzer detecta que algunas tareas pueden configurarse para ejecutarse de manera más eficiente, proporciona una advertencia.

Por ejemplo, una tarea que no utiliza las APIs de Gradle apropiadas para especificar sus entradas y salidas no puede aprovechar las compilaciones incrementales. Si tu compilación incluye esas tareas, Build Analyzer podría marcarlas con una advertencia de Always-run, ya que deben ejecutarse con cada compilación, sin importar si cambian sus entradas.

A fin de ver todas las advertencias que el analizador identificó para tu compilación, haz clic en All warnings en la página de descripción general o selecciona Warnings en el menú desplegable. La vista Warnings muestra las advertencias agrupadas por categoría. Por ejemplo, el nodo Always-run agrupa tareas que el analizador determina que no están configuradas correctamente para compilaciones incrementales.

Cuando haces clic en un nodo secundario, el analizador describe la naturaleza de la advertencia y los posibles pasos que puedes seguir para resolver el problema. Además, si la tarea pertenece a un complemento que aplicaste a tu proyecto, el analizador proporciona un vínculo Generate report, como se muestra en la figura 4.

Figura 4: Información detallada sobre las advertencias de Build Analyzer.

Cuando se hace clic en el vínculo Generate report, aparecerá un diálogo con información adicional que podría ayudar al desarrollador del complemento a resolver el problema en una versión nueva del complemento. Haz clic en Copy para guardar el texto en el portapapeles y pegar más fácilmente la información en un informe de errores para el desarrollador del complemento.

Tipos de advertencia

Build Analyzer informa los siguientes tipos de advertencia:

  • Tareas de ejecución constante: Una tarea de ejecución constante hace que otras tareas se ejecuten en cada compilación, lo cual no es necesario. Hay dos razones principales por las que podrías ver esta advertencia:

    • (Más común) No declaraste correctamente las entradas o salidas de las tareas. Si este es el caso, debes declarar de manera correcta las entradas y salidas para tus tareas. Esto significa que puedes declarar las entradas y salidas donde puedas, o bien cambiar las versiones de los complementos si las tareas que activan la advertencia provienen de complementos de terceros.

    • (Menos común) Una tarea tiene el valor upToDateWhen establecido en falso, lo que debe evitarse. Podría suceder que parte de la lógica se evalúe como falsa o que upToDateWhen esté codificado para que sea falso. Si hay lógica que se evalúa como falsa, este resultado puede ser intencional y puedes ignorar la advertencia. Si se codifica upToDateWhen como falso, debes quitar la codificación del código.

  • Problemas de configuración de tareas: Esta advertencia se genera para tareas que declaran el mismo directorio que las salidas. Esto significa que es probable que las salidas de esas tareas no se conserven entre compilaciones y que esas tareas siempre se ejecuten, incluso cuando no haya cambios. A fin de resolver esta advertencia, debes declarar diferentes directorios de salida para tus tareas. Eso implica declarar por tu cuenta los directorios de salida diferentes donde puedas, o bien cambiar las versiones de los complementos si las tareas que activan la advertencia provienen de complementos de terceros.

  • Procesador de anotaciones no incremental: Esta advertencia se genera en situaciones en las que un procesador de anotaciones no es incremental y hace que la tarea JavaCompile siempre se ejecute de manera no incremental. Para solucionar esta advertencia, cambia a un procesador de anotaciones incremental.

  • Caché de configuración: Esta advertencia se presenta si el almacenamiento en caché de configuración no está habilitado en tu proyecto. Build Analyzer recorre una secuencia de compilaciones para verificar si tu proyecto es compatible con el almacenamiento en caché de configuración. Si las verificaciones de compatibilidad se realizan de forma correcta, puedes activar el almacenamiento en caché de configuración desde Build Analyzer.

  • Verifica Jetifier: Esta advertencia aparece si la marca enableJetifier está presente y habilitada en el proyecto, es decir, si tienes android.enableJetifier=true en tu archivo gradle.properties. Build Analyzer puede realizar una verificación para ver si la marca se puede quitar de manera segura a fin de permitir que tu proyecto tenga un mejor rendimiento de compilación y migre fuera de las bibliotecas de compatibilidad de Android desactualizadas.

Cómo ver el impacto de la descarga

Build Analyzer proporciona un resumen del tiempo dedicado a descargar dependencias y una vista detallada de descargas por repositorio. Para verificar el impacto de las descargas, selecciona Descargas en el menú desplegable.

Puedes usar esta información para determinar si las descargas de dependencias inesperadas afectan el rendimiento de tu compilación. Esto es especialmente importante durante las compilaciones incrementales, que no deberían descargar artefactos de manera coherente.

En particular, puedes usar esta información para identificar problemas de configuración, como el uso de versiones dinámicas de dependencias que causan descargas inesperadas. Además, una gran cantidad de solicitudes fallidas para un repositorio específico podría indicar que el repositorio se debe quitar o mover a una posición inferior en la configuración.

Figura 5: Build Analyzer muestra el impacto de las descargas en la duración de la compilación.