Gradle学习(十)——构建缓存

原创 2018年01月02日 17:45:27

转载请注明出处:http://blog.csdn.net/lastsweetop/article/details/78954076

简介

Gradle的构建缓存是一种缓存机制,目的是为了通过重用上一次构建的输出来节省构建时间。构建缓存机制把构建的输出存储在本地或者远程,当确认本次构建的输入没有改变那么它将会使用构建的缓存作为输出。

构建缓存的第一个功能是任务输出缓存,任务输出和up-to-date检查本质上一样的原理,不同的是up-to-date检查仅仅局限于相同的工作空间,而任务输出缓存可以使用本机的任何地方的的构建,当任务输出缓存使用共享的构建缓存时,还可以运行在不同机器之间。

启用构建缓存

默认情况下,构建缓存是没有启用的,有两种方法可以启用构建缓存:

  • 构建的命令行下增加--build-cache选项,但要注意只是本次生效。
  • gradle.properties文件中设置org.gradle.caching=true,这样就可以每次生效,除非命令行下带了--no-build-cache选项

任务输出缓存

除了增量构建外,Gradle还能通过重用任务的输出来节省构建时间,任务输出不仅可以在同一台电脑的不同构建之间重用,还可以通过构建缓存在不同电脑之间重用。

有个典型的用例,用户公司内部有个由定期的持续集成产生的构建缓存,开发者或者其他持续集成带来可以从这个构建缓存实体去拉取缓存实体。我们期望所有的开发者都没有权利去填充构建缓存,每个持续集成也需要在clean任务之后才可以填充构建缓存。

如果想要任务输出缓存更好的工作,最好和增量构建插件一起使用,例如连续执行两次构建,所有任务的输出应该是UP-TO-DATE,如果想获得更快的构建,只有任务输出缓存是远远不够的。

示例

我们用带有java插件的java工程来演示,首先第一次执行命令gradle --build-cache compileJava,输出如下:

Build cache is an incubating feature.

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

为了不用到增量构建,先来清除一下gradle clean,输出如下:

Build cache is an incubating feature.

BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed

然后重复第一步gradle --build-cache assemble,输出如下:

Build cache is an incubating feature.

BUILD SUCCESSFUL in 1s
2 actionable tasks: 1 executed, 1 from cache

可以看到只执行了一个任务,还有一个任务是来自于缓存,由于新版gradle的控制台输出,无法看到更详细的信息,但在scan或者IDE下可以看到从缓存中取的是compileJava任务,因为assemble对应的jar任务没有缓存,只有执行。即使再次clean,重新执行一次第三步结果也是一样,因为jar任务并不会被缓存。

可缓存的任务

一旦任务可以描述所有的输入输出,那么gradle就可以基于任务的输入来计算一个构建缓存的key来唯一确定输出,这个key可以被用于请求构建缓存中之前的输出,也可以把新的输出填充到构建缓存中,如果之前的构建已经被其他人填充,比如其他的持续集成服务器或者其他开发者,你就没必要再进行一次构建。

下面以up-to-date检查相同的方式来为任务生成构建缓存key:

  • 任务的类型和classpath
  • 输出属性的名字
  • 自定义任务类型注解属性的名字和值
  • 用DSL通过TaskInputs增加的属性的名字和值
  • Gradle的distribution,buildSrc和plugins的classpath
  • 影响任务执行的构建脚本的内容

任务类型需要通过增加@CacheableTask注解来选择是否填充到构建缓存中,@CacheableTask是不能被继承的,自定义任务默认不能被缓存。

内置的可缓存任务

下面是一些内置的可缓存的任务

  • java工具链:JavaCompile,Javadoc
  • groovy工具链:GroovyCompile,Groovydoc
  • scala工具链:ScalaCompile,Scaladoc
  • Testing:Test
  • 代码质量任务:Checkstyle,CodeNarc,FindBugs,JDepend,Pmd
  • Jacoco:JacocoMerge,JacocoReport
  • 其他任务:ValidateTaskProperties,WriteProperties

native编译缓存

native编译工具链也可以缓存,将org.gradle.caching.native设置为true就可启用,比如CCompile和CppCompile

不可缓存的任务

所有其他的任务当前都是不可缓存的,未来可能提供其他语言或者其他领域的支持。还有一些任务,比如copy或者jar,仅仅是复制文件从一个地方到另一个地方,做成可缓存的也没多大意义。没有产生输出或者动作的任务也没有意义做成可缓存。

声明任务输入和输出

一个可以缓存的任务有完整的输入输出图很重要,以便构建的结果可以被其他地方安全的重用。

缺少任务输入可能引起不正确的缓存命中,因为两次构建拥有相同的构建缓存key而导致不同的输出结果被相同的对待。如果gradle不能万钻的捕获给定任务的所有输出,缺失构建输出也会导致构建失败。错误的定义输入也会导致无法命中缓存,比如输入中包含了不稳定的数据或者绝对路径。

为了保证输入输出被正确的定义,可以考虑集成测试,比如TestKit,它可以检查相同的输入是否会产生相同的输出,并且可以为任务捕获所有的输出文件,还要确定任务的输入是可复位的,比如在不同的构建目录下可以重用构建缓存。

配置构建缓存

你可以在settings.gradle中的Settings.buildCache(org.gradle.api.Action)代码块中来配置构建缓存

Gradle支持本地和远程构建缓存,它们可以分别配置。如果两者都是启用的,Gradle则会先去找本地的构建缓存,如果找不到再会去找远程的构建缓存。如果远程的构建缓存找到了,它就会在本地缓存中也存一份,下次本地的就会找到了。Gradle可以把构建输出push到任意构建缓存中,BuildCache.isPush()也会被设置成true。

默认情况下,本地构建缓存的push是启用的,远程的构建缓存的push是禁用的。本地构建缓存可以通过DirectoryBuildCache来进行预设值,默认push是启用的。远程构建缓存可以通过设置BuildCacheConfiguration.remote(java.lang.Class)来指定构建缓存的类型。

内置的本地构建缓存

内置的本地构建缓存DirectoryBuildCache,用一个目录来存储构建缓存的artifacts。默认情况下,他是放在用户的Gradle目录中,但是它的位置是可以配置的。

Gradle会定期的清除本地构建缓存使它减少到配置的大小,这意味着本地构建缓存可以在下一次清理前会大于配置的大小.

配置示例如下:

buildCache {
    local(DirectoryBuildCache) {
        directory = new File(rootDir, '.build-cache')
        targetSizeInMB = 1024
    }
}

远程的构建缓存

配置很容易:

buildCache {
    remote(HttpBuildCache) {
        url = 'https://example.com:8123/cache/'
    }
}

但是搭建远程构建缓存服务器需要企业版,暂时就不聊了,你懂得。。。。。。。。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android Studio 编译缓存(Build Cache)

编译缓存是 Android Studio 2.2 版本被引入的的一个功能,能够缓存项目中导入的 AAR、Libray,能够加快调试过程中的编译时间。新版本(2.3)在此基础上进一步优化,同时默认打开这...
  • CYL926
  • CYL926
  • 2017年03月08日 17:42
  • 2383

强制清除 gradle 依赖缓存

如果你正在开发一个库,并将它传上 jcenter 或者 jitpack,由于没上线,于是你一直上传 1.0 的版本,不停地覆盖远程仓库上的版本,但是你遗憾地发现本地的 gradle 出了问题,那么是由...
  • ziwang_
  • ziwang_
  • 2017年07月30日 15:01
  • 4061

修改Gradle缓存文件夹路径的5种方法

背景Android Studio的gradle在缓存处理上有时候会莫名其妙的出问题,必要时需要手动删除缓存,然后重新编译。有时也有出于其他考虑指定gradle缓存路径。一针见血的设置方法(本文采用)在...
  • yanzi1225627
  • yanzi1225627
  • 2016年07月25日 16:07
  • 25098

Android Studio 和 gradle 修改缓存文件夹路径

参考:http://blog.csdn.net/qiujuer/article/details/44160127 http://blog.csdn.net/qiujuer/article/detai...
  • xx326664162
  • xx326664162
  • 2016年07月25日 18:28
  • 9883

Gradle离线配置、.android、.AndroidStudio、.gradle、.m2缓存文件夹路径修改

Gradle离线配置,.android .AndroidStudio .gradle .m2 默认路径修改
  • u011562187
  • u011562187
  • 2017年08月24日 15:14
  • 927

Gradle离线配置

1. 先在Gradle官网下载最新的离线zip压缩包。 https://gradle.org/ 2. 将下载的zip压缩包,保存到本地磁盘下的目录中。 3. 修改(gradl...
  • ecjtuhq
  • ecjtuhq
  • 2016年11月30日 23:44
  • 3494

Gradle学习(十)——构建缓存

建缓存是一种缓存机制,目的是为了通过重用上一次构建的输出来节省构建时间。构建缓存机制把构建的输出存储在本地或者远程,当确认本次构建的输入没有改变那么它将会使用构建的缓存作为输出。构建缓存的第一个功能是...
  • lastsweetop
  • lastsweetop
  • 2018年01月02日 17:45
  • 394

Android Jenkins+Git+Gradle持续集成打包

在项目的上个版本,老大说将Android打包搞到服务器上,让所有人都可以享受打包的乐趣,接着就有了这篇文章~Jenkins自动打包,已经用了一段时间了,奈何前段时间陷入了王者峡谷,所以一直懒得写文章,...
  • clwwlc
  • clwwlc
  • 2017年08月15日 15:40
  • 680

gradle学习(21)-在eclipse中构建java项目

1.下载gradle for eclipse插件 根据前人文章找到的链接下载的,就不多说了。下载完成后,重启eclipse。 2.创建gradle项目 创建新项目的时候会发现多了一个gr...
  • qhshiniba
  • qhshiniba
  • 2015年01月14日 20:13
  • 6099

学习十九大的总结

一、两次活动记录      1、化学与材料科学学院邀请廊坊市出席党的十九大代表李金来教授为师生做十九大精神宣讲报告      2、今天上午,中国近代史老师在课上进行十九大内容解读...
  • chenhaiming123
  • chenhaiming123
  • 2017年11月30日 20:21
  • 1193
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gradle学习(十)——构建缓存
举报原因:
原因补充:

(最多只允许输入30个字)