一文详解 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协议 ...
随机推荐
- unity---2d游戏杂记
2d游戏制作的笔记 save Layout 增加配置 Packges文件夹 插件 调整视野 鼠标中键 拉近拉远 鼠标右键 平移 Alt+鼠标左键 移动视角 Pivot/Center 当前物体中心和多个 ...
- Spark: 单词计数(Word Count)的MapReduce实现(Java/Python)
1 导引 我们在博客<Hadoop: 单词计数(Word Count)的MapReduce实现 >中学习了如何用Hadoop-MapReduce实现单词计数,现在我们来看如何用Spark来 ...
- 解决WIN7无法安装高版本Node.js问题
网上很多文章都让去安装低版本node 由于业务需求,低版本node npm 有一些包支持的不好 npm出cb() never call 本着更新npm 顺带弄个高版本的node 单独更新npm npm ...
- Go微服务框架go-kratos实战03:使用 gorm 实现增删改查操作
一.简介 在上一篇文章 go-kratos实战02 中,详细介绍了用 kratos 编写项目代码的步骤.这篇就在上篇基础上,再结合 Go 数据库操作库 gorm 一步一步来实现一个简单的增删改查操作. ...
- Typora使用手册(小白入门级)
Typora软件的简单使用 1.简介 Typora是一款支持Markdown语法的文档编辑器 特点:功能强大.画面极简. 下载地址:https://typoraio.cn/ 2.基础设置 偏 ...
- Python Excel 操作
1.Excel Code import os import time import re import win32com.client def dealpath(pathname='') -> ...
- SAP FPM 相关包 APB_FPM_CORE
related interface: APB_FPM_COREAPB_FPM_CORE_4_EXT_SCAPB_FPM_CORE_INTERNALAPB_FPM_CORE_RESTRICTED
- SAP LUW 实现提交数据库更新
CALL FUNCTION 'TRANSACTION_BEGIN' IMPORTING transaction_id = lv_transaction_id. * 更新日志表 MODIFY zfit0 ...
- TopoLVM: 基于LVM的Kubernetes本地持久化方案,容量感知,动态创建PV,轻松使用本地磁盘
正文 研发测试场景下,一般追求的是一键快速起环境,横向动态复制,一人一套,随起随用,用完即走.作为使用方,其不用关心实际的物理资源是怎样的,环境起在哪里,只要声明自己的使用需求即可.但作为方案构建者以 ...
- 配置nginx多域名虚拟主机
1.先做域名映射,由于我们使用的是阿里云域名. 登录阿里云控制台-->域名与网站(万网)-->域名-->选择一个域名-->域名解析-->添加记录 配置静态资源下载转发: ...