3

一文详解 implementation api embed - xiaxveliang

 1 year ago
source link: https://www.cnblogs.com/xiaxveliang/p/16571618.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一文详解 implementation api embed

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

欢迎关注我的公众号

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK