如何加快Gradle的构建速度

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’
 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

当使用命令行方式构建:

./gradlew assembleDevelopmentDebug -PdevBuild
  • 1

当使用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”)
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Tip5-禁止PNG优化

PNG的优化默认是允许的,但是在开发测试构建时则是非必须的,因此可以禁止它来加速构建。

android {
  if (project.hasProperty(‘devBuild’)){
    aaptOptions.cruncherEnabled = false
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5

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
 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

一种好的做法是在开发测试时,禁用动态赋值:

def buildDateTime = project.hasProperty(‘devBuild’) ? 100 : new Date().format(‘yyMMddHHmm’).toInteger()
android {
  defaultConfig {
    versionCode buildDateTime
 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我们应当确保自定义逻辑、插件以及库文件仅在必要的时候才修改,而不是每一次构建时都要修改。

另一个常见的坑是Crashlytics的Build Id,Crashlytics每次构建时都会生成一个新的Id。

在debug构建过程中,这种行为可以(而且应该)禁止,解决方法如下添加一行脚本:

apply plugin: ‘io.fabric’
android {
  buildTypes {
    debug {
      ext.alwaysUpdateBuildId = false
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Tip8-不要使用动态依赖版本

不要使用动态依赖的原因如下:

  • 构建过程具有不确定性
  • Gradle会每24小时检查一次新的依赖版本从而增加依赖解析时间

最好总是使用特定的依赖版本!

Tip9-注意内存

注意分配给Gradle的内存大小。

对于Gradle内存分配的设置以及Dex In Process的解释,可以阅读Reto Meier的这篇文章

一个给Gradle分配内存的示例如下:

org.gradle.jvmargs=-Xmx1536m
  • 1

自从Dex In Process发布,老的优化配置已不再需要:

dexOptions {
 javaMaxHeapSize = ‘4g’
}
  • 1
  • 2
  • 3

Tip10-使用Gradle缓存

Gradle缓存是Gradle 3.5的新特性,当缓存开启时,Gradle将缓存并重用之前构建的结果。

它适用于任何构建,任何分支更改,甚至是跨项目。

Android Studio 3.0使用了很多缓存功能,因此要保证缓存功能开启:

# Set this in gradle.properties
org.gradle.caching=true
  • 1
  • 2

原文地址:How to speed up your slow Gradle builds

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值