Kotlin 1.2.21 允许 Kotlin 项目使用构建缓存, 通过 Gradle 的构建缓存功能, 可以提升 Kotlin 代码的编译速度, 加快开发周期本文将结合实际例子, 介绍利用 Gradle 加速 Kotlin 代码编译的原理配置示例以及在 IDE 中的使用方法
原理
构建缓存的工作原理是在缓存中存储编译过的类测试结果和其它构建工序, 同时记录所有的任务输入, 包括输入文件内容相关的类路径和任务配置其模型如下图所示:
下面的图标展示了在 Gradle 的持续集成中使用构建缓存和不使用构建缓存所收集到的构建时间
示例
你现在就可以尝试使用 Gradle 的构建缓存只需要遵循下面几个步骤:
1,Clone Spek
使用以下命令 clone Spek.
- git clone https://github.com/spekframework/spek.git
- cd spek
Spek 2.x 分支 (其默认分支) 已经有我们后续要介绍的 构建缓存的所有先决条件
2, 构建和填充缓存
下面的命令会构建 Spek 并填充本地构建缓存
- ./gradlew assemble --build-cache
- BUILD SUCCESSFUL in 10s
- 21 actionable tasks: 21 executed
使用 build-cache 标识, 可以让 Gradle 在一个独立的任务结果缓存中存储任务结果
3, 删除 / 更改构建结果
这模拟了在另一台机器上的情况或者做了一次改变并 stash(存储)这次改变的情况演示的最快方法是使用 clean 任务
4, 从构建缓存中重新构建
当我们重新构建时, 从构建缓存中拉取所有编译过的 Kotlin 源码
- ./gradlew assemble --build-cache
- BUILD SUCCESSFUL in 2s
- 21 actionable tasks: 11 executed, 10 from cache
到此就配置完成了, 通过使用 Gradle 的构建缓存, 你重用了编译过的 Kotlin 类, 而不是又重新编译! 构建速度差不多快了 5 倍! 可以看到, Kotlin 编译任务从构建缓存中拉取缓存结果; 而: jar 和: processResources 任务没有从缓存中拉取, 因为它们本地生成 JAR 包和复制文件的速度比从缓存中拉取缓存结果的速度更快另外 Gradle 构建缓存也支持缓存: test 任务当持续集成的一个实例填充了一个 共享的构建缓存 (开发者可以从中拉取) 时, Gradle 构建缓存会特别有效下文罗列了实现这点的 更多资源的链接
老项目如何使用
首先, 你需要确保正在使用 Gradle 4.3 或者更高版本, 这样才能选择 Kotlin Gradle Plugin 来使用新的 Gradle APIs 你可以方便地使用 Gradle wrapper 升级 Gradle
然后, 你需要确保正在使用 Kotlin 1.2.20 或更高版本来进行编译你在自己的构建脚本 build.gradle 中的 buildscript {}块中配置类似如下的声明:
- dependencies {
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.21"
- }
然后, 我们需要让 Gradle 使用构建缓存有 3 种启用构建缓存的方法:
在命令行中使用 build-cache 来为当前构建启用构建缓存
在 $PROJECT_ROOT/gradle.properties 中增加 org.gradle.caching=true 来为整个项目启用构建缓存
在 $GRADLE_HOME/gradle.properties 中增加 org.gradle.caching=true 来为当前用户的所有构建启用构建缓存
注意: Android 开发者即使设置了 android.enableBuildCache=true, 也仍需要按照上述方法启用构建缓存, 因为 Gradle 的构建缓存是独立于 Android 的构建缓存的
我们可以选择通过将 run 和 test actions 委派给 Gradle 的方式, 来利用 IDE 的构建缓存
在 IntelliJ 中启用构建缓存
如果你使用 IntelliJ 来执行 Gradle actions, 你需要在 IDE 配置中勾选 Delegate IDE build/run actions to Gradle(将 IDE 构建 / 运行动作委派给 Gradle), 从而在 IntelliJ 中构建和运行测试时利用构建缓存
缓存 kapt 任务
目前即使使用 build-cache, 针对 kapt 的缓存也默认是禁用的, 因为 Gradle 还没有一种方法来映射注解处理器的输入和输出你可以通过在 kapt 配置中将 useBuildCache 设置为 true 来明确启用针对 Kotlin 注解处理任务的构建缓存
- kapt {
- useBuildCache = true
- }
参考:
你可以通过下列资源来了解更多关于利用 Gradle 构建缓存的信息:
- https://docs.gradle.org/current/userguide/build_cache.html#sec:build_cache_configure
- https://docs.gradle.org/current/userguide/build_cache.html#sec:build_cache_configure_remote
- https://guides.gradle.org/using-build-cache/#debugging_and_diagnosing_cache_misses
- https://docs.gradle.org/current/userguide/build_cache.html#sec:task_output_caching_details
来源: http://blog.csdn.net/xiangzhihong8/article/details/79342866