你的安卓專案編譯要花 10 分鐘,如何縮短到 1 分鐘?
痛點
如果專案的程式碼庫較大,例如大型的安卓開發專案,在構建的時候耗時較長,達到數十分鐘甚至更長,分析其原因,其中一部分時間是花在構建上。在大規模開發團隊中,例如上百人的開發團隊,如果每個人構建一次需要花費數十分鐘,那麼團隊每天浪費的時間是非常驚人的。
除了構建時間,執行 Gradle Build 的時候很大一部分時間是花在單元測試用例的執行上,這樣的問題也困擾著大規模 Gradle 的使用者。
方案
為了讓構建提升速度, Gradle 4.0 以上版本提供了 Build Cache 的功能,也就是構建快取。注意,這裡的構建指的不是構建產出物,例如 war , jar 檔案,而是 Java 構建的位元組碼 .class 檔案。透過快取每次構建產生的 .class 檔案,實現 Java 專案的增量編譯。 Gradle 專案能夠在第一次構建之後,建立一個 Key-value 的鍵值對資料,將每個 .class 檔案透過一個 key 索引起來。而這些鍵值對以及 .class 檔案會上傳到一箇中央伺服器(例如 Nginx 或者 JFrog Artifactory ),當使用者再次構建,或者其他成員構建時,會先將中央伺服器的快取檔案下載到本地,再進行打包,這樣就能大大減少編譯構建時間,實現增量編譯。
注意,這裡不僅僅能夠快取軟體程式的 .class 檔案,對應單元測試用例編譯產生的 .class 檔案同樣能夠快取。
這裡以開源版 Artifactory 為例,結合 Gradle 實現增量編譯:
· 建立一個示例專案 “ 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 最方便的方式是用容器啟動:
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=
org.gradle.caching=true
gradle.cache.push=false
設定 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 企業版的檔案實時複製功能實現。
如上圖所示:當本地開發者或者 CI 伺服器執行第一次構建時, Artifactory 會透過 Push Replication (推送複製)的方式將本地的快取推送到遠端的 Artifactory ,當遠端的使用者在執行 Gradle 構建時,能夠受益於已有的構建快取,從而大大加速構建的速度。
總結
本文展示並說明了如何使用 Gradle 和 Artifactory 開源版進行構建快取的實現,提升構建速度。使用 Artifactory 企業版,能夠實現跨地域的構建快取共享,最佳化公司級別的構建速度。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69954434/viewspace-2670431/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle 前10分鐘 後10分鐘Oracle
- 1 分鐘讀完《10 分鐘學會 JavaScript 的 Async/Await》JavaScriptAI
- 一分鐘大幅度降低iOS專案編譯時間iOS編譯
- 10分鐘幫你搞懂GitGit
- [翻譯-Shiro]-10分鐘教會你Apache ShiroApache
- 收藏!836分鐘的谷歌機器學習教程,帶你10分鐘看完!—— Jinkey 原創谷歌機器學習
- 如何5分鐘跑起來一個完整專案?
- 10分鐘瞭解Android專案構建流程Android
- 10分鐘在 Rainbond 上部署 mall 電商專案AI
- 10 分鐘理解 ReduxRedux
- 【譯】30 分鐘入門 TypescriptTypeScript
- 【譯】2分鐘介紹Rx
- 10分鐘實現Typora(markdown)編輯器
- 三分鐘帶你入門瞭解openstack的Nova專案
- 三分鐘帶你入門瞭解openstack的cinder專案
- 三分鐘帶你入門瞭解openstack的glance專案
- 僅需10分鐘:開啟你的機器學習之路機器學習
- 3分鐘教會你如何釋出Qt程式QT
- Flutter 如何在10分鐘內快速的建立圖片編輯器Flutter
- [譯]這些Javascript方法幾分鐘內提升你的技能JavaScript
- 共享WiFi專案如何收益盈利?幾分鐘帶你瞭解這個藍海專案!WiFi
- 10分鐘教你理解反射反射
- Webpack 10分鐘入門Web
- JavaScript 10分鐘入門JavaScript
- 三分鐘帶你入門瞭解openstack的keystone專案
- 10分鐘掌握ConcurrentHashMap 3分鐘清楚和HashMap、Hashtable的區別HashMap
- 短影片一鍵分發平臺,3分鐘分發全平臺
- 【譯】十五分鐘,學習 WebpackWeb
- 10分鐘go crawler colly從入門到精通Go
- 1 分鐘,讓你的網站充滿吸引力!網站
- 神器!五分鐘完成大型爬蟲專案!爬蟲
- 泊松分佈和指數分佈:10分鐘教程
- 5分鐘讓你秒懂Docker!Docker
- 3 分鐘教你如何在 github 上精確的找開源專案?Github
- 【微信小程式專案實踐總結】30分鐘從陌生到熟悉微信小程式
- 10分鐘快速上手angular cdkAngular
- 10分鐘熟練使用webpackWeb
- 10分鐘快速入門RedisRedis