本地构建的时候一次须要比较长的时间,存在优化空间。可使用 --profile
参数来分析构建过程当中各个任务的耗时状况,好比 ./gradlew assembleDebug --profile
html
本文基于的硬件条件:java
./gradlew assembleDebug --profile
android
增量编译:缓存
首次编译(无缓存):微信
开发时的 Gradle 构建优化比较有意义,构建测试包、正式包的时候并不须要那么关注构建时间。能够将开发时的构建与提测构建分离,新建一个本地开发用的 productFlavor - local
,本地开发时只构建 local
包,在本地开发构建过程当中禁用掉没必要要的任务(好比 lint, multidex, optimization 等),减小构建时间。jvm
https://developer.android.com/studio/build/multidex#multidexkeepproguardide
新建一个 local 的 productFlavor,设置 minSdkVersion 为 21,这样就会启用 pre-dexing 构建功能(仅适用于 Android 5.0+),可以加快打包速度,改动以下:工具
/res/drawable
目录下图片的优化Android 构建工具默认会对 drawable 下的图片进行优化,好比图片压缩转换,校验等,这个过程是比较耗时的,尤为是当图片比较多的时候。改动以下:post
android.dexOptions 的配置优化测试
一些比较老的文章还会推荐 dexOptions.incremental
,这是不必的,在 Gradle 2.1.0-rc1 (2016-04-22) 以后,incremental 增量构建已经默认启用了,再也不须要显式声明。 此外,dexOptions.jumboMode
参数也是可选的,在启用 instant-run 时这个参数会默认启用
Gradle 在构建时都会去拉依赖,顺序是:本地缓存 -> 远程依赖。若是使用了动态版本,那么每次 Gradle 都会拉最新的依赖,在依赖多的状况下是很是耗时的,从下面这张图能够看出(挖财宝):
从上图中能够看出,光是拉依赖就用了 3 分钟,这都还没到编译阶段,难怪打个包要六七八分钟。。。
在 Gradle 中,最好固定依赖的版本号,这样就不会每次编译都从新拉依赖,可是在目前快速迭代的背景下,通常都是锁死第一位,第二位和第三位版本号自动更新,也无法锁死依赖,只能把以前 resolutionStrategy 改一下,使用 Gradle 默认的动态版本号缓存策略(Gradle 的动态版本也会有缓存滴),改动以下:
改动以后的效果分析以下,拉依赖的时间从 3min 变成了 20s 左右,效果明显。
可是这种状况下,若是 snapshot 版本的依赖更新了,可能不会及时自动更新到本地(由于缓存),不过 Gradle 支持 --refresh-dependencies
参数,使用 ./gradlew assembleLocalDebug --refresh-dependencies
会全量刷新依赖。
Gradle 是基于 JVM 的构建系统,JVM 的启动和初始化须要时间,开启 Gradle Daemon 守护进程能够节省这些时间
一次 Gradle 编译大概由这几部分组成:初始化、加载 setting.gradle(|| setting.gradle.kts)、加载各个模块的 build.gradle(|| build.gradle.kts)、执行一系列任务。从上图中能够看到,Configuring Projects 也是花了 5s 左右的时间,使用 org.gradle.configureondemand=true
能够加速这一过程。
启用 Gradle 并行编译,加速编译过程
设置 Gradle 编译时使用的最大内存,大一点比较好,可是个人小本本内存只有 8G,有心无力。。。 使用大内存时 Android 编译过程当中的 dexing 就不会单独开进程进行,能节省构建时间。
启用 Android 编译构建缓存,此举能极大提高构建效率,推荐! 可是我司由于统跳编译插件不支持编译缓存,所以只能禁用。
综上所述,挖财宝中启用的开发时构建优化措施有:
/res/drawable
目录下图片的优化优化后使用 ./gradlew assembleLocalDebug
生成开发包,或者使用 ./gradlew installLocalDebug
直接安装。 提测时使用 offcialDebug
或者 qqDebug
都可。打生产包时使用 offcialRelease
或者 qqRelease
。
优化以后的效果以下图所示,增量编译通常能够控制在 2min 之内
增量编译:
首次编译(无缓存):
--profile
参数进行分析,分析报告在 build/reports/profile/
目录下