在 gradle3.0之前,gradle 依賴(lài)項(xiàng)目配置有 compile,apk,provided三種方式
compile:指定編譯時(shí)依賴(lài)項(xiàng)舰蟆。Gradle 將此配置的依賴(lài)項(xiàng)添加到類(lèi)路徑和應(yīng)用的 APK。這是默認(rèn)配置访忿。
apk: 指定 Gradle 需要將其與應(yīng)用的 APK 一起打包的僅運(yùn)行時(shí)依賴(lài)項(xiàng)荒典。您可以將此配置與 JAR 二進(jìn)制依賴(lài)項(xiàng)一起使用舌稀,而不能與其他庫(kù)模塊依賴(lài)項(xiàng)或 AAR 二進(jìn)制依賴(lài)項(xiàng)一起使用厢呵。
provided:指定 Gradle 不與應(yīng)用的 APK 一起打包的編譯時(shí)依賴(lài)項(xiàng)。如果運(yùn)行時(shí)無(wú)需此依賴(lài)項(xiàng)蝶缀,這將有助于縮減 APK 的大小丹喻。您可以將此配置與 JAR 二進(jìn)制依賴(lài)項(xiàng)一起使用,而不能與其他庫(kù)模塊依賴(lài)項(xiàng)或 AAR 二進(jìn)制依賴(lài)項(xiàng)一起使用翁都。
從上面截圖可以看到,在AS 的 project structure的添加 dependency 界面,你會(huì)看到每個(gè) dependency 后面可以致命 scope, 因?yàn)槲业?gradle 是3.0版本,compile,apk,provided 這三種依賴(lài)方式已經(jīng) deprecated. 取而代之的implementation, api, compileOnly, and runtimeOnly幾種方式
那新舊之間有什么不同呢?
gradle3.0之前的 build.gradle 文件是這樣的,依賴(lài)項(xiàng)目默認(rèn)都是通過(guò)compile
而gradle3.0后,module 下的build.gradle 項(xiàng)目依賴(lài)可以是這樣子
gradle3.0或者以上版本 | 3.0之前(deprecated) | 說(shuō)明 | 作用 |
---|---|---|---|
implementation | compile | gradle升級(jí)到3.0之后,新增了 implementation, 而compile 方式被標(biāo)記為了deprecated, compile 在3.0之后仍然可以使用,但是 gradle 官方說(shuō)會(huì)在 gradle 后續(xù)的某次重要升級(jí)后變?yōu)椴豢捎? | 如果我們使用了implementation方式來(lái)依賴(lài)項(xiàng)目的話,那么這個(gè)庫(kù)就在編譯時(shí)期,只對(duì)當(dāng)前的module可見(jiàn),對(duì)其他的module不可見(jiàn),但是在運(yùn)行使其是可見(jiàn)的,這種方式的好處是可以顯著減少 build項(xiàng)目的時(shí)間,因?yàn)榧偃缭撘蕾?lài)庫(kù)有接口或者代碼變動(dòng),那么Gradle只會(huì)去重新編譯和它有直接依賴(lài)關(guān)系的module,也就是該庫(kù)不存在傳遞性 |
api | compile | 同上 | 使用api方式來(lái)依賴(lài)項(xiàng)目或者庫(kù)的話,那么這個(gè)庫(kù),在編譯時(shí)期和運(yùn)行時(shí)期都可以對(duì)其他module可見(jiàn) |
compileOnly | provided | 3.0之后版本,使用compileOnly來(lái)替代provided | 假如在項(xiàng)目中,對(duì)某些庫(kù)你只是想要在編譯時(shí)期使用,而在運(yùn)行時(shí)期并不需要這個(gè)庫(kù),你可以使用這種方式! |
runtimeOnly | apk | 3.0之后,使用 runtinmeOnly來(lái)替代apk | Gradle 在運(yùn)行時(shí)會(huì)將該庫(kù)添加到 build 的 output 中去 |
也許到此刻,有些同學(xué)還是處于懵懵懂懂的狀態(tài),下面讓我以幾個(gè)例子來(lái)詳細(xì)說(shuō)明他們的作用
在我的項(xiàng)目里共有 app,common,factory,lang這4個(gè)module
他們的依賴(lài)關(guān)系是 [app->factory->common->lang]
那么此時(shí)如果我的 common這個(gè) module中使用 implementation 來(lái)引入 gson 庫(kù),那么在 factory 和 app 這兩個(gè) module中,你是無(wú)法是用Gson 的,編譯時(shí)期是無(wú)法找到這個(gè)類(lèi)的,implementation 不具有傳遞性,如果使用 api 或者 compile 來(lái)引入 gson 庫(kù),便可以在 app 和 factory 中直接使用 gson 庫(kù),而不必再次引入.
什么時(shí)候用到 compileOnly呢?
我們?cè)陂_(kāi)發(fā)的時(shí)候,如果想要查看 PhoneWindow ,WindowManager 這些 framework 層的代碼,可以將 sdk 中的 platforms中的 android.jar 放入 lib 文件夾中,然后add as Library,此時(shí)會(huì)在 build.gradle 文件中生成一句
implementation files('libs/android.jar')
我們可以將 implementation替換為 compileOnly,此時(shí)就可以查看 PhoneWindow 這些 framework 層的源碼了
以上如有錯(cuò)誤,請(qǐng)多指教!