本文介紹了Gradle 3.4新引入的依賴配置以及 api 和 implementation 之間的區(qū)別。
本文首發(fā):http://yuweiguocn.github.io/
《贈(zèng)汪倫》
李白乘舟將欲行,忽聞岸上踏歌聲。
桃花潭水深千尺,不及汪倫送我情。
—唐,李白
Gradle 3.4 引入了新的依賴配置,新增了 api
和 implementation
來代替 compile
依賴配置。其中 api
和以前的 compile
依賴配置是一樣的。使用 implementation
依賴配置,會(huì)顯著提升構(gòu)建時(shí)間。
接下來,我們舉例說明 api
和 implementation
的區(qū)別。
假如我們一個(gè)名 MyLibrary 的 module 類庫和一個(gè)名為 InternalLibrary 的 module 類庫。里面的代碼類似這樣:
//internal library module
public class InternalLibrary {
public static String giveMeAString(){
return "hello";
}
}
//my library module
public class MyLibrary {
public String myString(){
return InternalLibrary.giveMeAString();
}
}
MyLibrary 中 build.gradle 對 InternalLibrary 的依賴如下:
dependencies {
api project(':InternalLibrary')
}
然后在主 module 的 build.gradle 添加對 MyLibrary 的依賴:
dependencies {
api project(':MyLibrary')
}
在主 module 中,使用 api
依賴配置 MyLibrary 和 InternalLibrary 都可以訪問:
//so you can access the library (as it should)
MyLibrary myLib = new MyLibrary();
System.out.println(myLib.myString());
//but you can access the internal library too (and you shouldn't)
System.out.println(InternalLibrary.giveMeAString());
使用這種方法,會(huì)泄露一些不應(yīng)該被使用的實(shí)現(xiàn)。
為了阻止這種情況,Gradle 新增了 implementation
配置。如果我們在 MyLibrary 中使用 implementation
配置:
dependencies {
implementation project(':InternalLibrary')
}
然后在主 module 的 build.gradle 文件中使用 implementation
添加對 MyLibrary 的依賴:
dependencies {
implementation project(':MyLibrary')
}
使用這個(gè) implementation
依賴配置在應(yīng)用中無法調(diào)用 InternalLibrary.giveMeAString()
。如果 MyLibrary 使用 api
依賴 InternalLibrary,無論主 module 使用 api
還是 implementation
依賴配置,主 module 中都可以訪問 InternalLibrary.giveMeAString()
。
使用這種封箱策略,如果你只修改了 InternalLibrary 中的代碼,Gradle 只會(huì)重新編譯 MyLibrary,它不會(huì)觸發(fā)重新編譯整個(gè)應(yīng)用,因?yàn)槟銦o法訪問 InternalLibrary。當(dāng)你有大量的嵌套依賴時(shí),這個(gè)機(jī)制會(huì)顯著提升構(gòu)建速度。
其它配置說明如下表所示。
新配置 | 廢棄配置 | 說明 |
---|---|---|
compileOnly | provided | gradle 添加依賴到編譯路徑,編譯時(shí)使用。(不會(huì)打包到APK) |
runtimeOnly | apk | gradle 添加依賴只打包到 APK,運(yùn)行時(shí)使用。(不會(huì)添加到編譯路徑) |
總結(jié)
- 當(dāng)你切換到新的 Android gradle plugin 3.x.x,你應(yīng)用使用
implementation
替換所有的compile
依賴配置。然后嘗試編譯和測試你的應(yīng)用。如果沒問題那樣最好,如果有問題說明你的依賴或使用的代碼現(xiàn)在是私有的或不可訪問——來自 Android Gradle plugin engineer Jerome Dochez 的建議。 - 如果你是一個(gè)lib庫的維護(hù)者,對于所有需要公開的 API 你應(yīng)該使用
api
依賴配置,測試依賴或不讓最終用戶使用的依賴使用implementation
依賴配置。