你的安卓項目編譯要花 10 分鐘,如何縮短到 1 分鐘?

痛點
若是項目的代碼庫較大,例如大型的安卓開發項目,在構建的時候耗時較長,達到數十分鐘甚至更長,分析其緣由,其中一部分時間是花在構建上。在大規模開發團隊中,例如上百人的開發團隊,若是每一個人構建一次須要花費數十分鐘,那麼團隊天天浪費的時間是很是驚人的。
除了構建時間,執行 Gradle Build 的時候很大一部分時間是花在單元測試用例的執行上,這樣的問題也困擾着大規模 Gradle 的用戶。web

方案
爲了讓構建提高速度,Gradle 4.0 以上版本提供了Build Cache 的功能,也就是構建緩存。注意,這裏的構建指的不是構建產出物,例如 war,jar 文件,而是 Java 構建的字節碼 .class文件。經過緩存每次構建產生的.class 文件,實現 Java 項目的增量編譯。Gradle 項目可以在第一次構建以後,建立一個 Key-value 的鍵值對數據,將每一個.class 文件經過一個 key 索引發來。而這些鍵值對以及.class 文件會上傳到一箇中央服務器(例如 Nginx 或者 JFrog Artifactory),當用戶再次構建,或者其餘成員構建時,會先將中央服務器的緩存文件下載到本地,再進行打包,這樣就能大大減小編譯構建時間,實現增量編譯。docker

注意,這裏不單單可以緩存軟件程序的.class 文件,對應單元測試用例編譯產生的.class 文件一樣可以緩存。api

這裏以開源版 Artifactory 爲例,結合 Gradle 實現增量編譯:
你的安卓項目編譯要花 10 分鐘,如何縮短到 1 分鐘?緩存

建立一個示例項目「gradle-cache-example」
在這個 Java 工程裏只須要建立一些普通的 Java 類便可,後面咱們將驗證如何將這段代碼對應的 class 緩存起來,節約構建時間。
爲設置構建緩存前執行構建:./gradlew clean build
BUILD SUCCESSFUL in 11s
13 actionable tasks: 12 executed, 1 up-to-date服務器

能夠看到構建耗時 12 秒。分佈式

在本地搭建開源版 Artifactory 做爲構建緩存中央服務器。搭建開源版 Artifactory 最方便的方式是用容器啓動:ide

docker run --name artifactory -d -p 8081:8081 docker.bintray.io/jfrog/artifactory-oss:latest單元測試

設置構建緩存
在開發本地的工程文件中的 gradle.properties中設置以下配置,將構建緩存指向 Artifactory。測試

gradle.properties
artifactory_user=admin
artifactory_password=password
artifactory_url=http://localhost:8081/artifactory
org.gradle.caching=true
gradle.cache.push=falsegradle

設置 CI 服務器上的settings.gradle,下面是 Jenkins 的腳本:
include "shared", "api", "services:webservice"
ext.isPush = getProperty('gradle.cache.push')
buildCache {
local {
enabled = false
}
remote(HttpBuildCache) {
url = "${artifactory_url}/gradle-cache-example/"
credentials {
username = "${artifactory_user}"
password = "${artifactory_password}"
}
push = isPush
}
}

在CI 服務器上執行 ./gradlew clean build -Pgradle.cache.push=true。經過設置gradle.cache.push=true,實現本地構建緩存向中央服務器的推送。
BUILD SUCCESSFUL in 1s
13 actionable tasks: 7 executed, 5 from cache, 1 up-to-date
能夠看到構建時間從 12 秒縮短到 1 秒,其中 5 個任務是來自緩存。

來確認下咱們的構建加速並非來自本地緩存,能夠查看 Artifactory 的訪問日誌:

20170526153341|3|REQUEST|127.0.0.1|admin|GET|/gradle-cache-example/6dc9bb4c16381e32ca1f600b3060616f|HTTP/1.1|200|1146
20170526153341|4|REQUEST|127.0.0.1|admin|GET|/gradle-cache-example/e5a67dca52dfaea60efd28654eb8ec97|HTTP/1.1|200|1296

能夠看到本地緩存,均來自 Artifactory 的統一倉庫。

跨部門,地域共享構建緩存

在大型分佈式研發團隊裏,構建環境每每分佈在各個地域,例如北京,上海。在這種狀況下,構建緩存上傳到本地的 Artifactory 以後,並不可以被遠程的構建服務器使用。這是須要用到 Artifactory 企業版的文件實時複製功能實現。
你的安卓項目編譯要花 10 分鐘,如何縮短到 1 分鐘?

如上圖所示:當本地開發者或者 CI 服務器執行第一次構建時,Artifactory 會經過 Push Replication(推送複製)的方式將本地的緩存推送到遠程的 Artifactory,當遠程的用戶在執行 Gradle 構建時,可以受益於已有的構建緩存,從而大大加速構建的速度。

總結本文展現並說明了如何使用 Gradle和 Artifactory 開源版進行構建緩存的實現,提高構建速度。使用 Artifactory 企業版,可以實現跨地域的構建緩存共享,優化公司級別的構建速度。

相關文章
相關標籤/搜索