一文详解 implementation api embed

简介: **implementation:**+ 依赖`不具传导性`,引入的API仅Moudle可见; + `参与Moudle的编译、不参与对应AAR打包`,但参与整体Apk打包;**api:**+ 依赖`具备传导性`,依赖该Moudle的其他Moudle也可调用引入的API; + `参与Moudle的编译、不参与对应AAR打包`,但参与整体Apk打包;**embed:**+ `合并AAR`:将引入API对应的AAR工程合并到该Moudle工程,打包成为一个全新的AAR; + 依赖`不具传导性`:引入的API仅Moudle可见;

最近使用 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官方文档描述如下:

AndroidStudio官方描述

  • Gradle官方文档描述如下:

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工程;

Android_Test验证工程

  • d、Lib_Bimplementation方式引入gson依赖包:

Lib_B以implementation方式引入gson

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

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

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

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

api

验证步骤及结论如下:

  • a、Lib_Bapi方式引入gson依赖包:

Lib_B以api方式引入gson

  • b、AppMoudle可引用gson相关API:

得出第一个结论:依赖具备传导性,依赖该Moudle的其他Moudle也可调用引入的API
App Moudle可引用 gson 相关API

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

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

二、embed

embed 是GitHub开源工程 fat-aar-android 提供的第三方依赖配置,其功能主要为将多个AAR依赖包进行合并
embed合并aar

fat-aar-android

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;

embed使用注意点

三、一种场景处理

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')
}

可同时采用api与embed配置依赖

参考

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技术小馆“,如果文章对您有帮助,欢迎关注我的公众号。

目录
相关文章
|
2月前
|
API iOS开发 开发者
Snapchat API 访问:Objective-C 实现示例
Snapchat API 访问:Objective-C 实现示例
|
3月前
|
Java
Java常用API-Runtime
Java常用API-Runtime
|
3月前
|
Java
Java常用api-Data
java常用api-Data
|
3月前
|
JSON Java API
【Azure API 管理】通过Java APIM SDK创建一个新的API,如何为Reqeust的Representation设置一个内容示例(Sample)?
【Azure API 管理】通过Java APIM SDK创建一个新的API,如何为Reqeust的Representation设置一个内容示例(Sample)?
|
3月前
|
人工智能 自然语言处理 前端开发
LangChain 构建问题之Gorilla处理带有约束条件的API调用如何解决
LangChain 构建问题之Gorilla处理带有约束条件的API调用如何解决
39 0
|
3月前
|
API 开发工具
langchain 入门指南(一)- 准备 API KEY
langchain 入门指南(一)- 准备 API KEY
234 0
|
存储 JSON 缓存
Elasitcsearch High Level Rest Client学习笔记(二) 基础API - 木子H的个人空间 - OSCHINA
Elasitcsearch High Level Rest Client学习笔记(二) 基础API - 木子H的个人空间 - OSCHINA
|
API Android开发
关于安卓api、implementation、compile的区别
关于依赖第三方库,有三种方式,分别是api、implementation、compile,在同一个module下面,这三种的作用都是一样的,但是在高版本的API中,使用compile会发现,compile被画上了横线,甚至编译不通过,说明在高版本中,compile已经被废弃了。也就是目前来说,只剩下api、implementation。
435 0
|
API
Gradle中implementation和api的区别
api关键字与旧的compile关键字完全相同。因此,如果用api替换了所有的compile,是完全ok的
339 0