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

痛點(diǎn)
如果項(xiàng)目的代碼庫(kù)較大,例如大型的安卓開發(fā)項(xiàng)目,在構(gòu)建的時(shí)候耗時(shí)較長(zhǎng),達(dá)到數(shù)十分鐘甚至更長(zhǎng),分析其原因,其中一部分時(shí)間是花在構(gòu)建上。在大規(guī)模開發(fā)團(tuán)隊(duì)中,例如上百人的開發(fā)團(tuán)隊(duì),如果每個(gè)人構(gòu)建一次需要花費(fèi)數(shù)十分鐘,那么團(tuán)隊(duì)每天浪費(fèi)的時(shí)間是非常驚人的。
除了構(gòu)建時(shí)間,執(zhí)行 Gradle Build 的時(shí)候很大一部分時(shí)間是花在單元測(cè)試用例的執(zhí)行上,這樣的問(wèn)題也困擾著大規(guī)模 Gradle 的用戶。

在都勻等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,成都全網(wǎng)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,都勻網(wǎng)站建設(shè)費(fèi)用合理。

方案
為了讓構(gòu)建提升速度,Gradle 4.0 以上版本提供了Build Cache 的功能,也就是構(gòu)建緩存。注意,這里的構(gòu)建指的不是構(gòu)建產(chǎn)出物,例如 war,jar 文件,而是 Java 構(gòu)建的字節(jié)碼 .class文件。通過(guò)緩存每次構(gòu)建產(chǎn)生的.class 文件,實(shí)現(xiàn) Java 項(xiàng)目的增量編譯。Gradle 項(xiàng)目能夠在第一次構(gòu)建之后,創(chuàng)建一個(gè) Key-value 的鍵值對(duì)數(shù)據(jù),將每個(gè).class 文件通過(guò)一個(gè) key 索引起來(lái)。而這些鍵值對(duì)以及.class 文件會(huì)上傳到一個(gè)中央服務(wù)器(例如 Nginx 或者 JFrog Artifactory),當(dāng)用戶再次構(gòu)建,或者其他成員構(gòu)建時(shí),會(huì)先將中央服務(wù)器的緩存文件下載到本地,再進(jìn)行打包,這樣就能大大減少編譯構(gòu)建時(shí)間,實(shí)現(xiàn)增量編譯。

注意,這里不僅僅能夠緩存軟件程序的.class 文件,對(duì)應(yīng)單元測(cè)試用例編譯產(chǎn)生的.class 文件同樣能夠緩存。

這里以開源版 Artifactory 為例,結(jié)合 Gradle 實(shí)現(xiàn)增量編譯:
你的安卓項(xiàng)目編譯要花 10 分鐘,如何縮短到 1 分鐘?

?創(chuàng)建一個(gè)示例項(xiàng)目“gradle-cache-example”
在這個(gè) Java 工程里只需要?jiǎng)?chuàng)建一些普通的 Java 類即可,后面我們將驗(yàn)證如何將這段代碼對(duì)應(yīng)的 class 緩存起來(lái),節(jié)約構(gòu)建時(shí)間。
為設(shè)置構(gòu)建緩存前執(zhí)行構(gòu)建:./gradlew clean build
BUILD SUCCESSFUL in 11s
13 actionable tasks: 12 executed, 1 up-to-date

可以看到構(gòu)建耗時(shí) 12 秒。

?在本地搭建開源版 Artifactory 作為構(gòu)建緩存中央服務(wù)器。搭建開源版 Artifactory 最方便的方式是用容器啟動(dòng):

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

?設(shè)置構(gòu)建緩存
在開發(fā)本地的工程文件中的 gradle.properties中設(shè)置如下配置,將構(gòu)建緩存指向 Artifactory。

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

設(shè)置 CI 服務(wù)器上的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 服務(wù)器上執(zhí)行 ./gradlew clean build -Pgradle.cache.push=true。通過(guò)設(shè)置gradle.cache.push=true,實(shí)現(xiàn)本地構(gòu)建緩存向中央服務(wù)器的推送。
BUILD SUCCESSFUL in 1s
13 actionable tasks: 7 executed, 5 from cache, 1 up-to-date
可以看到構(gòu)建時(shí)間從 12 秒縮短到 1 秒,其中 5 個(gè)任務(wù)是來(lái)自緩存。

來(lái)確認(rèn)下我們的構(gòu)建加速并不是來(lái)自本地緩存,可以查看 Artifactory 的訪問(wèn)日志:

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

可以看到本地緩存,均來(lái)自 Artifactory 的統(tǒng)一倉(cāng)庫(kù)。

?跨部門,地域共享構(gòu)建緩存

在大型分布式研發(fā)團(tuán)隊(duì)里,構(gòu)建環(huán)境往往分布在各個(gè)地域,例如北京,上海。在這種情況下,構(gòu)建緩存上傳到本地的 Artifactory 之后,并不能夠被遠(yuǎn)程的構(gòu)建服務(wù)器使用。這是需要用到 Artifactory 企業(yè)版的文件實(shí)時(shí)復(fù)制功能實(shí)現(xiàn)。
你的安卓項(xiàng)目編譯要花 10 分鐘,如何縮短到 1 分鐘?

如上圖所示:當(dāng)本地開發(fā)者或者 CI 服務(wù)器執(zhí)行第一次構(gòu)建時(shí),Artifactory 會(huì)通過(guò) Push Replication(推送復(fù)制)的方式將本地的緩存推送到遠(yuǎn)程的 Artifactory,當(dāng)遠(yuǎn)程的用戶在執(zhí)行 Gradle 構(gòu)建時(shí),能夠受益于已有的構(gòu)建緩存,從而大大加速構(gòu)建的速度。

總結(jié)
本文展示并說(shuō)明了如何使用 Gradle和 Artifactory 開源版進(jìn)行構(gòu)建緩存的實(shí)現(xiàn),提升構(gòu)建速度。使用 Artifactory 企業(yè)版,能夠?qū)崿F(xiàn)跨地域的構(gòu)建緩存共享,優(yōu)化公司級(jí)別的構(gòu)建速度。

文章標(biāo)題:你的安卓項(xiàng)目編譯要花10分鐘,如何縮短到1分鐘?
URL地址:http://muchs.cn/article32/ihpgsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航域名注冊(cè)、做網(wǎng)站、商城網(wǎng)站網(wǎng)站改版、網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)