Gradle3-依賴詳解

不多說直接上一張表格

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

首先apicompile是同一個東西,那么只需要分辨他們和implementation的區(qū)別。一張圖來說明

image.png

假如我們的工程是如上所示的依賴關(guān)系,如果使用Compile方式進行依賴,修改紅色模塊,需要編譯所有洋紅色的模塊。相比之下使用Implentation方式進行依賴,只需要編譯兩個青色的模塊。從而大幅度提高編譯速度。

理想是豐滿的,實際開發(fā)中,項目依賴混亂,完全使用Implentation非常困難,尤其是一些公共模塊,基本每一模塊都會用到。那么只能使用api模塊進行依賴。當修改使用api進行依賴的模塊的時候,任何依賴他的模塊都可以引用他的方法。舉個例子:

image.png

第二行第二個使用api的方式依賴紅色模塊。任何洋紅色模塊都可以引用紅色模塊的方法,換言之當紅色模塊修改的時候,所有洋紅色模塊都會重新編譯。所以api只適用經(jīng)常不改動的模塊,方便其他模塊進行引用。
在我們的項目中,抽離compile依賴是很頭疼的一件事,在接下來的文檔中會提到。
所以:

  • Implentation 通常項目之間的依賴,這個要求我們項目之間要做好解耦。
  • Api 不經(jīng)常改動的項目,可以使用他進行依賴。

分辨運行時依賴和編譯時依賴

在講compileOnlyruntimeOnly之前,先弄清什么是么是運行時依賴和編譯時依賴。
顧名思義,從名稱上理解他的意思其實是正確的。

  • 編譯時候(coding)的依賴就是編譯時依賴
  • 運行時候(building)的依賴就是運行時依賴
    (此時停頓一下,好好理解)
    但是實際項目中錯綜復(fù)雜:還是使用一張圖來說明:
image.png

思考一下,D模塊那三個版本號是多少呢?
答案是根本編譯不過去。
但是這張圖理解這個概念已經(jīng)夠了,首先,針對B模塊,編譯時依賴是gson2.6,support升級22,okhttp是3;其他也是這么理解。
如果單獨運行C模塊是運行不過去的,你需要需要指定這三個以來的版本號,解決版本依賴沖突。這就是運行時依賴。有很多種方式解決這種重復(fù)依賴的方法,比如force或者exclude

compileOnlyruntimeOnly

  • compileOnly 指的是在coding時候進行依賴,實際打包時候,不打入aar,同時他也不報錯。
    compileOnly經(jīng)常會用于子模塊,比如A模塊要提供對B模塊的支持,同時又不能引入B模塊(主工程已經(jīng)引用了),就會用到它。舉個例子:假如項目中用到了Retrofit,我們都知道Retrofit對Rx是有支持的,但是他并不包含Rx包。在編譯Retrofit代碼時候,就要用到compileOnly了,編譯時引用Rx,實際不打如包中。注意錯誤使用可能會找不到類。
  • runtimeOnly 和compileOnly相反,運行時候才會打包進去,編譯時候不提供。
    compileOnlyruntimeOnly都提供對子模塊的使用,也就是說,在透傳依賴方面,他們和api是一致的。

變體依賴

Gradle3 中提供了變體依賴,他是基于風(fēng)味維度的。比如xxxImplentation,我們項目中沒有用到,詳情了解,移步gradle官網(wǎng),簡單說一下把: 比如項目工程有一個模塊AdModule,名為廣告模塊,在北美市場接入FB,印度市場接入獵豹,國內(nèi)接百度。那么就可以定義風(fēng)味維度為FBLiebaoBaidu。在主工程進行依賴的時候,如果打印度包,只需更改依賴為LieBaoImplentation,那么AdModule就是獵豹廣告的風(fēng)味維度,其他毅然。

如果你注意過,在使用buildType時候也可以這樣指定,比如 debugImplentation
之前我們控制渠道信息,都是放到build.gradle的mainfestholder中,然后子項目進行讀取,if else切換。風(fēng)味依賴倒是給了一個很好的解決方案,個人維護起來比較麻煩,這東西主項目和子項目維度匹配起來是個難題。。。適合大項目。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,098評論 25 708
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,941評論 6 342
  • 夜深人靜,突然想到了兩位小學(xué)老師,思緒如山洪決口不可收拾…… 一 很久很久之前,...
    蕭子川閱讀 184評論 0 1
  • 蟬鳴 遇見你,在蟬鳴的季節(jié)。 窗外陽光晃過,亮閃閃的,睜不開眼。 透過指縫看你,親切溫暖,一臉燦然。 葉落 校園小...
    柒沐木閱讀 407評論 2 3