Gradle build 慢?可能是你使用的姿势不对

简介: Gradle build 慢?可能是你使用的姿势不对

之前我司每个 Java 应用部署到预发都要等待漫长的编译打包时间,非常地痛苦!大项目编译时间常常达到接近 10 分钟,生命短暂啊,人生有多少个 10 分钟可以等待,于是我的效能团队针对编译作了一些优化,提速非常明显,对某个应用的测试来看,编译时间从 160 s 缩短到了 50 s 左右,提升近 70%,大家纷纷点赞,那么效能团队做了哪些措施来让编译速度提升这么明显呢?


首先要说的是我们用的 Gradle 来作为我们的构建工具,所以主要是针对 Gradle 的命令来作了一些优化


1、修改 gradle build 的参数



  • 使用 --build-cache


什么是 build cache(构建缓存),在 Gradle 中,每一个待编译的工程叫 Project,每一个 Project 在构建时都包含一系列的 task



每个 task 的输出都可以作为下一个 task 的输入,build cache 做的事就是把可以缓存(注:并不是所有的 task 输出都能缓存)的 task 输出都缓存住,这样在构建过程中,如果发现这个 task 的输入不变,就没必要重新执行任务了,直接从 task ouput 缓存里拿即可,如下图示,Build 2 的构建输入直接从 Build Cache 中拿,这样 Build 1 就不用构建了。



效果怎么样呢,看下图,下面图分别显示了 Gradle 持续集成时使用构建缓存和不使用构建缓存两种情况下的聚合的构建时间,可以看到使用了 cache 的 Gradle 构建速度明显快于不使用 cache 的情况



更骚的是这个 Buiid Cache 支持分布式的,可以统一把这些 cache 丢到一台机器上,本地机器要编译时统一去这台机器拉 cache,这样如果我们切换分支时执行构建也能用 Build Cache 来加快构建速度


--build-cache 的具有使用需要注意一些事项,比如得 Gradle 4.3 以上才有效,建议大家直接去官网查查看


  • 增加 --parallel 参数


并行执行在多项目编译的项目中能有效提升编译的速度,但是并行执行的前提是每个项目已经被模块化,每个项目之间没有耦合。


  • 移除 --refresh-dependencies 参数


原来 gradle build 有加这个参数,这个参数会忽略缓存,强制重新下载,显然是编译的瓶颈


2、任务并行



原来 Jenkins 中执行 Gradle 编译任务,每个 Task 是串行执行的,总编译耗时是每个任务执行时间的总和。



现在把它改成了并行的



显然并行执行会快得多


3、将大项目工程中的常用代码抽成 jar 包



对于业务方来说,采用这种方式也是提升编译速度的有效手段 ,将大量代码抽成 jar 包,意味着它们本身就是字段码了,在 gradle build 时就不用编译啦。

相关文章
|
3月前
|
Android开发
[ionic]解决Could not read build file capacitor/build.gradle as it does notexist.
[ionic]解决Could not read build file capacitor/build.gradle as it does notexist.
36 1
|
Android开发 开发工具 IDE
Android gradle问题解决: This app has been built with an incorrect configuration. Please configure your build for VectorDrawableCompat
1. 问题描述: Android Studio在运行模拟器某些机型或者真机某些机型的时候发生闪退。 错误如下: Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.
2363 0
|
IDE Java API
Gradle | 全局配置、Log开关控制、Build Variant、meta-data等配置
Gradle是一个先进的构建系统,也是一个允许通过插件创建自定义构建逻辑先进的构建工具。
462 0
|
Java API
Gradle学习基础(3):build脚本基础知识
Gradle学习基础(3):build脚本基础知识
Gradle学习基础(3):build脚本基础知识
|
Android开发
Migrate Project to Gradle? This project does not use the Gradle build system
Migrate Project to Gradle? This project does not use the Gradle build system
102 0
|
jenkins 持续交付 开发工具
|
Java API Kotlin
Gradle Writing Build Scripts
The Gradle build language Gradle 构建语言 Gradle 提供了一种领域特定语言(DSL)来描述构建,这种构建语言在 Groovy 和 Kotlin 都可以使用。 Groovy 构建脚本可以包含任何 Groovy 语言元素。 Kotlin 构建脚本可以包含任何 Kotlin 语言元素。 Gradle 假设每个构建脚本都使用 UTF-8进行编码。
134 0
|
API
Gradle Build Lifecycle
我们之前说过,Gradle 的核心是一种基于依赖性编程的语言。 在 Gradle 术语中,这意味着您可以定义任务和任务之间的依赖关系。 Gradle 保证这些任务按照其依赖项的顺序执行,并且每个任务只执行一次。 这些任务形成了一个有向无环图。 有一些构建工具可以在执行任务时建立这样的依赖关系图。 在执行任何任务之前,Gradle 构建完整的依赖关系图。 这位于 Gradle 的心脏地带,使许多事情成为可能,否则这些事情是不可能实现的。
124 0
gradle中的build script详解
gradle中的build script详解