什么是构建扫描?
构建扫描 是运行构建时发生情况的持久且可共享记录。它们提供了详细的洞察,您可以使用这些洞察来诊断性能问题、识别构建失败并与团队共享上下文。
构建扫描在本地创建,但会发布到 Gradle 管理的安全外部服务器。它们不在您的机器上运行代码,也绝不会修改您的构建。您可以选择是否发布扫描,并且每个扫描都被分配一个唯一的(默认为私有的)URL。
有关收集的数据以及如何处理的信息,请参阅 Gradle.com 隐私政策。 |
在 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. 使用构建扫描分析性能
性能页面可以帮助您使用构建扫描分析构建。要访问该页面,请单击左侧导航菜单中的 "Performance"(性能)或遵循构建扫描主页上的“Explore performance”(探索性能)链接

性能页面显示了构建不同阶段完成所需的时间。此页面显示了以下内容所需的时间:
-
启动
-
配置构建的项目
-
解析依赖项
-
执行任务
您还可以获取有关环境属性的详细信息,例如是否使用了守护进程。

在上面的构建扫描中,配置耗时超过 13 秒。单击 "Configuration"(配置)选项卡将此阶段分解为组成部分,揭示缓慢的原因。

您可以在此处看到按应用时间降序排列的应用于项目的脚本和插件。最慢的插件和脚本应用是优化的良好候选。例如,脚本 script-b.gradle
被应用一次但耗时 3 秒。展开该行以查看构建在何处应用了此脚本。

您可以看到子项目 :app1
从其 build.gradle
文件内部应用了该脚本一次。
2. 性能分析报告
如果您不想使用构建扫描,可以在根项目的 build/reports/profile
目录中生成 HTML 报告。要生成此报告,请使用 --profile
命令行选项
$ gradle --profile <tasks>
每个性能分析报告的名称中都有一个时间戳,以避免覆盖现有报告。
报告显示了运行构建所需时间的细分。但是,此细分不如构建扫描详细。以下性能分析报告显示了可用的不同类别

3. 低级别性能分析
有时即使您的构建脚本一切正常,构建仍然会很慢。这通常归结为插件和自定义任务效率低下或资源受限。使用 Gradle Profiler 来查找这类瓶颈。借助 Gradle Profiler,您可以定义诸如“在进行 ABI 破坏性更改后运行 'assemble'”之类的场景,并多次运行构建以收集性能分析数据。使用 Profiler 生成构建扫描。或者将其与 JProfiler 和 YourKit 等方法分析器结合使用。这些分析器可以帮助您在自定义插件中找到低效的算法。如果您发现 Gradle 本身有什么东西使您的构建变慢,请随时将性能分析器快照发送到 performance@gradle.com。
性能类别
构建扫描和本地性能分析报告都将构建执行分解为相同的类别。以下部分解释了这些类别。
启动
这反映了 Gradle 的初始化时间,主要包括:
-
JVM 初始化和类加载
-
如果您使用 wrapper,则下载 Gradle 发行版
-
如果尚未运行合适的守护进程,则启动守护进程
-
执行 Gradle 初始化脚本
即使构建执行的启动时间很长,随后的运行通常会看到启动时间显著下降。持续缓慢的构建启动时间通常是由于您的 init 脚本中的问题导致的。仔细检查您在那里所做的工作是否必要且高性能。
Settings 和 buildSrc
启动后,Gradle 会初始化您的项目。通常,Gradle 只处理您的 settings 文件。如果您在 buildSrc
目录中有自定义构建逻辑,Gradle 也会处理该逻辑。构建一次 buildSrc
后,Gradle 认为它是最新的。最新检查比逻辑处理花费的时间少得多。如果您的 buildSrc
阶段花费太多时间,请考虑将其分解为一个单独的项目。然后,您可以将该项目的 JAR artifact 添加为依赖项。
settings 文件很少包含具有显著 I/O 或计算的代码。如果您发现 Gradle 处理它花费了很长时间,请使用更传统的性能分析方法,例如 Gradle Profiler,来确定原因。
加载项目
加载项目通常不需要太多时间,您也无法控制它。此处花费的时间基本上是您构建中项目数量的函数。