Résoudre les problèmes de performances de compilation avec Build Analyzer

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Build Analyzer permet d'inspecter les performances de compilation de votre projet. Plusieurs facteurs pouvant varier d'un build à l'autre peuvent affecter les performances de votre build. Pour chaque build que vous exécutez, Build Analyzer tente de présenter les informations les plus importantes afin que vous puissiez rapidement identifier et résoudre les régressions dans vos performances de compilation.

Cette page offre un aperçu de Build Analyzer et fournit des conseils sur l'utilisation de cet outil pour améliorer les performances des builds de votre projet. Pour découvrir d'autres stratégies permettant d'améliorer les performances de compilation, consultez Optimiser la vitesse de compilation.

Les données présentées par Build Analyzer varient en fonction de chaque build. Pour les compilations volumineuses et complexes en particulier, de nombreux facteurs peuvent changer entre les builds. Les données que Build Analyzer vous présente sont donc des facteurs importants dans la durée de compilation. Il peut donc être utile de compiler votre projet plusieurs fois et de comparer les données dans Build Analyzer pour identifier des motifs.

Premiers pas

Chaque fois que vous compilez l'application, Build Analyzer crée un rapport et affiche les données du dernier rapport dans la fenêtre Build (Compilation).

Pour commencer, procédez comme suit :

  1. Si vous ne l'avez pas déjà fait, créez votre application de l'une des manières suivantes :
    • Dans la barre de menu, cliquez sur Build > Make project (Compilation > Créer un projet).
    • Pour créer un Android App Bundle (AAB) ou un Android Application Package (APK), cliquez sur Build > Build Bundle(s) / APK(s) > Build Bundle(s) (Compilation > Compiler des bundle(s)/APK > Compiler des bundles) ou sur Build > Build Bundle(s) / APK(s) > Build APK(s) (Compilation > Compiler des bundle(s)/APK > Compiler des APK) dans la barre de menu.
  2. Pour ouvrir la fenêtre Build (Compilation), sélectionnez View > Tool Windows > Build (Vue > Fenêtres d'outils > Compilation) dans la barre de menu.
  3. Pour afficher le rapport de compilation dans Build Analyzer, cliquez sur l'onglet Build Analyzer dans la fenêtre Build (Compilation).

Afficher les plug-ins avec les tâches qui déterminent la durée de compilation

Lorsque vous ouvrez Build Analyzer pour la première fois après une compilation, la fenêtre affiche un aperçu de l'analyse de la compilation, comme illustré à la figure 1.

Figure 1 : La page d'aperçu de Build Analyzer résume les résultats de la compilation

Pour voir la répartition des plug-ins dont les tâches déterminent la durée de compilation, cliquez sur Plug-ins with tasks impacting build duration (Plug-ins avec les tâches qui déterminent la durée de compilation) sur la page d'aperçu. Vous pouvez également sélectionner Tasks (Tâches) dans le menu déroulant et confirmer que l'option Group by plugin (Regrouper par plug-in) est cochée.

Figure 2 : Build Analyzer fournit une liste des plug-ins impactant le plus la durée de votre compilation

Le volet des tâches affiche les tâches qui contribuent à la durée de compilation. Une icône d'avertissement apparaît à côté des tâches qui présentent des problèmes.

Le graphique indique dans quelle proportion la tâche contribue à la durée globale de la compilation.

Le volet de détails fournit des informations supplémentaires sur les problèmes détectés pour la tâche sélectionnée.

Chaque nœud affiche le temps total nécessaire pour exécuter ses enfants directs. Ces durées vous permettent de vous concentrer sur l'inspection des tâches ayant le plus d'impact sur la durée de votre compilation.

Afficher les tâches qui déterminent la durée de compilation

Pour afficher la répartition des tâches qui contribuent à la durée de la compilation, cliquez sur Tasks impacting build duration (Tâches ayant une incidence sur la durée de la compilation) sur la page d'aperçu. Vous pouvez également sélectionner Tasks (Tâches) dans le menu déroulant et confirmer que l'option Group by plugin (Regrouper par plug-in) est décochée.

Figure 3 : Build Analyzer fournit une liste des tâches impactant le plus la durée de la compilation

Gradle détermine l'exécution des tâches en fonction des interdépendances des tâches, de la structure du projet et de la charge du processeur, et exécute les tâches de manière séquentielle ou parallèle. Pour une compilation donnée, Build Analyzer met en évidence l'ensemble des tâches exécutées de manière séquentielle qui ont déterminé la durée de la compilation actuelle. Pour réduire votre temps de compilation global, commencez par corriger les problèmes d'efficacité des tâches ainsi mises en évidence.

Un ensemble différent de tâches peut déterminer la durée de compilation à chaque compilation que vous exécutez. Par exemple, si vous apportez des modifications à la configuration de compilation, exécutez une compilation avec un autre ensemble de tâches (comme une compilation incrémentielle) ou exécutez une compilation sous différentes contraintes. La fenêtre "Build Speed" (Vitesse de compilation) pourra mettre en évidence un autre ensemble de tâches qui ont eu le plus d'impact sur la durée de la compilation. En raison de cette variabilité, vous pouvez utiliser la fenêtre "Build Speed" (Vitesse de compilation) sur plusieurs compilations pour réduire la durée des compilations de manière cohérente.

Chaque tâche est associée à un code couleur comme suit :

  • Bleu clair : la tâche appartient aux plug-ins Android Gradle, Java Gradle ou Kotlin Gradle.
  • Bleu : la tâche appartient à un plug-in tiers ou personnalisé, tel qu'un plug-in que vous avez appliqué après avoir créé un projet avec Android Studio.
  • Violet : la tâche n'appartient pas à un plug-in, mais est utilisée pour modifier dynamiquement les propriétés du projet lors de l'exécution. Il s'agit, par exemple, de tâches que vous pouvez définir dans vos fichiers build.gradle.
  • Gris : par rapport aux autres tâches mises en évidence par Build Analyzer, cette tâche n'a pas d'impact significatif sur la durée de la compilation.

Vous pouvez cliquer sur chaque tâche enfant pour en savoir plus sur son exécution. Par exemple, Build Analyzer fournit des détails supplémentaires, tels que le plug-in parent, le type de tâche, les autres tâches ayant entraîné l'exécution de cette tâche, et si elle a été exécutée par incréments, comme illustré dans la figure 2. Build Analyzer peut également afficher des avertissements pour vous aider à configurer la tâche afin qu'elle s'exécute plus efficacement.

Inspecter les avertissements

Si Build Analyzer détecte que certaines tâches peuvent être configurées pour s'exécuter plus efficacement, il émet un avertissement.

Par exemple, une tâche qui n'utilise pas les API Gradle appropriées pour spécifier ses entrées et ses sorties ne peut pas bénéficier des builds incrémentiels. Si votre build inclut de telles tâches, Build Analyzer peut les signaler avec un avertissement Always-run (Toujours exécuter), car elles doivent s'exécuter à chaque compilation, que leurs entrées changent ou non.

Pour afficher tous les avertissements identifiés par Build Analyzer, cliquez sur All warnings (Tous les avertissements) sur la page d'aperçu ou sélectionnez Warnings (Avertissements) dans le menu déroulant. La vue "Warnings" (Avertissements) regroupe les avertissements par catégorie. Par exemple, le nœud Always-run (Toujours exécuter) regroupe les tâches qui, selon Build Analyzer, ne sont pas correctement configurées pour les builds incrémentiels.

Lorsque vous cliquez sur un nœud enfant, Build Analyzer décrit la nature de l'avertissement et les étapes que vous pouvez suivre pour résoudre le problème. De plus, si la tâche appartient à un plug-in que vous avez appliqué à votre projet, Build Analyzer fournit un lien Generate report (Générer un rapport), comme illustré à la figure 4.

Figure 4 : Informations détaillées sur les avertissements de Build Analyzer

Lorsque vous cliquez sur le lien Generate report (Générer le rapport), une boîte de dialogue contenant des informations supplémentaires s'affiche. Elle peut aider le développeur du plug-in à résoudre le problème dans une nouvelle version du plug-in. Vous pouvez cliquer sur Copy (Copier) pour enregistrer le texte dans le presse-papiers, puis coller plus facilement les informations dans un rapport de bug pour le développeur du plug-in.

Types d'avertissements

Build Analyzer signale les types d'avertissement suivants :

  • Always run tasks(Toujours exécuter des tâches) : une tâche en cours d'exécution exécute d'autres tâches à chaque compilation, ce qui n'est pas nécessaire. Cet avertissement peut s'afficher pour deux raisons principales :

    • (Scénario le plus courant) Vous n'avez pas déclaré correctement les entrées et les sorties des tâches. Dans ce cas, vous devez déclarer correctement les entrées et les sorties de vos tâches. Cela signifie que vous devez déclarer vous-même les entrées et les sorties là où vous le pouvez, ou modifier les versions des plug-ins si les tâches qui déclenchent l'avertissement proviennent de plug-ins tiers.

    • (Scénario le moins courant) La valeur upToDateWhen d'une tâche est définie sur "false", ce qui doit être évité. Il se peut qu'une logique renvoie la valeur "false" ou que upToDateWhen soit codé en dur pour être définie sur "false". Si une logique renvoie la valeur "false", ce résultat peut être intentionnel et vous pouvez choisir d'ignorer l'avertissement. Si la valeur upToDateWhen est codée en dur pour être définie sur "false", supprimez le codage en dur de votre code.

  • Task setup issues (Problèmes de configuration des tâches) : cet avertissement est généré pour les tâches qui déclarent le même répertoire que les sorties. Cela signifie que les sorties de ces tâches ne seront probablement pas conservés entre les builds. Ces tâches seront toujours exécutées, même en l'absence de modifications. Pour résoudre cet avertissement, déclarez des répertoires de sortie différents pour vos tâches. Cela signifie que vous devez déclarer vous-même des répertoires de sortie différents ou modifier les versions des plug-ins si les tâches qui déclenchent l'avertissement proviennent de plug-ins tiers.

  • Non-incremental annotation processor (Processeur d'annotations non incrémentiels) : cet avertissement est généré dans les situations où un processeur d'annotations n'est pas incrémentiel et entraîne l'exécution systématique non-incrémentielle de la tâche JavaCompile. Pour résoudre cet avertissement, passez à un processeur d'annotations incrémentielles.

  • Configuration cache (Cache de configuration) : cet avertissement s'affiche si la mise en cache de la configuration n'est pas activée pour votre projet. Build Analyzer parcourt une séquence de builds pour vérifier si votre projet est compatible avec la mise en cache de la configuration. Si les vérifications de compatibilité aboutissent, vous pouvez activer la mise en cache de la configuration dans Build Analyzer.

  • Check Jetifier (Vérifier Jetifier) : cet avertissement s'affiche si l'indicateur enableJetifier est présent et activé dans votre projet, c'est-à-dire si android.enableJetifier=true se trouve dans le fichier gradle.properties. L'outil Build Analyzer peut vérifier si l'indicateur peut être supprimé en toute sécurité pour améliorer les performances de compilation de votre projet et migrer le système pour ne plus avoir recours à des bibliothèques Android Support qui ne font plus l'objet d'une maintenance.

Vérifier l'impact des téléchargements

Build Analyzer fournit un résumé de la durée de téléchargement des dépendances et une vue détaillée des téléchargements par dépôt. Pour vérifier l'impact des téléchargements, sélectionnez Downloads (Téléchargements) dans le menu déroulant.

Vous pouvez utiliser ces informations pour déterminer si des téléchargements de dépendances inattendus ont un impact négatif sur vos performances de compilation. C'est particulièrement important lors de compilations incrémentielles où des artefacts ne devraient pas être systématiquement téléchargés.

Plus précisément, vous pouvez utiliser ces informations pour identifier les problèmes de configuration (par exemple, l'utilisation de versions dynamiques de dépendances entraînant des téléchargements inattendus). De plus, si vous constatez que beaucoup de requêtes ont échoué pour un dépôt spécifique, cela peut signifier que celui-ci doit être supprimé ou déplacé plus bas dans la configuration.

Figure 5 : Build Analyzer montre l'impact des téléchargements sur la durée de compilation.