一文详解 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技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。
一文详解 implementation api embed的更多相关文章
- 一文详解Kafka API
摘要:Kafka的API有Producer API,Consumer API还有自定义Interceptor (自定义拦截器),以及处理的流使用的Streams API和构建连接器的Kafka Con ...
- String 字符串详解 / 常用API
String 详解 / 常用API 简介 String 是不可改变的字符串序列.String 为字符串常量 StringBuilder 与StringBuffer 均为可改变的字符串序列.为字符串变量 ...
- 一文详解Hexo+Github小白建站
作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...
- 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)
一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop) 概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...
- 一文详解 OpenGL ES 3.x 渲染管线
OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...
- 【JAVAEE学习笔记】hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户
今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...
- API函数详解:API大全总目录(按字母排列)
API函数详解 http://www.feiesoft.com/api/api.html
- JAVAEE学习——hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户
今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...
- 一文详解 WebSocket 网络协议
WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...
随机推荐
- 如何在 pyqt 中捕获并处理 Alt+F4 快捷键
前言 如果在 Windows 系统的任意一个窗口中按下 Alt+F4,默认行为是关闭窗口(或者最小化到托盘).对于使用了亚克力效果的窗口,使用 Alt+F4 最小化到托盘,再次弹出窗口的时候可能出现亚 ...
- Kafka消息的压缩机制
最近在做 AWS cost saving 的事情,对于 Kafka 消息集群,计划通过压缩消息来减少消息存储所占空间,从而达到减少 cost 的目的.本文将结合源码从 Kafka 支持的消息压缩类型. ...
- MySQL锁(乐观锁、悲观锁、多粒度锁)
锁 并发事务可能出现的情况: 读-读事务并发:此时是没有问题的,读操作不会对记录又任何影响. 写-写事务并发:并发事务相继对相同的记录做出改动,因为写-写并发可能会产生脏写的情况,但是没有一个隔离级别 ...
- 字节开源RPC框架Kitex的日志库klog源码解读
前言 这篇文章将着重于分析字节跳动开源的RPC框架Kitex的日志库klog的源码,通过对比Go原生日志库log的实现,探究其作出的改进. 为了平滑学习曲线,我写下了这篇分析Go原生log库的文章,希 ...
- redis客户端打不开 提示cannot connect to server dev.check log for details
我当前状况是redis客户端打不开,之前一直好好的(虽然作为一个程序员我不配说这句话,哈哈),但是我排查了我觉得所有的可能性,我用的阿里云的redis(还没有到购买到期时间),然后我就关闭了防火墙,你 ...
- 开源项目 PM 浅谈如何设计官网
有用户反馈进入官网首页光秃秃的一片,大家忙着做产品,忽略了官网的建设,惭愧惭愧. 确实,极简风格和极其简单还是有很大区别的. 旧的 Web 端 除了极其简单之外,它还有一个小问题, ...
- JS:比较运算符
比较运算符有如下: 1.== 等于: 值相等 var a = "0"; var b = 1; var c = 0; console.log(a==0); //true consol ...
- Python-基础知识汇集
1.列表 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可 代码理解:列表 ...
- 基于后端和爬虫创建的代理ip池
搭建免费的代理ip池 需要解决的问题: 使用什么方式存储ip 文件存储 缺点: 打开文件修改文件操作较麻烦 mysql 缺点: 查询速度较慢 mongodb 缺点: 查询速度较慢. 没有查重功能 re ...
- 没想到吧,Spring中还有一招集合注入的写法
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. Spring作为项目中不可缺少的底层框架,提供的最基础的功能就是bean的管理了.bean的注入相信大家都比较熟 ...