【译】我每周在构建Gradle时是如何节约出5小时的

2,942 阅读4分钟

原文链接

Gradle是一个基于JVM可以用于构建Android工程的编译工具。它和Ant以及Maven类似,但是比他们更优秀。随着Android项目变得越来越复杂,模块化地开发也越来越流行,所以构建的效率性能变得至关重要。每次构建项目中节省几秒,这对于整个项目和工作来说有极大的效率提升。

你们可能已经意识到,即使是最简单的Gradle调用也比较慢。在我的Mac上,大约需要6秒钟来简单地列出项目的可用gradlew。

下面是一些能够提升Gradle执行效率的提示:

Gradle Daemon(Gradle守护进程)

你可以减少Gradle的启动时间(在我的电脑上下降到2秒钟),下面是使用守护进程来构建项目:

org.gradle.daemon=true

##Parallel Project Execution(并行项目执行) 如果你正在构建一个具有很多Module并且依赖比较关系比较复杂的项目,那么这个改动能对你产生比较重要的影响:

org.gradle.parallel=true

Configure projects on demand(根据需求配置项目)

Gradle在执行任务之前会配置每个项目,并且不管这个项目是否需要特定的构建。"Configure projects on demand"模式可以改变这种方式,只配置所需要的项目。像"Parallel Project Execution"一样,"Configure projects on demand"将对这种多项目并且依赖关系复杂的项目产生重要的影响。

Global gradle.properties(Gradle全局配置文件)

在Gradle主目录中定义或者配置的属性优先级高于在项目目录中文件定义的属性。原因是你想避免在你的构建服务器上使用Gradle守护进程,而内存消耗肯定是比启动时间更重要的:

/Users/cesarferreira/.gradle/gradle.properties

# The Gradle daemon aims to improve the startup and execution time of Gradle.
# When set to true the Gradle daemon is to run the build.
org.gradle.daemon=true

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
org.gradle.parallel=true

# Enables new incubating mode that makes Gradle selective when configuring projects.
# Only relevant projects are configured which results in faster builds for large multi-projects.
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand
org.gradle.configureondemand=true

使用Module是有代价的...我的意思是真的有代价!

为了构建我目前的linkedcare项目,我不得不去寻找并且fork一些相对适合但不是特别适合我项目的一些依赖库。 如果这些模块没有被不断修改,考虑这一点非常重要:从头开始编译它们,或者甚至是检查以前的模块是否是最新版本的,所需的时间是直接将该依赖加载为二进制.jar / .aar的四倍,也就是说每次编译Gradle都要去检查依赖是不是最新的,这将花费大量时间。 **提示:**运行gradle build -profile获取HTML报告,显示构建过程的时间。 **注意:**在版本控制系统中保留“不必要的”模块,以便于对该依赖的快速修复/改进。

从4分钟到21秒

基于以上这些优化方式,我们来看看效果:

21秒?好吧,还不算太差

任务执行配置

lint任务

如果你看看你的任务执行配置文件,你会发现lint任务需要很多时间,你真的需要检查lint输出的增量构建吗? 把它取消吧:

gradle build -x lint

缩短到15秒了,很好!

##12秒减少到8秒

lint vital release还是占用了比较多时间

另一个lint任务检查,这个任务几乎占据了我们目前构建项目总时间的90%。好吧,现在也将这个任务取消掉:

gradle build -x lint -x lintVitalRelease

哈哈哈哈啊哈哈!一直减少到8秒啦

**提示:**如果要从增量构建中永久跳过lint检查,可以将其添加到build.gradle中:

tasks.whenTaskAdded { task ->
    if (task.name.equals("lint")) {
        task.enabled = false
    }
}

总结一下:

  • 在Gradle目录下有一个全局gradle.properties,所有的项目将继承它(Android中Module的单个Gradle配置文件优先级低于全局的);
  • 运行Gradle build profile工具;
  • 坚持基本模块依赖(基于配置文件工具结果);
  • 跳过不成功的Gradle任务;

联系原文作者:

如果您有任何问题或想要分享您的结果->我的twitter @cesarmcferreira☺