Gradle常用 查询命令总结

279 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

Gradle 查询命令

查看主要任务

./gradlew tasks

查看所有任务,包括缓存任务等等

./gradlew tasks --all

Gradle 执行命令

对某个module [moduleName] 的某个任务[TaskName] 运行

./gradlew :moduleName:taskName

Build Scan

Build Scan 是官方推出的用于诊断应用构建过程的性能检测工具,它能分析出导致应用构建速度慢的一些问题。在项目下使用如下命令即可开启 Build Scan 诊断:

./gradlew build --scan

如果你使用的是 Mac,使用上述命令时出现

zsh: permission denied: ./gradlew

可以加入下面的命给 gradlew 分配执行权限:

chmod +x gradlew

操作步骤

  • 构建完成后控制台会让上传到BuildScan中
  • 第一次访问这个页面会让你绑定邮箱,邮箱中确认即可

  • 再次刷新那个页面即可看到构建数据:

这里给出链接scans.gradle.com/s/zzmuiol6h…

  • 点击Performance即可看到应用的构建性能分析页面

在 Build 界面中,共有三个子项目,即 Total build time、Total garbage collection time、Peak heap memory usage,Total build time 里面的配置项前面我们已经分析过了,这里我们看看其余两项的含义,如下所示:

  • Total garbage collection time:总的垃圾回收时间。
  • Peak heap memory usage:最大堆内存使用。(之前是用的和老年代年轻代的垃圾回收期构建的会有S1,S2和OLD区的内存使用,现在是使用G1垃圾回收期因此只有一项)

由于我们的目的是关注项目的 build 时间,所以,我们直接关注到 Task execution 这一项。如下图所示:

NotCacheable是用来35%的构建缓存来加快编译速度,点击该项即跳转到Timeline中。

如果想要查看具体某一个Task的详情,点击下面的task也会跳转到TimeLine中

比如:glsurfacedemo:mergeDexRelease这个Task的详情页面是这样的:

上方也可以看到类似火焰图的分析工具(点击下面会翻滚到具体的某个Task )

同样点击任务详情页面的Foucus on Timeline也会定位到上面

五、总结

Gradle 每次构建的运行时间会随着项目编译次数越来少,因此为了准确评估 Gradle 构建提速的优化效果,我们可以在优化前后分别执行以下命令进行对比分析,如下所示:

gradlew --profile --recompile-scripts --offline --rerun-tasks assembleDebug

参数含义如下:

  • profile:开启性能检测。

  • recompile-scripts:不使用缓存,直接重新编译脚本。

  • offline:启用离线编译模式。

  • return-task:运行所有 gradle task 并忽略所有优化。

此外,Facebook 的 Buck 以及 Google 的 Bazel 都是优秀的编译工具,那么他们为什么没有使用开源的构建工具呢,主要有如下 三点原因:

  • 1)、统一编译工具:内部的所有项目都使用同一套构建工具,包括 Android、Java、iOS、Go、C++ 等。编译工具的统一优化会使所有项目受益。
  • 2)、代码组织管理架构:Facebook 和 Google 的所有项目都放到同一个仓库里面,因此整个仓库非常庞大,并且,他们也不会使用 Git。目前 Google 使用的是Piper,Facebook 是基于HG修改的,也是一种基于分布式的文件系统。
  • 3)、极致的性能追求:Buck 和 Bazel 的性能的确比 Gradle 更好,内部包含它们的各种编译优化。但是它们的定制型太强,而且对 Maven、JCenter 这样的外部依赖支持也不好。

但是,Buck Bazel 编译构建工具内部的优化思路 还是很值得我们学习和参考的,有兴趣的同学可以去研究下。