最近使用 Android Studio 从事项目开发时,发现对 implementationapiembed 的用法了解的不是很清楚,这里准备一篇文章对其使用场景或者说是使用方式进行一个总结。

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是GradleAGP(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_Bimplementation方式引入gson依赖包:

  • e、AppMoudle无法引用gson相关API:

    得出第一个结论:依赖不具传导性,引入的API仅Moudle可见

  • f、反编译Lib_B的AAR包,其中不包含gson相关代码;反编译app.apk,其中包含gson相关代码。

    得出第二个结论:参与Moudle的编译、不参与对应AAR打包,但参与整体Apk打包

api

验证步骤及结论如下:

  • a、Lib_Bapi方式引入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:appLib_BLib_C
  • app 依赖 Lib_BLib_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的更多相关文章

  1. 一文详解Kafka API

    摘要:Kafka的API有Producer API,Consumer API还有自定义Interceptor (自定义拦截器),以及处理的流使用的Streams API和构建连接器的Kafka Con ...

  2. String 字符串详解 / 常用API

    String 详解 / 常用API 简介 String 是不可改变的字符串序列.String 为字符串常量 StringBuilder 与StringBuffer 均为可改变的字符串序列.为字符串变量 ...

  3. 一文详解Hexo+Github小白建站

    作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...

  4. 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)

    一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)     概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...

  5. 一文详解 OpenGL ES 3.x 渲染管线

    OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...

  6. 【JAVAEE学习笔记】hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户

    今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...

  7. API函数详解:API大全总目录(按字母排列)

    API函数详解 http://www.feiesoft.com/api/api.html

  8. JAVAEE学习——hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户

    今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...

  9. 一文详解 WebSocket 网络协议

    WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...

随机推荐

  1. 每天一个 HTTP 状态码 100

    100 Continue 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分:指示客户端应该继续当前请求:如果请求已经完成,客户端可以忽略该响应. 常用于服务器已经接受了请求头,客户端应该继续 ...

  2. 用t-SNE进行流形学习(digits数据集)

    流行学习算法: 是一类用于可视化的算法,它允许进行更复杂的映射,通常也可以给出更好的可视化. t-SNE算法是其中一种. PCA是用于变换数据的首选方法,也可以进行可视化,但它的性质(先旋转然后减少方 ...

  3. python3在使用类基础时,遇到错误TypeError: module.**init**() takes at most 2 arguments (3 given)

    python3在使用类基础时,遇到错误TypeError: module.init() takes at most 2 arguments (3 given) 1.原因:直接导入的py文件,而没有导入 ...

  4. C# 类继承中的私有字段都去了哪里?

    最近在看 C++ 类继承中的字段内存布局,我就很好奇 C# 中的继承链那些 private 字段都哪里去了? 在内存中是如何布局的,毕竟在子类中是无法访问的. 一:举例说明 为了方便讲述,先上一个例子 ...

  5. 10分钟快速部署camunda BPM开源版

    安装部署Camunda BPM有多种方式,基于Camunda独立web应用程序安装部署是最简单的一种方式,您只需要有tomcat即可. 本文档将指导您安装和配置Camunda独立web应用程序,快速体 ...

  6. 关于kali安装输入法

    之前老是被kali大小写输入恶心坏了,正好看到一篇文章写kali安装搜狗输入法的,虽然不需要输入中文,但是英文输入就很方便了. 一.切换root用户登录 1.sodu su切换为root权限 2.pa ...

  7. 让我们用Vue cli全家桶搭建项目

    一般项目都会用到这几个,这里不在详细介绍概念,只是简单的使用.一.搭建cli 1.事先安装好cnpm(淘宝镜像) npm install -g cnpm --registry=https://regi ...

  8. SAP 下拉框(选择屏幕)

    一.选择屏幕下拉框. DATA: g_vrmid TYPE vrm_id, "id of value set gt_vlist TYPE vrm_values, "internal ...

  9. docker安装报错failure: repodata/repomd.xml from mirrors.aliyun.com_docker-ce_linux_centos_docker-ce.pro

    1.进入 /etc/yum.repos.d 目录下,将所有有关 docker 的 repo 全部删掉 2.重新添加镜像 sudo yum-config-manager --add-repo https ...

  10. p_b_p_b 杂题选讲

    [ARC119F] AtCoder Express 3 [ARC117F] Gateau 考虑二分答案,对前缀和建差分约束 \(\text{check}\) ,但是用 \(\text{spfa}\) ...