问题

Gradle Sync或Build越来越慢,已经快不能忍受了,硬件配置并不差呀!

分析

两个方面:1,项目越来越大,依赖越来越多;2,Gradle本身为了兼容配置太中庸。

解决办法

针对1,将公用代码分离出来,以aar格式导出,使用时加本地aar或网络引用 。
2,对Gradle进行优化配置。

升级gradle版本,此法向前向后兼容

现在Android Studio默认的Gradle版本为2.4,而最新的Gradle版本为2.7,稳妥起见,升级到次新版2.6

build.gradle

添加下边的代码到project的build.gradle

1
2
3
task wrapper(type: Wrapper) {
gradleVersion = '2.6'
}

在Android Studio的Terminal中运行

1
./gradlew wrapper

或在Android Studio的Gradle Panel展开Project->Project(root)->Tasks->other,找见wrapper任务,单击执行。

Project属性

快捷键⌘+;打开项目属性,更新Gradle版本

project

配置Gradle

Gradle运行期环境增强配置

在Project根目录下的gradle.properties文件中添加

1
2
3
4
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx2g
org.gradle.java.home=/path/to/jvm

Daemon,守护进程,避免冷启动,Andorid Studio已默认开启,添加确保在Terminal下使用gradlew也使用。更多http://gradle.org/docs/current/userguide/gradle_daemon.html#when_should_i_not_use_the_gradle_daemon
Parallel,并发,充分利用硬件的多核性能,可能会让你的项目Build失败,那是因为项目结构没有解藕。更多http://gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
jvmargs,grovvy寄宿在jvm中运行,加大jvm的内存,给gradle更大的展现空间,比如-Xmx将heap size加大到2g,
java.home,使用与项目不同的java运行时,通常是Android开发使用JDK7,Gradle使用JDK8获得更好的性能。
Gradle的完整配置可以参考http://gradle.org/docs/current/userguide/userguide_single.html#sec:gradle_configuration_properties

这个配置同样可做为全局配置,添加到

  • ~/.gradle/gradle.properties

Gradle Build增量模式

在Module的build.gradle中添加

1
2
3
4
5
6
android{
...
dexOptions {
incremental true
}
{

指定APK的DEX环节使用增量模式。

后记

还不够快,你该升级你的硬件设备了!

One more thing

Gradle wrapper是如何工作的?
gradle作为一个独立的软件,之前都需要自己安装,像上边的过程中怎么只改了下数字,就全部搞定了呢?
如下图,Android Studio的Project中除了build.gradle,gradle.settings,gradle.properties之外,还有一个gradle目录。

gradle

这个jar文件只是一个钩子,每个project都有,调用功能时,由钩子调用实际的本地应用,位置如下:
1
2
3
Downloads ls ~/.gradle/wrapper/dists/gradle-
gradle-1.8-bin/ gradle-2.2.1-all/ gradle-2.4-bin/ gradle-2.6-all/
gradle-2.2-all/ gradle-2.4-all/ gradle-2.5-all/ gradle-2.7-all/

而这些版本是全局共享的,我们升级版本,Android Studio会自动下载本地没有的版本到这里。

更新20151205

Gradle 最新版本为2.9

升级 Android Plugin

1
2
3
4
5
buildscrpt {
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
}
}

开发使用SDK=21

1
2
3
4
5
6
7
8
9
10
android {
productFlavors {
dev {
minSdkVersion 21
}
prod {
minSdkVersion 14
}
}
}

原理:API>=21,使用 ART,在 Build 时只做 class to dex,不做 mergeing dex,省时间。