結合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,這有三種方法:
- 只對當前的構建開啟,構建命令加上參數
--build-cache
即可。 - 只對當前工程開啟,在文件
$PROJECT_ROOT/gradle.properties
中添加org.gradle.caching=true
。 - 對當前用戶的所有構建都開啟,在文件
$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構建緩存的知識:
- Configuring the build cache
- Setting up a shared, remote build cache ⚡️
- Debugging build cache misses
- Developing cacheable custom tasks
結論
使用1.2.20版本及以上的kotlin-gradle-plugin
編譯Kotlin代碼的話我們可以發揮Gradle的構建緩存的優勢來加速項目的開發周期。關於擴展支持構建緩存任務的工作會持續進行。
繼續前進!
翻譯自原文: Using Gradle build cache with Kotlin,感覺翻譯的很不好,請批評指正😂。