如何加快Gradle的构建速度

Posted aspook

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何加快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’
 

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

以上是关于如何加快Gradle的构建速度的主要内容,如果未能解决你的问题,请参考以下文章

加快gradle构建速度

加快Gradle的构建速度

加快AS的Gradle Build速度

修改gradle中央仓库,加快jar包下载速度

如何在Kotlin中使用Gradle构建缓存?

Android studio加快编译速度