一文详解 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_BMoudle工程;

- d、
Lib_B以implementation方式引入gson依赖包:

- e、
AppMoudle无法引用gson相关API:
得出第一个结论:依赖不具传导性,引入的API仅Moudle可见

- f、反编译
Lib_B的AAR包,其中不包含gson相关代码;反编译app.apk,其中包含gson相关代码。
得出第二个结论:参与Moudle的编译、不参与对应AAR打包,但参与整体Apk打包

api
验证步骤及结论如下:
- a、
Lib_B以api方式引入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:
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协议 ...
随机推荐
- while和for循环的补充与数据类型的内置方法(int, float, str)
目录 while与for循环的补充 while + else 死循环 while的嵌套 for补充 range函数 break与continue与else for循环的嵌套 数据类型的内置方法 int ...
- 微信小程序避坑指南——echarts层级太高/层级遮挡
问题:小程序中echarts因为小程序原生的canvas层级太高,而导致弹窗这类dom元素无法遮挡住canvas,如下图: 解决方案1:(wx:if控制dom显隐,显示canvas就重新渲染echar ...
- C++:最大子数组差
最大子数组差 内存限制:128 MiB 时间限制:1000 ms 题目描述: 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B) ...
- jeecgboot-vue3笔记(九)——treeSelect树形选择组件的使用(异步加载)
使用效果 初始化加载顶层节点,点击各层的>加载该节点的子节点,加载后>标识去除不再重复加载. 前端代码 vue ant-design组件 tree-data,树节点,children方式或 ...
- 联发科 (MTK) sensor bring up
MT6768平台 1.添加驱动文件 2.添加硬件配置支持 3.添加硬件配置 4.添加编译配置 5.分配空间(非必要,当代码量超过当前空间大小时将会报错,根据报错log改大小即可.) 6.兼容配置 7. ...
- 一文带你搞懂 JWT 常见概念 & 优缺点
在 JWT 基本概念详解这篇文章中,我介绍了: 什么是 JWT? JWT 由哪些部分组成? 如何基于 JWT 进行身份验证? JWT 如何防止 Token 被篡改? 如何加强 JWT 的安全性? 这篇 ...
- 3.shell脚本循环试题
shell脚本循环试题 1.计算从1到100所有整数的和 #!/bin/bash a=0 for i in {1..100} #1到100 #每次循环变量i的值也为循环次数 do a=$[ $a + ...
- 适配抖音!三角面转换和3d模型体量减小,轻量化一键即可完成!
抖音3d特效,可谓是越来越火爆了,这个有着迪士尼画风的3D大眼,就刷屏了国内外用户的首页! 有人好奇这些特效究竟是怎么制作的?其实就是把3D模型调整适配到头部模型上,调整位置或者大小就可以制作出一个简 ...
- (win环境)使用Electron打造一个桌面应用翻译小工具
初始化项目 npm init 修改package.json {"name": "trans","version": "1.0.0& ...
- 安装@parcel/transformer-image注意的问题
安装前配置 npm config get cache 键入以上命令即可找到npm缓存路径,然后找到路径下的_libvips文件夹. 一般需要以下两个文件,这里以win环境为例.把文件放到_libvip ...