Android gradle provided、implementation等指令注意點


其實這類文章博客網上一搜一大堆,但有些地方可能說的不太清楚(都一樣的內容,抄襲太嚴重),這里只是做個精簡的總結和一些其他地方沒提到的點。

一、Android Studio 3.0開始使用了新的指令,原來的很多被棄用了,總的來說是為了加快構建編譯速度。

下面是一個總結表格:

Android Studio 2.X Android Studio 3.X
apk runtimeOnly
provided compileOnly
compile api
沒有對應 implementation
debugCompile debugImplementation
releaseCompile releaseImplementation
androidTestCompile androidTestImplementation

需要解釋的主要是implementation系列指令:

implementation:注意compile是和api對應的,效果相同。implementation的區別在於對外可見性,而且可以加快編譯速度(原理在於減少不必要的重復編譯過程)。舉個例子如下:

A module 依賴 B module,B 依賴 C module。 Android Studio 2.X使用compile: A compile B B compile C A module不僅可以引用B module,還可以引用C module的接口和類。 Android Studio 3.X使用implementation: A implementation B B implementation C A module只可以引用B module,不可以引用C module。C 對 A 是不可見的! 

簡單來說,從Android Studio 3.X開始,依賴首先應該設置為implement,如果沒有錯,那就用implement,如果有錯,那么使用api指令,這樣會使編譯速度有所增快。(就這樣理解夠了,很多文章又是畫圖又是長篇大論的,完全沒有必要,本來就不是多么復雜的東西)。

二、provided(compileOnly)和compile(api)區別

按照幾乎所有文章的說法:

provided只提供編譯支持,但是不會寫入apk。使用provide可以避免支持包版本沖突和重復打包導致安裝包體積徒增。

但就我的實踐來說(支持包V7,V4之類):

1、不使用provided也不會導致支持包重復,依賴module編譯出來的aar並不包含那些多個module(包括app module)重復使用的支持包。

2、如果依賴module使用的style中引用了支持包(V7,V4之類的)中的主題,那么,使用provided會報錯(找不到主題資源)。如果只是引用支持包中的類和接口是可以使用provided的(但意義也不大,反正也不會重復)。

3、可能直接引用jar包的方式會重復把,但現在這種場景不多了。

 

可以看到在gradle3.0中,compile依賴關系已被棄用,被implementation和api替代,provided被compile only替代,apk被runtime only替代,剩下的看名字就知道了。

我們先來看看implementation和api的區別:

api:跟2.x版本的 compile完全相同

implementation:只能在內部使用此模塊,比如我在一個libiary中使用implementation依賴了gson庫,然后我的主項目依賴了libiary,那么,我的主項目就無法訪問gson庫中的方法。這樣的好處是編譯速度會加快,推薦使用implementation的方式去依賴,如果你需要提供給外部訪問,那么就使用api依賴即可

還不熟悉2.x版本依賴的可以看看下面的說明,括號里對應的是3.0版本的依賴方式。

compile(api)
這種是我們最常用的方式,使用該方式依賴的庫將會參與編譯和打包。
當我們依賴一些第三方的庫時,可能會遇到com.android.support沖突的問題,就是因為開發者使用的compile依賴的com.android.support包,而他所依賴的包與我們本地所依賴的com.android.support包版本不一樣,所以就會報All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes這個錯誤。

解決辦法可以看這篇博客:com.android.support沖突的解決辦法

provided(compileOnly)
只在編譯時有效,不會參與打包
可以在自己的moudle中使用該方式依賴一些比如com.android.support,gson這些使用者常用的庫,避免沖突。

apk(runtimeOnly)
只在生成apk的時候參與打包,編譯時不會參與,很少用。

testCompile(testImplementation)
testCompile 只在單元測試代碼的編譯以及最終打包測試apk時有效。

debugCompile(debugImplementation)
debugCompile 只在debug模式的編譯和最終的debug apk打包時有效

releaseCompile(releaseImplementation)
Release compile 僅僅針對Release 模式的編譯和最終的Release apk打包。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM