1. 程式人生 > >android studio 3.0 升級問題:原來module中的包沒法引用

android studio 3.0 升級問題:原來module中的包沒法引用

問題

Android studio升級到3.0以上之後,也隨之升級到了3.0.0版本。

classpath 'com.android.tools.build:gradle:3.0.0'

在3.0版本中,compile 指令被標註為過時方法,而新增了兩個依賴指令,一個是implement 和api,這兩個都可以進行依賴新增,但是有什麼區別呢?

implementation和api的區別。

新建工程預設生成的app的build.gradle檔案中的依賴:

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指令,沒區別,你將所有的compile改成api,完全沒有錯。

implementation指令

這個指令的特點就是,對於使用了該命令編譯的依賴,對該專案有依賴的專案將無法訪問到使用該命令編譯的依賴中的任何程式,也就是將該依賴隱藏在內部,而不對外部公開。

簡單的說,就是使用implementation指令的依賴不會傳遞。
例如,有一個module為testsdk,testsdk依賴於gson:

implementation 'com.google.code.gson:gson:2.8.2'

這時候,在testsdk裡邊的java程式碼是可以訪問gson的。

另一個module為app,app依賴於testsdk:

implementation project(':testsdk')

這時候,因為testsdk使用的是implementation 指令來依賴gson,所以app裡邊不能引用gson。

但是,如果testsdk使用的是api來引用gson:

api 'com.google.code.gson:gson:2.8.2'

則與gradle3.0.0之前的compile指令的效果完全一樣,app的module也可以引用gson。這就是api和implementation的區別。

建議

在Google IO 相關話題的中提到了一個建議,就是依賴首先應該設定為implementation的,如果沒有錯,那就用implementation,如果有錯,那麼使用api指令。使用implementation會使編譯速度有所增快。

參考: