升級到 Android studio 3.0版本會使多Module工程的構(gòu)建速度加快很多击罪。不幸的是,這也帶來了Gradle 插件版本API的較大變化补君。本文將會詳細(xì)指出這個變化帶來的好處矿辽,并且指導(dǎo)讀者怎么去升級竞膳。
ps: Android plugin 3.0.0搭配Gradle 3.4版本以上
問題現(xiàn)狀
為了理解老版本Gradle plugin 2.0構(gòu)建系統(tǒng)的限制渗钉,這里假設(shè)有個工程使用了多層module依賴方式彤恶。請看下圖。
對于最底部的基礎(chǔ)module,其將會有兩種可能的變化:
1. Implementation 變化:不會改動本module對外暴露的接口声离。
2. Application binary interface (ABI) 變化:將會改變本module對外暴露的接口
本module指的是調(diào)用dependency的module
注意歇竟,所有需要重新編譯的module將會用紅色標(biāo)出。
Implementation 變化
當(dāng)本module依賴的ib(也可以是module)發(fā)生變化時抵恋,由于本module對外暴露的接口并不發(fā)生變化,在構(gòu)建工程時gradle將會只重新編譯本module宝磨,所有依賴于本module的module并不會發(fā)生編譯弧关。這種情況是沒什么問題的。如圖所示唤锉。
ABI變化
當(dāng)本module依賴的ib(也可以是module)發(fā)生變化時世囊,本module向外暴露的接口發(fā)生了變化,那么所有直接依賴于本module的module將不得不重新編譯窿祥。
接下來株憾,這些上層module可能通過其本身的接口對外暴露了底層module的部分內(nèi)容,即意味著本module暴露的接口也發(fā)生了變化晒衩,這會使得依賴于上層module的上上層module也需要重新編譯嗤瞎。這就導(dǎo)致了一個連鎖效應(yīng),因此听系,為了絕對的安全起見贝奇,gradle將不得不重新編譯整個工程,使得編譯時間變得較長靠胜。如圖所示掉瞳。
那么重點來了:一點代碼的改動可能會引起整個工程的重新編譯,這將是多么悲催浪漠,而實際上我們之前的gradle插件2.0版本系列的確如此陕习,根本原因就是gradle壓根不知道暴露的接口可以通過一個接一個的依賴傳遞影響整個工程。
Android Gradle plugin 3.0帶來了解決方案
最新版的Gradle plugin需要你指出一個module的接口是否對外暴露其依賴lib的接口址愿「昧停基于此,可以讓項目構(gòu)建時必盖,gradle可以判斷哪個需要重新編譯拌牲。因此,老版本的構(gòu)建關(guān)鍵字compile被廢棄了歌粥,而是改成了這兩個:
api:同compile作用一樣塌忽,即認(rèn)為本module將會泄露其依賴的module的內(nèi)容。
implementation:本module不會通過自身的接口向外部暴露其依賴module的內(nèi)容失驶。
由此土居,我們可以明確的告訴gradle去重新編譯一個module,若是這個使用的module的接口發(fā)生變化的話。
dependencies {
//當(dāng)legofy接口發(fā)生變化時擦耀,需要重新編譯本module以及所有使用本module的module
api project(':legofy')
// 僅當(dāng)landscapevideocamera發(fā)生變化時棉圈,重新編譯本module
implementation project(':landscapevideocamera:1.0.0')
}
遷移指南
理論上,你可以將原來工程中的compile完全替換為現(xiàn)在的api眷蜓,但是一旦依賴發(fā)生變化分瘾,將會使所有的module重新編譯,造成編譯過長吁系。
所以更好的方式就是使用implementation來進行依賴德召,這會大大改善工程的構(gòu)建時間。只有你明確要向外部暴露所依賴lib的接口時汽纤,才需要使用api依賴上岗,整體來說,會減少很多重新編譯蕴坪。這一點肴掷,在官方指南中說的比較明確。
其它的變化
既然有了比較大的改變背传,索性官方團隊利用此機會改了更多配置屬性的名字呆瞻,
比如provided改成了compileOnly,apk改成了runtimeOnly
大體如上续室,詳情可參考官方遷移指南