最近使用 Android Studio 從事專案開發時,發現對 implementation
、api
、embed
的用法瞭解的不是很清楚,這裡準備一篇文章對其使用場景或者說是使用方式進行一個總結。
dependencies {
// Moudle內可見:material對應的api,僅能在該Moudle對應的工程內被呼叫
implementation 'com.google.android.material:material:1.3.0'
// 依賴具備傳導性:依賴該Moudle工程的其他Module,仍可使用gson對應的api
api 'com.google.code.gson:gson:2.6.2'
// 合併AAR:將bolts打包入該Moudle,生成包含bolts的aar
embed 'com.parse.bolts:bolts-tasks:1.4.0'
}
正文開始前,先對implementation、api、embed的特性做如下總結:
設定 | 行為 |
---|---|
implementation | 依賴不具傳導性,引入的API僅Moudle可見; 參與Moudle的編譯、不參與對應AAR打包,但參與整體Apk打包; |
api | 依賴具備傳導性,依賴該Moudle的其他Moudle也可呼叫引入的API; 參與Moudle的編譯、不參與對應AAR打包,但參與整體Apk打包; |
embed | 合併AAR,將引入API對應的AAR工程合併到該Moudle工程,打包成為一個全新的AAR; 依賴不具傳導性,引入的API僅Moudle可見; |
implementation、api是Gradle
與AGP
(Android Gradle Plugin)支援的依賴設定項:
implementation、api的使用場景
或者使用方式
在文章開頭表格已給出總結:
implementation:
不具傳導性
,引入的API僅Moudle可見;參與Moudle的編譯、不參與對應AAR打包
,但參與整體Apk打包;api:
具備傳導性
,依賴該Moudle的其他Moudle也可呼叫引入的API;參與Moudle的編譯、不參與對應AAR打包
,但參與整體Apk打包;對於前文給出的使用場景總結,這一節要給出結論的證明依據:最好的辦法是我們寫個簡單程式驗證一下。
implementation使用場景驗證
驗證步驟及結論如下:
Android_Test
;Android_Test
工程下,新建Moudle工程Lib_B
;App
依賴Lib_B
Moudle工程;Lib_B
以implementation
方式引入gson
依賴包:App
Moudle無法參照gson
相關API:Lib_B
的AAR包,其中不包含gson相關程式碼;反編譯app.apk
,其中包含gson相關程式碼。api
驗證步驟及結論如下:
Lib_B
以api
方式引入gson
依賴包:App
Moudle可參照gson
相關API:Lib_B
的AAR包,其中不包含gson相關程式碼;反編譯app.apk
,其中包含gson相關程式碼。embed 是GitHub開源工程 fat-aar-android 提供的第三方依賴設定,其功能主要為將多個AAR依賴包進行合併
。
這裡對其使用總結如下:
合併AAR
:將引入API對應的AAR工程合併到該Moudle工程,打包成為一個全新的AAR;不具傳導性
:引入的API僅Moudle可見;對於embed的使用,這裡不再進行驗證舉例,感興趣的朋友可自行驗證。但對於embed的使用,這裡需要強調一下注意點:
不再維護更新
;支援的版本範圍
:AGP 3.0 - 7.1.0,Gradle 4.9 - 7.3;implementation、api、embed單獨使用,已經滿足我們大部分的使用場景,但假設有這一種情況:
app
、Lib_B
、Lib_C
;app
依賴 Lib_B
,Lib_B
依賴 Lib_C
;需求是 Lib_C 需要合併打包到 Lib_B 中,生成一個新的AAR Lib_B ;但 Lib_C 的相關API又要可被 app 呼叫。
這種情況該如何處理?
// 可同時採用api與embed設定依賴
dependencies {
api project(path: ':Lib_C')
embed project(path: ':Lib_C')
}
Android Gradle dependencies:
https://developer.android.google.cn/studio/build/dependencies?hl=zh-cn
fat-aar-android:embed
https://github.com/kezong/fat-aar-android
Gradle官方:
https://gradle.org/releases/
Gradle java_library_plugin:
https://docs.gradle.org/current/userguide/java_library_plugin.html
文章首發於公眾號」CODING技術小館「,如果文章對您有幫助,歡迎關注我的公眾號。