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

  • 相关阅读:
    C++&QT day10
    C语言内存函数超详细讲解
    Linux系统Word转换PDF,文档字体乱码不显示问题解决。
    6、JVM-JVM调优工具与实战
    rancher安装
    文件系统(三):嵌入式、计算机系统启动流程与步骤
    ESP8266-Arduino编程实例-ISL29125 RGB颜色光传感器驱动
    3.1版本【HarmonyOS 第一课】正式上线!参与学习赢官方好礼>>
    【JVM】对象死亡判断
    一文讲清微服务架构、分布式架构、微服务、SOA
  • 原文地址:https://www.cnblogs.com/xiaxveliang/p/16571618.html