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包的方式會重複把,但現在這種場景不多了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章