其實(shí)這類(lèi)文章博客網(wǎng)上一搜一大堆露氮,但有些地方可能說(shuō)的不太清楚(都一樣的內(nèi)容,抄襲太嚴(yán)重)钟沛,這里只是做個(gè)精簡(jiǎn)的總結(jié)和一些其他地方?jīng)]提到的點(diǎn)畔规。
一、Android Studio 3.0開(kāi)始使用了新的指令讹剔,原來(lái)的很多被棄用了油讯,總的來(lái)說(shuō)是為了加快構(gòu)建編譯速度。
下面是一個(gè)總結(jié)表格:
Android Studio 2.X | Android Studio 3.X |
---|---|
apk | runtimeOnly |
provided | compileOnly |
compile | api |
沒(méi)有對(duì)應(yīng) | implementation |
debugCompile | debugImplementation |
releaseCompile | releaseImplementation |
androidTestCompile | androidTestImplementation |
需要解釋的主要是implementation系列指令:
implementation:注意compile是和api對(duì)應(yīng)的延欠,效果相同陌兑。implementation的區(qū)別在于對(duì)外可見(jiàn)性,而且可以加快編譯速度(原理在于減少不必要的重復(fù)編譯過(guò)程)由捎。舉個(gè)例子如下:
A module 依賴 B module兔综,B 依賴 C module。
Android Studio 2.X使用compile:
A compile B
B compile C
A module不僅可以引用B module狞玛,還可以引用C module的接口和類(lèi)软驰。
Android Studio 3.X使用implementation:
A implementation B
B implementation C
A module只可以引用B module,不可以引用C module心肪。C 對(duì) A 是不可見(jiàn)的锭亏!
簡(jiǎn)單來(lái)說(shuō),從Android Studio 3.X開(kāi)始硬鞍,依賴首先應(yīng)該設(shè)置為implement慧瘤,如果沒(méi)有錯(cuò),那就用implement固该,如果有錯(cuò)锅减,那么使用api指令,這樣會(huì)使編譯速度有所增快伐坏。(就這樣理解夠了怔匣,很多文章又是畫(huà)圖又是長(zhǎng)篇大論的,完全沒(méi)有必要桦沉,本來(lái)就不是多么復(fù)雜的東西)每瞒。
二金闽、provided(compileOnly)和compile(api)區(qū)別
按照幾乎所有文章的說(shuō)法:
provided只提供編譯支持,但是不會(huì)寫(xiě)入apk剿骨。使用provide可以避免支持包版本沖突和重復(fù)打包導(dǎo)致安裝包體積徒增呐矾。
但就我的實(shí)踐來(lái)說(shuō)(支持包V7,V4之類(lèi)):
1、不使用provided也不會(huì)導(dǎo)致支持包重復(fù)懦砂,依賴module編譯出來(lái)的aar并不包含那些多個(gè)module(包括app module)重復(fù)使用的支持包。
2组橄、如果依賴module使用的style中引用了支持包(V7,V4之類(lèi)的)中的主題荞膘,那么,使用provided會(huì)報(bào)錯(cuò)(找不到主題資源)玉工。如果只是引用支持包中的類(lèi)和接口是可以使用provided的(但意義也不大羽资,反正也不會(huì)重復(fù))。
3遵班、可能直接引用jar包的方式會(huì)重復(fù)把屠升,但現(xiàn)在這種場(chǎng)景不多了。