Android studio升級(jí)到3.0以上之后,插件版本(plugin version)也隨之升級(jí)到了3.0.0版本或以上。
工程中import的module中的dependencies 原來(lái)用的是compile,但在26還是28后強(qiáng)制使用implementation,所以你為了順應(yīng)潮流(安全)改成了implementation。但:
implementation指令
這個(gè)指令的特點(diǎn)就是,對(duì)于使用了該命令編譯的依賴(lài),對(duì)該項(xiàng)目有依賴(lài)的項(xiàng)目將無(wú)法訪問(wèn)到使用該命令編譯的依賴(lài)中的任何程序,也就是將該依賴(lài)隱藏在內(nèi)部,而不對(duì)外部公開(kāi)
所以你module中的類(lèi)可以用,但jar怎么都引用不了,你開(kāi)始慌了...
正文:
? ??????在3.0版本中,compile 指令被標(biāo)注為過(guò)時(shí)方法,而新增了兩個(gè)依賴(lài)指令,一個(gè)是implement 和api,這兩個(gè)都可以進(jìn)行依賴(lài)添加,但是有什么區(qū)別呢?
新建工程默認(rèn)生成的app的build.gradle文件中的依賴(lài):
dependencies {
? ? implementation fileTree(include: ['*.jar'], dir: 'libs')
? ?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'
}
[api 指令]
????????完全等同于compile指令,沒(méi)區(qū)別,你將所有的compile改成api,完全沒(méi)有錯(cuò)。
[implementation指令]
????????這個(gè)指令的特點(diǎn)就是,對(duì)于使用了該命令編譯的依賴(lài),對(duì)該項(xiàng)目有依賴(lài)的項(xiàng)目將無(wú)法訪問(wèn)到使用該命令編譯的依賴(lài)中的任何程序,也就是將該依賴(lài)隱藏在內(nèi)部,而不對(duì)外部公開(kāi)。
簡(jiǎn)單的說(shuō),就是使用implementation指令的依賴(lài)不會(huì)傳遞。
例如,有一個(gè)module為testsdk,testsdk依賴(lài)于gson:
implementation 'com.google.code.gson:gson:2.8.2'
這時(shí)候,在testsdk里邊的java代碼是可以訪問(wèn)gson的。
另一個(gè)module為app,app依賴(lài)于testsdk:
implementation project(':testsdk')
這時(shí)候,因?yàn)閠estsdk使用的是implementation 指令來(lái)依賴(lài)gson,所以app里邊不能引用gson。
但是,如果testsdk使用的是api來(lái)引用gson:
api 'com.google.code.gson:gson:2.8.2'
則與gradle3.0.0之前的compile指令的效果完全一樣,app的module也可以引用gson。這就是api和implementation的區(qū)別。
建議
????????在Google IO 相關(guān)話題的中提到了一個(gè)建議,就是依賴(lài)首先應(yīng)該設(shè)置為implementation的,如果沒(méi)有錯(cuò),那就用implementation,如果有錯(cuò),那么使用api指令。使用implementation會(huì)使編譯速度有所增快。
原文:https://blog.csdn.net/mybook1122/article/details/78657392