一文详解 implementation api embed - xiaxveliang
source link: https://www.cnblogs.com/xiaxveliang/p/16571618.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
一文详解 implementation api embed
最近使用 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技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK