一文詳解 implementation api embed

2022-08-10 12:01:17

最近使用 Android Studio 從事專案開發時,發現對 implementationapiembed 的用法瞭解的不是很清楚,這裡準備一篇文章對其使用場景或者說是使用方式進行一個總結。

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

implementation、api是GradleAGP(Android Gradle Plugin)支援的依賴設定項:

  • AndroidStudio官方檔案描述如下:
  • Gradle官方檔案描述如下:

1.1 使用場景

implementation、api的使用場景或者使用方式在文章開頭表格已給出總結:

implementation:

  • 依賴不具傳導性,引入的API僅Moudle可見;
  • 參與Moudle的編譯、不參與對應AAR打包,但參與整體Apk打包;

api:

  • 依賴具備傳導性,依賴該Moudle的其他Moudle也可呼叫引入的API;
  • 參與Moudle的編譯、不參與對應AAR打包,但參與整體Apk打包;

1.2 驗證舉例

對於前文給出的使用場景總結,這一節要給出結論的證明依據:最好的辦法是我們寫個簡單程式驗證一下。

  • implementation 使用場景驗證舉例;
  • api 使用場景驗證舉例;

implementation使用場景驗證

驗證步驟及結論如下:

  • a、新建一個AndroidStudio工程Android_Test
  • b、在Android_Test工程下,新建Moudle工程Lib_B
  • c、使App 依賴Lib_BMoudle工程;
  • d、Lib_Bimplementation方式引入gson依賴包:
  • e、AppMoudle無法參照gson相關API:
    得出第一個結論:依賴不具傳導性,引入的API僅Moudle可見
  • f、反編譯Lib_B的AAR包,其中不包含gson相關程式碼;反編譯app.apk,其中包含gson相關程式碼。
    得出第二個結論:參與Moudle的編譯、不參與對應AAR打包,但參與整體Apk打包

api

驗證步驟及結論如下:

  • a、Lib_Bapi方式引入gson依賴包:
  • b、AppMoudle可參照gson相關API:
    得出第一個結論:依賴具備傳導性,依賴該Moudle的其他Moudle也可呼叫引入的API
  • c、反編譯Lib_B的AAR包,其中不包含gson相關程式碼;反編譯app.apk,其中包含gson相關程式碼。
    得出第二個結論:參與Moudle的編譯、不參與對應AAR打包,但參與整體Apk打包

二、embed

embed 是GitHub開源工程 fat-aar-android 提供的第三方依賴設定,其功能主要為將多個AAR依賴包進行合併

2.1 使用場景

這裡對其使用總結如下:

  • 合併AAR:將引入API對應的AAR工程合併到該Moudle工程,打包成為一個全新的AAR;
  • 依賴不具傳導性:引入的API僅Moudle可見;

2.2 注意點

對於embed的使用,這裡不再進行驗證舉例,感興趣的朋友可自行驗證。但對於embed的使用,這裡需要強調一下注意點:

  • a、fat-aar-android 將不再維護更新
  • b、支援的版本範圍:AGP 3.0 - 7.1.0,Gradle 4.9 - 7.3;

三、一種場景處理

implementation、api、embed單獨使用,已經滿足我們大部分的使用場景,但假設有這一種情況:

  • 有三個Moudle:appLib_BLib_C
  • app 依賴 Lib_BLib_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

= THE END =

文章首發於公眾號」CODING技術小館「,如果文章對您有幫助,歡迎關注我的公眾號。