Gradle 提供了多种方法来检查您的构建:

  • 带有构建扫描的配置文件

  • 本地概况报告

  • 低级分析

什么是构建扫描?

构建扫描是运行构建时发生的情况的持久、可共享的记录。构建扫描可以深入了解您的构建,您可以使用它来识别和修复性能瓶颈。

在 Gradle 4.3 及更高版本中,您可以使用命令行选项创建构建扫描--scan

$ gradle build --scan

对于较旧的 Gradle 版本, 构建扫描插件用户手册 解释了如何启用构建扫描。

在构建结束时,Gradle 会显示一个 URL,您可以在其中找到构建扫描:

BUILD SUCCESSFUL in 2s
4 actionable tasks: 4 executed

Publishing build scan...
https://gradle.com/s/e6ircx2wjbf7e

本节介绍如何使用构建扫描来分析您的构建。

带有构建扫描的配置文件

性能页面可以帮助使用构建扫描来分析构建。要到达那里,请单击左侧导航菜单中的“性能”或点击构建扫描主页上的“探索性能”链接:

构建扫描主页
图 1. 构建扫描主页上的性能页面链接

性能页面显示完成构建的不同阶段所花费的时间。此页面显示了以下内容花费的时间:

  • 启动

  • 配置构建的项目

  • 解决依赖关系

  • 执行任务

您还可以获得有关环境属性的详细信息,例如是否使用了守护程序。

构建扫描性能页面
图 2. 构建扫描性能页面

在上面的构建扫描中,配置需要超过 13 秒。单击“配置”选项卡可将此阶段分解为多个组成部分,从而揭示缓慢的原因。

构建扫描配置细分
图 3. 构建扫描配置细分

在这里,您可以按照应用时间的降序查看应用于项目的脚本和插件。最慢的插件和脚本应用程序是优化的良好候选者。例如,该脚本script-b.gradle应用了一次,但花费了 3 秒。展开该行以查看构建应用此脚本的位置。

脚本b应用程序
图 4. 显示 script-b.gradle 在构建中的应用

您可以看到该子项目:app1从该子项目的文件内部应用了一次脚本build.gradle

概况报告

如果您不想使用构建扫描,您可以在 build/reports/profile根项目的目录中生成 HTML 报告。要生成此报告,请使用--profile命令行选项:

$ gradle --profile <tasks>

每个配置文件报告的名称中都有一个时间戳,以避免覆盖现有的报告。

该报告显示运行构建所需时间的详细信息。然而,这种细分并不像构建扫描那么详细。以下配置文件报告显示了可用的不同类别:

Gradle 配置文件报告示例
图 5. 配置文件报告示例

低级分析

有时,即使您的构建脚本一切正常,您的构建也可能很慢。这通常归结为插件和自定义任务效率低下或资源有限。使用Gradle Profiler来查找此类瓶颈。使用 Gradle Profiler,您可以定义“在进行 ABI 破坏性更改后运行‘assemble’”等场景,并多次运行构建来收集分析数据。使用 Profiler 生成构建扫描。或者将其与 JProfiler 和 YourKit 等方法分析器结合使用。这些分析器可以帮助您找到自定义插件中低效的算法。如果您发现 Gradle 本身的某些内容会减慢您的构建速度,请随时将分析器快照发送至Performance@gradle.com

性能类别

构建扫描和本地配置文件报告都将构建执行分解为相同的类别。以下部分解释了这些类别。

启动

这反映了 Gradle 的初始化时间,主要包括:

  • JVM初始化和类加载

  • 如果您使用包装器,请下载 Gradle 发行版

  • 如果合适的守护进程尚未运行,则启动该守护进程

  • 执行 Gradle 初始化脚本

即使构建执行的启动时间很长,后续运行的启动时间通常也会急剧下降。构建启动时间持续缓慢通常是由于初始化脚本中的问题造成的。仔细检查您正在做的工作是否必要且有效。

设置和buildSrc

启动后,Gradle 会初始化您的项目。通常,Gradle 只处理您的设置文件。如果目录中有自定义构建逻辑buildSrc,Gradle 也会处理该逻辑。构建buildSrc一次后,Gradle 认为它是最新的。最新检查所花费的时间比逻辑处理要少得多。如果您的buildSrc阶段花费太多时间,请考虑将其分解为一个单独的项目。然后,您可以将该项目的 JAR 工件添加为依赖项。

设置文件很少包含具有大量 I/O 或计算的代码。如果您发现 Gradle 需要很长时间来处理它,请使用更传统的分析方法(例如Gradle Profiler)来确定原因。

加载项目

加载项目通常不会花费大量时间,您也无法控制它。这里花费的时间基本上是您构建中的项目数量的函数。