做者:Ailurus
连接:https://www.zhihu.com/question/27953288/answer/118031242
来源:知乎
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
html
至于加快编译速度,有一句说一句,我觉着一些答主的答案适用性都并不强,其实仍是应该从 gradle 入手,讲的有什么不合适的地方,还请轻喷,有什么问题也能够留言。java
如下我讲到的全部步骤,推荐都在终端里执行。在终端里执行编译有不少好处:android
先说一下 gradle 的生命周期吧,gradle 构建一个工程主要分为三部分(彻底掌握了下面这张图,整个 gradle 的构建过程能了解个十之七八了):git
compileDebugJavaWithJavac/compileReleaseJavaWithJavac和 将 class 合并成 dex
transformClassesWithDexForDebug/transformClassesWithDexForRelease这两步很耗时,第一步还好,第二步会耗时很是久。首先在 gradle.properties 里设置
org.gradle.jvmargs=-Xmx4096m //越大越好,而后在工程的 build.gradle 里的 android 结点下增长 dexOptions 配置,以下:
dexOptions { dexInProcess true preDexLibraries true javaMaxHeapSize "4g"//越大越好 incremental true }
明确了 gradle 的生命周期,那么就能够看到加快编译速度的关键就是从第三步入手,固然,减小 setting.gradle 里的 modules 数量这一步也是必须的。下面说说咱们公司的实践吧。github
上面讲到的几点,现有环境就能够作到的大概是这样(有一点要特别注意,若是工程里有交叉依赖,必定不要使用 --parallel 参数):微信
gradle assembleDebug --daemon --parallel -x lint -x test
,若是是要直接安装到设备上的话,就把 assembleDebug 换成 installDebug ,assembleDebug 能够简写为 asD ,installDebug 能够简写为 iD 。jvm
最后讲一下,为何减小 setting.gradle 里的 module 数量,确实能够加快编译,可是却限制颇多呢?
首先,咱们想一下整个编译过程,先去解析 gradle 配置,创建 tasks 依赖有向图,而后再去执行每个 module 的 task ,若是咱们经过 maven 依赖,使用 aar 替掉了 module(单指 android library),若是咱们要改这个 module 里的文件,岂不是每次都要修改上传再下载,这其实还好,可是有一个致命的问题:不修改版本号的话,SNAPSHOT 在 IDEA 里常常会很差使。这样就致使修改的东西会不生效,去解决这个问题是很是耗费时间的。不过有一种方式,能够必定程度上解决问题,增长下面的脚本:maven
project.configurations.all(new Action<Configuration>() { @Override void execute(Configuration files) { files.resolutionStrategy.cacheDynamicVersionsFor(5, TimeUnit.MINUTES) files.resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS) } })
那有人会问,插件化里,每一个人开发一个模块,对于每一个模块的维护不也是要打包上传到 maven ,每次一有修改,哪怕是很是微小的修改,也要作一次上传,一样会遇到 SNAPSHOT 很差使的问题。嘿嘿,这个问题嘛,我司本身维护了一个 gradle 插件,已经解决了,至于解决方案,是公司机密,我是不会讲的。
而后,还有一点,我相信大部分开发者日常开发都是单 module 的,多 module 的状况并很少,所以大多数依赖基本也都是 aar 或者 jar ,根本就不存在所谓的将 library 转成 aar 上传的状况,所以一些答主说的根本毫无心义,这也是为何我会说影响编译速度的状况主要集中在 gradle 生命周期的第三个阶段,至于第三个阶段的优化,看我上面的答案就行了。ide