安卓依賴 implement、api、compile、provided、compileOnly區(qū)別

官方依賴說明文檔參考
應(yīng)用模塊的 build.gradle 文件中包含三種不同類型的依賴項(xiàng):

apply plugin: 'com.android.application'

    android { ... }

    dependencies {
        // Dependency on a local library module
        implementation project(":mylibrary")

        // Dependency on local binaries
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        //或者,您也可以按如下方式指定各個(gè)文件:
        implementation files(‘libs/foo.jar’,‘libs/bar.jar’)

        // Dependency on a remote binary
        implementation 'com.example.android:app-magic:12.3'
    }
    

Android Studio3.0 正式版相比 2.x 的版本,Gradle版本升級(jí)為了3.x,編譯速度也提高了不少。
在gadle3.0之后,默認(rèn)的依賴由之前的compile更改為implementation了。
先來看下2.x版本的依賴方式:


2.x.png

再來看看3.0的


3.0.png

可以看到在gradle3.0中,compile依賴關(guān)系已被棄用,被implementation和api替代,provided被compile only替代,apk被runtime only替代,剩下的看名字就知道了。

我們先來看看implementation和api的區(qū)別:

api:跟2.x版本的 compile完全相同,當(dāng)一個(gè)模塊包含 api 依賴項(xiàng)時(shí),會(huì)讓 Gradle 了解該模塊要以傳遞方式將該依賴項(xiàng)導(dǎo)出到其他模塊,以便這些模塊在運(yùn)行時(shí)和編譯時(shí)都可以使用該依賴項(xiàng)。

implementation:當(dāng)您的模塊配置 implementation 依賴項(xiàng)時(shí),會(huì)讓 Gradle 了解您不希望該模塊在編譯時(shí)將該依賴項(xiàng)泄露給其他模塊。也就是說,其他模塊只有在運(yùn)行時(shí)才能使用該依賴項(xiàng)。比如我在一個(gè)libiary中使用implementation依賴了gson庫,然后我的主項(xiàng)目依賴了libiary,那么,如果此時(shí)修改了 gson 庫的版本號(hào),那么在重新編譯項(xiàng)目期間我的主項(xiàng)目就無法訪問gson庫中的方法。這樣的好處是編譯速度會(huì)加快,推薦使用implementation的方式去依賴,如果你需要在編譯和運(yùn)行時(shí)都提供給外部訪問,那么就使用api依賴即可。

還不熟悉2.x版本依賴的可以看看下面的說明,括號(hào)里對應(yīng)的是3.0版本的依賴方式。

compile(implementation,api)
這種是我們最常用的方式,使用該方式依賴的庫將會(huì)參與編譯和打包。

implementation:該依賴方式所依賴的庫不會(huì)傳遞,只會(huì)在當(dāng)前module中生效。
api:該依賴方式會(huì)傳遞所依賴的庫,當(dāng)其他module依賴了該module時(shí),可以使用該module下使用api依賴的庫。

當(dāng)我們依賴一些第三方的庫時(shí),可能會(huì)遇到com.android.support沖突的問題,就是因?yàn)殚_發(fā)者使用的compile或api依賴的com.android.support包與我們本地所依賴的com.android.support包版本不一樣,所以就會(huì)報(bào)All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes這個(gè)錯(cuò)誤。
解決辦法參考

provided(compileOnly)
只在編譯時(shí)有效,不會(huì)參與打包。Gradle 只會(huì)將依賴項(xiàng)添加到編譯類路徑(也就是說,不會(huì)將其添加到構(gòu)建輸出)。如果您創(chuàng)建 Android 模塊時(shí)在編譯期間需要相應(yīng)依賴項(xiàng),但它在運(yùn)行時(shí)可有可無,此配置會(huì)很有用。
可以在自己的moudle中使用該方式依賴一些比如com.android.support,gson這些使用者常用的庫,避免沖突。
如果您使用此配置,那么您的庫模塊必須包含一個(gè)運(yùn)行時(shí)條件,用于檢查是否提供了相應(yīng)依賴項(xiàng),然后適當(dāng)?shù)馗淖冊撃K的行為,以使該模塊在未提供相應(yīng)依賴項(xiàng)的情況下仍可正常運(yùn)行。這樣做不會(huì)添加不重要的瞬時(shí)依賴項(xiàng),因而有助于減小最終 APK 的大小。

apk(runtimeOnly)
只在生成apk的時(shí)候參與打包,編譯時(shí)不會(huì)參與,很少用。Gradle 只會(huì)將依賴項(xiàng)添加到構(gòu)建輸出,以便在運(yùn)行時(shí)使用。也就是說,不會(huì)將其添加到編譯類路徑。

testCompile(testImplementation)
testCompile 只在單元測試代碼的編譯以及最終打包測試apk時(shí)有效。

debugCompile(debugImplementation)
debugCompile 只在debug模式的編譯和最終的debug apk打包時(shí)有效

releaseCompile(releaseImplementation)
Release compile 僅僅針對Release 模式的編譯和最終的Release apk打包。

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

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

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