天天看點

android gradle依賴:implementation 和compile的差別

2017 年google 後,Android studio版本更新至3.0,更新中,連帶着com.android.tools.build:gradle 工具也更新到了3.0.0,在3.0.0中使用了最新的Gralde 4.0 裡程碑版本作為gradle的編譯版本,該版本gradle編譯速度有所加速,更加欣喜的是,完全支援Java8。

當然,對于Kotlin的支援,在這個版本也有所展現,Kotlin插件預設是安裝的。

本文轉載至:https://www.jianshu.com/p/f34c179bc9d0

我們來看看建立一個項目在

Module

中的

dependencies

中的變化。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
           

下面我們來看看他們之前的差異:

首先是2.x版本的依賴方式

android gradle依賴:implementation 和compile的差別
android gradle依賴:implementation 和compile的差別

再來看看3.0的

android gradle依賴:implementation 和compile的差別

可以看到在

Android studio3.0

中,

compile

依賴關系已被棄用,被

implementation

api

替代,

provided

compile only

替代,

apk

runtime only

替代。

我們先來看看

implementation

api

的差別:

api:跟 2.x 版本的

compile

完全相同

implementation:使用了該指令編譯的依賴,它僅僅對目前的

Module

提供接口。例如我們目前項目結構如下

android gradle依賴:implementation 和compile的差別

LibraryA

 中引用了 

LibraryC

 的庫,如果對 

LibraryC

 的依賴用的是 

implementation

 關鍵字。 如下:

dependencies {
    . . . . 
    implementation project(path:':libraryC')
}
           

那麼

LibraryC

中的接口,僅僅隻能給

LibraryA

使用,而我們的

App Module

是無法通路到

LibraryC

提供的接口的,也就是将該依賴隐藏在内部,而不對外部公開。這就是

implementation

關鍵字的作用。

建議

Google IO

相關話題的中提到了一個建議,就是依賴首先應該設定為

implement

的,如果沒有錯,那就用

implement

,如果有錯,那麼使用

api

指令,這樣會使編譯速度有所增快。

那為什麼要這麼做呢?

答案是: 1. 加快編譯速度。2. 隐藏對外不必要的接口。

為什麼能加快編譯速度呢?

這對于大型項目含有多個

Module

子產品的, 以上圖為例,比如我們改動

LibraryC

接口的相關代碼,這時候編譯隻需要單獨編譯

LibraryA

子產品就行, 如果使用的是

api

或者舊時代的

compile

,由于

App Module

也可以通路到

LibraryC

,是以

App Module

部分也需要重新編譯。當然這是在全編的情況下。

還不熟悉 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

這個錯誤。

解決辦法可以看這篇部落格:http://blog.csdn.net/yuzhiqiang_1993/article/details/78214812

provided(compileOnly)

隻在編譯時有效,不會參與打包

可以在自己的

module

中使用該方式依賴一些比如

com.android.support

gson

這些使用者常用的庫,避免沖突。

apk(runtimeOnly)

隻在生成

apk

的時候參與打包,編譯時不會參與,很少用。

testCompile(testImplementation)

testCompile

隻在單元測試代碼的編譯以及最終打包測試apk時有效。

debugCompile(debugImplementation)

debugCompile

隻在 debug 模式的編譯和最終的 debug apk 打包時有效

releaseCompile(releaseImplementation)

Release compile

僅僅針對 Release 模式的編譯和最終的 Release apk 打包。