Google I/O 2017已经过去几周了,相信大家都参与了这次会议的许多专场。
本届I/O的一个具有实际意义的话题是How to speed up your slow Gradle builds。在该专场会议上,Android Studio的工具团队向大家推荐了10条非常有用的建议用来加快gradle的构建速度。
个人决定把这些建议整理成一个方便使用的列表,分享如下:
免责声明:这些建议并非个人提出,而是整理自IO会议专题:How to speed up your slow Gradle builds,关于这些建议的解释则是个人的措辞。
这一切要归功于Google及其工具团队。
Tip1-使用最新的Android Gradle插件
Android Studio的工具团队经常更新Android Gradle插件来提升其构建速度,采纳这一点也超级容易,使用最新的插件版本即可。
buildscript {
repositories {
google()
}
dependencies {
classpath ‘com.android.tools.build.gradle:3.0.0-alpha3’
}
}
Tip2-避免在minSdkVersion<21时使用Multidex
如果你还不清楚Multidex是什么,那么可以先读一下这篇文章。
原生的Multidex在API 21及其以上的设备上运行时对性能的影响非常小,但是使用Multidex + minSdkVersion<21(这里译者理解是使用分包兼容库)的情况下则对性能则影响较大。
当开发一个App时,应当避免使用Multidex兼容包方式。
这就需要将App的minSdkVersion设置为21并且设备至少为API 21或以上。
好消息是如果使用的是新版本的Android Studio,它会帮开发者设置好minSdkVersion,所以开发者需要做的仅仅是点击Run按钮而已。
Tip3-禁用multi-APK(开发中)
如果App没有使用多ABI或多密度支持,可以跳过这一条。
如果使用的话,在开发测试的构建过程中应当禁用它,因为它延长了构建时间。
实现方式为在Gradle中添加一个变量,在devBuild时,通过该变量来实现禁用:
android {
if (project.hasProperty(‘devBuild’)){
splits.abi.enable = false
splits.density.enable = false
}
}
当使用命令行方式构建:
./gradlew assembleDevelopmentDebug -PdevBuild
当使用Android Studio构建可做以下配置:
打开Preferences -> Build, Execution, Deployment -> Compiler,再Command-line选项后填写-PdevBuild,如下图所示:
Tip4-减少包含的资源
资源占据了APK大小的很大一部分,同时打包这些资源会降低构建速度。
对于开发构建,可以告诉Gradle仅仅打包关心的一部分资源,如仅针对开发测试设备分辨率的资源。
productFlavors {
development {
minSdkVersion 21
//only package english translations, and xxhdpi resources
resConfigs (“en”, “xxhdpi”)
}
}
Tip5-禁止PNG优化
PNG的优化默认是允许的,但是在开发测试构建时则是非必须的,因此可以禁止它来加速构建。
android {
if (project.hasProperty(‘devBuild’)){
aaptOptions.cruncherEnabled = false
}
}
Tip6-使用Instant Run
Instant Run曾有一点不太好用,但它正常使用时真的可以节省很多时间。
Instant Run在Android Studio 3.0上做了很多改进,而且会更加稳定。
去试试!
Tip7-避免无意的修改
Gradle非常灵活,允许你在构建脚本里做一些非常酷的事情,但是一旦不小心则可能降低构建的速度。
下面这段脚本将versionCode设置为当前时间——这对于测试非常有用,但这意味着每一次构建,配置都会变化从而引起不必要的处理操作。
//this is BAD!
def buildDateTime = new Date().format(‘yyMMddHHmm’).toInteger()
android {
defaultConfig {
versionCode buildDateTime
}
}
一种好的做法是在开发测试时,禁用动态赋值:
def buildDateTime = project.hasProperty(‘devBuild’) ? 100 : new Date().format(‘yyMMddHHmm’).toInteger()
android {
defaultConfig {
versionCode buildDateTime
}
}
我们应当确保自定义逻辑、插件以及库文件仅在必要的时候才修改,而不是每一次构建时都要修改。
另一个常见的坑是Crashlytics的Build Id,Crashlytics每次构建时都会生成一个新的Id。
在debug构建过程中,这种行为可以(而且应该)禁止,解决方法如下添加一行脚本:
apply plugin: ‘io.fabric’
android {
buildTypes {
debug {
ext.alwaysUpdateBuildId = false
}
}
}
Tip8-不要使用动态依赖版本
不要使用动态依赖的原因如下:
- 构建过程具有不确定性
- Gradle会每24小时检查一次新的依赖版本从而增加依赖解析时间
最好总是使用特定的依赖版本!
Tip9-注意内存
注意分配给Gradle的内存大小。
对于Gradle内存分配的设置以及Dex In Process的解释,可以阅读Reto Meier的这篇文章。
一个给Gradle分配内存的示例如下:
org.gradle.jvmargs=-Xmx1536m
自从Dex In Process发布,老的优化配置已不再需要:
dexOptions {
javaMaxHeapSize = ‘4g’
}
Tip10-使用Gradle缓存
Gradle缓存是Gradle 3.5的新特性,当缓存开启时,Gradle将缓存并重用之前构建的结果。
它适用于任何构建,任何分支更改,甚至是跨项目。
Android Studio 3.0使用了很多缓存功能,因此要保证缓存功能开启:
# Set this in gradle.properties
org.gradle.caching=true
原文地址:How to speed up your slow Gradle builds