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。
當(dāng)然,對于Kotlin的支持,在這個版本也有所體現(xiàn),Kotlin插件默認(rèn)是安裝的。

我們來看看新建一個項目在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.0 版本的所有依賴方式

compile
provided
apk
Test compile
Debug compile
Release compile

二. 3.0 版本的所有依賴方式

implement     
Api    
compileOnly
RuntimeOnly
Unit test implementation
Test implementation
Debug implementation
Release implementation

可以看到在Android studio3.0中,compile依賴關(guān)系已被棄用,被implementationapi替代,providedcompile only替代,apkruntime only替代。

implementationapi的區(qū)別:

api: 跟 2.x 版本的 compile完全相同
implementation:使用了該命令編譯的依賴,它僅僅對當(dāng)前的Module提供接口。例如我們當(dāng)前項目結(jié)構(gòu)如下

關(guān)系圖.png

LibraryA 中引用了 LibraryC 的庫,如果對 LibraryC 的依賴用的是 implementation 關(guān)鍵字。 如下:

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

那么LibraryC 中的接口,僅僅只能給 LibraryA 使用,而我們的 App Module 是無法訪問到 LibraryC 提供的接口的,也就是將該依賴隱藏在內(nèi)部,而不對外部公開。這就是implementation關(guān)鍵字的作用。

建議

在Google IO 相關(guān)話題的中提到了一個建議,就是依賴首先應(yīng)該設(shè)置為implement的,如果沒有錯,那就用implement,如果有錯,那么使用api指令,這樣會使編譯速度有所增快。

那為什么要這么做呢?

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

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

這對于大型項目含有多個Module模塊的, 以上圖為例,比如我們改動 LibraryC 接口的相關(guān)代碼,這時候編譯只需要單獨編譯LibraryA模塊就行, 如果使用的是api或者舊時代的compile,由于App Module 也可以訪問到 LibraryC,所以 App Module部分也需要重新編譯。當(dāng)然這是在全編的情況下。

三. 版本依賴關(guān)鍵字詳解(2.0與3.0所有關(guān)鍵字)

compile(api)

這種是我們最常用的方式,使用該方式依賴的庫將會參與編譯和打包。
當(dāng)我們依賴一些第三方的庫時,可能會遇到com.android.support沖突的問題,就是因為開發(fā)者使用的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這個錯誤。

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 打包。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容