随着项目工程的不断增大,加之组件化、插件化方案盛行,致使module拆分过多,多module状况下很容易出现依赖关系混乱、过分依赖等问题,导致构建速度成为影响开发效率的瓶颈,想象一下修改一行代码须要抽一根烟的功夫(可能还不够),那一天得多费烟啊!!?java
本文针对gradle官方给出的构建优化方案结合平常开发经验,总结了一些简单实用的方法来提高构建速度。android
原文连接Improving the Performance of Gradle Builds。git
另外因为目前build apk的瓶颈基本都在transformClassesWithDexBuilderForDebug这个任务(稳定占用build时长的一半),它将全部class文件的jar包转换为dex,class文件越多转换的越慢,目前有一些开源项目作了一些dex的预建立和差分合并dex的方案,简直黑科技fastdex了解一下,再好比instant run这些动态化的技术咱们暂不讨论。github
整个build过程分为三个阶段浏览器
后面的优化项都集中在configuration和execution阶段。缓存
发现了构建慢的问题之后应该先找到一些工具来定量分析。bash
gradle在4.3版本发布了build scans工具,构建时经过--scan参数完成build扫描,好比./gradlew assembleDebug --scan
。当构建完成,控制台会打印连接,点击连接在浏览器中预览scan结果。网络
scan结果中含有build过程的全部细节信息,好比构建日志、构建时长、构建时间轴、task耗时分析、依赖关系、gradle插件等等,最后还会给出一些改进建议。这些信息对优化构建很是有帮助。并发
另外gradle构建时可使用profile参数生成简易的report profile。app
./gradlew assembleDebug --profile
复制代码
打开profile网页长这个样子,能够作基本的耗时分析。
目前最新的gradle版本为5.4.1,gradle插件版本最新为3.4.0,使用新版gradle能够有效利用编译方面的优化,简单说有新版本更新就是了。
task默认是串行执行,开启并行执行提升构建速度org.gradle.parallel=true
(在项目根目录gradle.properties文件中声明),在build scan界面Timeline模块能够直观的看到多任务在并发执行。
gradle默认为构建预留1G的堆空间,但对于一个相对较大的app来讲还远远不够,可经过下面的配置动态调整。
org.gradle.jvmargs=-Xmx2048M
复制代码
固然若是你的机器性能很好,还能够调到4G甚至更高。
org.gradle.caching=true
复制代码
此选项在gradle 3.0以后默认开启
org.gradle.daemon=true
复制代码
未使用的依赖库会增长编译时间和apk大小,应尽可能将引用去掉。
那如何排查那些不须要引用的依赖库呢?这里提供一个,gradle-lint-plugin完成,集成插件可排查项目中的未使用的依赖库库。
有些时候须要排查间接依赖,即一个library中依赖了另外一个项目中不须要使用库,能够经过gradle命令检查依赖关系。
./gradlew -q :<moduleName>:dependencies
复制代码
gradle会从用户配置的repositories中顺序的查找并下载依赖库,build过程dependency resolution阶段会执行此操做,它须要访问网络,所以合理配置repositories可减小依赖库查找时间。
应用的插件究竟是全局的仍是局部的。 应该配置到合理的位置,allprojects {} or subprojects {},没必要要的插件不要apply。
(Minimize dynamic and snapshot versions),例如“2.+”。它会迫使gradle访问远程仓库判断是否有新版本可用。 能够去build scan界面dependencies tab下按dynamic vesion进行过滤排查。
R8是新一代的代码压缩工具,它的职能与Proguard相对应。在R8以前,gradle采用D8+Proguard的形式构建,R8则将混淆和D8工具整合(D8编译器在gradle 3.1版本默认开启),旨在加快构建时间和output apk大小。
R8的兼容模式可兼容proguard配置的混淆规则,性能方面也优于proguard。它能够更快地缩减代码,同时改善输出大小。这篇文章Android代码压缩工具R8详解 还总结了具体的优化数据。
R8前
R8从gradle3.3开始引入,gradle 3.4及之后默认开启。若想在gradle3.3版本下开启R8,gradle.properties里添加以下配置:
android.enableR8 = false
复制代码
在上述优化完成后,通过脚本的循环测试,编译速度提高50%,并且还有优化空间。
阶段 | 优化前 | 优化后 |
---|---|---|
clean build耗时 | 180s-200s | 90-100s |
之因此使用clean编译是为了模拟全量编译的场景,若是不使用clean指令,一次编译时间在半分钟之内。