最近使用 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
implementation、api是Gradle
与AGP
(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_B
Moudle工程;
- d、
Lib_B
以implementation
方式引入gson
依赖包:
- e、
App
Moudle无法引用gson
相关API:
得出第一个结论:依赖不具传导性,引入的API仅Moudle可见
- f、反编译
Lib_B
的AAR包,其中不包含gson相关代码;反编译app.apk
,其中包含gson相关代码。
得出第二个结论:参与Moudle的编译、不参与对应AAR打包,但参与整体Apk打包
api
验证步骤及结论如下:
- a、
Lib_B
以api
方式引入gson
依赖包:
- b、
App
Moudle可引用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:
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#sec:java_library_separation
= THE END =
文章首发于公众号”CODING技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。