结合Kotlin使用Gradle build cache

在2017年4月,Gradle发布了build cache的beta版本。构建缓存与不断增长的构建特性相互补充。Gradle 4.0版本中,构建缓存已经准备好

build cache 允许Gradle复用之前任务调度的输出,其中包括其它机器上的输出。Kotlin 1.2.21 允许Kotlin工程使用build caching。

构建缓存(build cache)的工作原理是:在缓存中存储已编译的类、测试输出和其他构建构件,同时考虑所有的任务输入,包括输入文件内容、相关类路径和任务配置。


这样的话android studio构建会更快。下面的图表分别显示了Gradle持续集成时使用构建缓存和不使用构建缓存两种情况下的聚合的构建时间:

在本文我们将会讨论如何使用build cache来避免不必要的Kotlin编译来提高构建速度。

Spek的快速demo

按照下面的步骤,你现在就可以使用build cache了:

Clone Spek

git clone https://github.com/spekframework/spek.git
cd spek

分支2.x(默认分支)已经有了所有的prerequisites for build caching,这些我们后面再讨论。

构建和填入缓存(Build and populate cache)

下面的代码将会构建Spek并且填入本地的build cache。

❯ ./gradlew assemble --build-cache
 
BUILD SUCCESSFUL in 10s
21 actionable tasks: 21 executed

使用--build-cache标记是告诉Gradle将输出保存到一个隔离的输出栈缓存中的其中一种方式。

移除/更改构建输出

这模拟在另一台机器上,或者可能做出改变并将其stash。最快捷的演示方法是使用clean task。

❯ ./gradlew clean

从构建缓存中重新构建和解析

这一次,当我们重新构建时,所有Kotlin编译的资源都是从构建缓存中提取出来的。

❯ ./gradlew assemble --build-cache
 
BUILD SUCCESSFUL in 2s
21 actionable tasks: 11 executed, 10 from cache

瞧!您只是使用了Gradle的构建缓存来重用Kotlin编译的类,而不是重新编译!建造速度大约是5倍快!

从这个构建扫描中可以看到,Kotlin编译任务是从构建缓存中提取出来的;:jar:processResources任务不是从缓存中获取因为在本地生成jar和复制文件比从缓存中提取更快。注意,:test缓存也是支持的。

当一个CI实例填充共享的构建缓存(开发人员可以从中提取)时,Gradle构建缓存尤其高效。这里有实现这一目标的更多资源的链接。

在项目中开启构建缓存(build cache)

我希望你在项目中试下构建缓存,可以遵循下面的步骤来开启构建缓存。

第一,保证Gradle版本是4.3或者以上,这样的话Kotlin Gradle插件能选择使用新的APIs。使用Gradle wrapper可以轻松更新Gradle。

第二,保证Kotlin版本是1.2.20或者以上。在根目录下的build.gradle文件的buildscript {}模块中加上这样的代码:

dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.21"
}

第三,我们要告诉Gradle我们要使用build cache,这有三种方法:

  1. 只对当前的构建开启,构建命令加上参数--build-cache即可。
  2. 只对当前工程开启,在文件$PROJECT_ROOT/gradle.properties中添加org.gradle.caching=true
  3. 对当前用户的所有构建都开启,在文件$GRADLE_HOME/gradle.properties中添加org.gradle.caching=true

注意: 即使设置了android.enableBuildCache=true,开发者仍然需要做上面的事情,因为Gradle的构建缓存和Android的构建缓存是相互独立的。

我们可以选择性地利用IDE的构建缓存,将运行和测试操作委托给Gradle。

在IntelliJ中开启构建缓存

如果你要IntelliJ执行Gradle任务的话,那么要将IED设置中的的“Delegate IDE build/run actions to Gradle”开启来发挥构建缓存的优势。

注意: Android Studio默认做了这个东西。

缓存kapt任务

目前默认情况下,对于kapt的缓存是禁用的,即使是使用-build-cache,因为Gradle没法为注解处理器映射输入和输出。通过在kapt配置中设置useBuildCache,您可以显式地启用Kotlin注解处理任务的构建缓存。

kapt {
  useBuildCache = true
}

深入阅读

您可以通过这些资源了解更多关于利用Gradle构建缓存的知识:

结论

使用1.2.20版本及以上的kotlin-gradle-plugin编译Kotlin代码的话我们可以发挥Gradle的构建缓存的优势来加速项目的开发周期。关于扩展支持构建缓存任务的工作会持续进行。

继续前进!



翻译自原文: Using Gradle build cache with Kotlin,感觉翻译的很不好,请批评指正😂。

参考文献:
1. Speed up your Build with Gradle Remote Build Cache

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,050评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,802评论 6 342
  • 小城市真的安静的特别早。 晚上一个人骑自行车总是习惯音量开到很大,大到根本听不到外界的声音。就这样一直骑着骑着。 ...
    城市花大姐阅读 572评论 0 49
  • 1. apply() apply()调用一个方法,其具有一个指定的this值,以及作为一个数组(或类似于数组的参数...
    贺贺v5阅读 2,174评论 0 3