不多說直接上一張表格
gradle3 | gradle2 | 說明 |
---|---|---|
implementation | compile | 依賴項在編譯時對模塊可用,并且僅在運行時對模塊的消費者可用。 對于大型多項目構(gòu)建,使用 implementation 而不是 api/compile 可以顯著縮短構(gòu)建時間,因為它可以減少構(gòu)建系統(tǒng)需要重新編譯的項目量。 大多數(shù)應(yīng)用和測試模塊都應(yīng)使用此配置。 |
api | compile | 依賴項在編譯時對模塊可用,并且在編譯時和運行時還對模塊的消費者可用。 此配置的行為類似于 compile(現(xiàn)在已棄用),一般情況下,您應(yīng)當僅在庫模塊中使用它。 應(yīng)用模塊應(yīng)使用 implementation,除非您想要將其 API 公開給單獨的測試模塊。 |
compileOnly | provided | 依賴項僅在編譯時對模塊可用,并且在編譯或運行時對其消費者不可用。 此配置的行為類似于 provided(現(xiàn)在已棄用) |
runtimeOnly | apk | 依賴項僅在運行時對模塊及其消費者可用。 此配置的行為類似于 apk(現(xiàn)在已棄用) |
第一列是gradle3新Api,第二列為gradle重的api,并且將要在Gradle為5的軟件版本重移除。
看到這里,你也許會疑惑。如何區(qū)分implementation
,api
以及compile
呢?
如何區(qū)分implementation
,api
以及compile
首先api
和compile
是同一個東西,那么只需要分辨他們和implementation
的區(qū)別。一張圖來說明
假如我們的工程是如上所示的依賴關(guān)系,如果使用Compile
方式進行依賴,修改紅色模塊,需要編譯所有洋紅色的模塊。相比之下使用Implentation
方式進行依賴,只需要編譯兩個青色的模塊。從而大幅度提高編譯速度。
理想是豐滿的,實際開發(fā)中,項目依賴混亂,完全使用Implentation
非常困難,尤其是一些公共模塊,基本每一模塊都會用到。那么只能使用api模塊進行依賴。當修改使用api進行依賴的模塊的時候,任何依賴他的模塊都可以引用他的方法。舉個例子:
第二行第二個使用api的方式依賴紅色模塊。任何洋紅色模塊都可以引用紅色模塊的方法,換言之當紅色模塊修改的時候,所有洋紅色模塊都會重新編譯。所以api只適用經(jīng)常不改動的模塊,方便其他模塊進行引用。
在我們的項目中,抽離compile依賴是很頭疼的一件事,在接下來的文檔中會提到。
所以:
-
Implentation
通常項目之間的依賴,這個要求我們項目之間要做好解耦。 -
Api
不經(jīng)常改動的項目,可以使用他進行依賴。
分辨運行時依賴和編譯時依賴
在講compileOnly
和runtimeOnly
之前,先弄清什么是么是運行時依賴和編譯時依賴。
顧名思義,從名稱上理解他的意思其實是正確的。
- 編譯時候(coding)的依賴就是編譯時依賴
- 運行時候(building)的依賴就是運行時依賴
(此時停頓一下,好好理解)
但是實際項目中錯綜復(fù)雜:還是使用一張圖來說明:
思考一下,D模塊那三個版本號是多少呢?
答案是根本編譯不過去。
但是這張圖理解這個概念已經(jīng)夠了,首先,針對B模塊,編譯時依賴是gson2.6,support升級22,okhttp是3;其他也是這么理解。
如果單獨運行C模塊是運行不過去的,你需要需要指定這三個以來的版本號,解決版本依賴沖突。這就是運行時依賴。有很多種方式解決這種重復(fù)依賴的方法,比如force
或者exclude
。
compileOnly
和runtimeOnly
- compileOnly 指的是在coding時候進行依賴,實際打包時候,不打入aar,同時他也不報錯。
compileOnly經(jīng)常會用于子模塊,比如A模塊要提供對B模塊的支持,同時又不能引入B模塊(主工程已經(jīng)引用了),就會用到它。舉個例子:假如項目中用到了Retrofit,我們都知道Retrofit對Rx是有支持的,但是他并不包含Rx包。在編譯Retrofit代碼時候,就要用到compileOnly了,編譯時引用Rx,實際不打如包中。注意錯誤使用可能會找不到類。 - runtimeOnly 和compileOnly相反,運行時候才會打包進去,編譯時候不提供。
compileOnly
和runtimeOnly
都提供對子模塊的使用,也就是說,在透傳依賴方面,他們和api是一致的。
變體依賴
Gradle3 中提供了變體依賴,他是基于風(fēng)味維度的。比如xxxImplentation
,我們項目中沒有用到,詳情了解,移步gradle官網(wǎng),簡單說一下把: 比如項目工程有一個模塊AdModule
,名為廣告模塊,在北美市場接入FB,印度市場接入獵豹,國內(nèi)接百度。那么就可以定義風(fēng)味維度為FB
,Liebao
,Baidu
。在主工程進行依賴的時候,如果打印度包,只需更改依賴為LieBaoImplentation
,那么AdModule就是獵豹廣告的風(fēng)味維度,其他毅然。
如果你注意過,在使用buildType時候也可以這樣指定,比如 debugImplentation
。
之前我們控制渠道信息,都是放到build.gradle的mainfestholder
中,然后子項目進行讀取,if else切換。風(fēng)味依賴倒是給了一個很好的解決方案,個人維護起來比較麻煩,這東西主項目和子項目維度匹配起來是個難題。。。適合大項目。