Gradle构建优化

本文主要介绍命令行下的Gradle构建优化。构建Gradle工程有两种方式,一种是自己配置环境变量,还有一种是使用gradle wrapper。
第一种,命令行下直接运行gradle会使用开发者环境变量所配置本地版本的gradle。
推荐使用第二种方式,Gradle wrapper,根目录下(Unix/Linux)运行gradlew或运行(Window)gradle.bat,把项目根目录下/gradle文件夹同步到代码仓库,其它人就不用关心gradle版本问题。

1.只编译指定Module

./gradlew :module:assembleDebug 

2.导出构建时间明细

./gradlew :module:assembleDebug --profile
Uri: build/reports/profile/

还可以加入build scan 插件,你可以看到关于每一次构建的一切信息,还可以从中得到一些建议:
one build Started today at 5:22:22 PM CST, finished today at 5:23:02 PM CST
3.开启Deamon
开启后台常驻进行处理gradle构建,官方文档暂不推荐打包服务器和CI中使用。

./gradlew :module:assembleDebug --daemon
or  
echo 'org.gradle.daemon=true' >> ~/.gradle/gradle.properties  

Tips:Gradle Daemon是一个长驻进程,它不仅可以省去每次构建重启JVM的时间,还可以缓存一些数据、文件、task等信息在内存中。Gradle3.0后默认开启Daemon。

4.开启demand configure
目前,在Gradle 2.14及以前版本,demand configure只是gradle一个正在开发的配置,所以默认不开启,官方提示会在未来某个版本默认开启。

./gradlew :module:assembleDebug --configure-on-demand
or  
echo 'org.gradle.configureondemand=true' >> ~/.gradle/gradle.properties  

5.模组化工程,并行构建

echo 'org.gradle.parallel=true' >> ~/.gradle/gradle.properties  

6.本地化依赖之后开启离线模式
每次构建会默认去服务器找依赖,包括gradle和gradle的Android构建工具,第一次下载完成之后可以开启离线模式,AS可以在设置->gradle中找到,命令行方式如下

./gradlew :module:assembleDebug --offline

7.指定守望进程构建的JVM参数 gradle.properties

# TODO: disable daemon on CI, since builds should be clean and reliable on servers
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  

8.用最新版本Gradle构建
Last, but not least,Gradle每个版本都有很大的变化,使用最新版本的Gradle会让构建时间提升一个数量级

数据分析

build daemon parallel after
Gradle 2.10 5min 3min25s 2min58 \
Gradle 2.14 4min48 3min28s 2min20s \
Gradle 3.1 3min12 \ 2min20s \
Gradle 4.2 2m46s \ 1min42s 54.212s
  • Gradle 3.x版本后默认开启daemon
  • 以上数据均为非 Instant Run 模式下首次构建 installDebug时间。

After数据分析

  • 从数据中可以看出非 Instant Run 模式下,:app:transformClassesWithDexForDebug 1m11.18s占据构建总时长50%,通过将开发模式的 minSdkVersion 提高到21可将时间减小到30s。
android {  
    [...]
    productFlavors {
        dev {
            minSdkVersion 21 //The important bit.
        }
        prod {
            minSdkVersion 15 //Example. Set to your real requirement.
        }
    }
  • multiDexEnabled对构建速度也有很大程度影响
  • 暂时关闭某个无关耗时 task
tasks.whenTaskAdded { task ->  
    if (task.name.startsWith(":zxing:") || task.name.startsWith(":share-lib:")) {
        task.enabled = false
    }
}
  • AS2.1 默认支持Dex in process, gradle.properties 文件中org.gradle.jvmargs值超过2G即可,允许多个 DEX processes 运行在一个单独的 VM,该VM 与Gradle也共享内存, 但是为需要为DexInProcess分配额外内存的原因,该内存在Gradle与多个DEX processes共享,如果build.gradle 己添加javaMaxHeapSize,需要把这个内存加上。

gradle 博客 https://blog.gradle.org/
gradle performance guide https://gradle.github.io/performance-guide/
gradle user guide https://docs.gradle.org/current/userguide/userguide.html
Gradle Recipes for Android(free eBook) https://gradle.org/books/
Android Studio User Guide https://developer.android.com/studio

张鹏宇

继续阅读此作者的更多文章