一、从3.4版本的gradle开始,compile已经被api与implementation取代,官网也给出了三者之间的区别:

图1、api与implementation的区别

从官网介绍可以看出,implementation可以让module在编译时隐藏自己使用的依赖,但是在运行时这个依赖对所有模块是可见的。而api与compile一样,无法隐藏自己使用的依赖。 具体通过例子来看,下图为项目结构:

项目结构图

app依赖模块mylibrary1、mylibrary1依赖模块mylibrary3 mylibrary1如下: package com.example.mylibrary1; /**

  • @author heshufan
  • @date 2018/8/9. */ public class MyClass1 { public static String get(){ return "MyClass1"; } } mylibrary3如下:

package com.example.mylibrary3; /**

  • @author heshufan
  • @date 2018/8/13. */ public class MyClass3 { public static String get(){ return "MyClass33"; } } 当mylibrary1 使用api依赖mylibrary3时,

api project(':mylibrary3') 在App中可以直接调用MyClass3类,也就是依赖可以传递。

package com.example.heshufan.learnapiandimp; import com.example.mylibrary1.MyClass1; import com.example.mylibrary3.MyClass3; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyClass1.get0(); MyClass3.get(); } } 当mylibrary1使用implemention依赖mylibrary3时,

implementation project(':mylibrary3') 在App中,无法直接调用mylibrary3

无法直接调用MyClass3

从上面的例子可以看出,在多module中,implementation确实可以起到隐藏依赖的作用,网上很多的文章都只讲到了这点,那么这样做的目的是什么呢?其实这并不是Google设计implemention与api的目的,因为官方文档中说这样设计的目的在于减少build的时间,那么implemention是如何减少build time的呢?

二、我们再新建一个module:mylibrary4,现在的项目结构如图:

项目结构图

那么现在的项目层级如下图所示:

项目依赖层级图

1、如果mylibrary3使用api依赖mylibrary4,那么当mylibrary4发生变化时,编译需要重新编译mylibrary4、mylibrary3、mylibrary1; 2、如果mylibrary3使用implemention依赖mylibrary4,那么当mylibrary4发生变化时,编译需要重新编译mylibrary4、mylibrary3,这个时候不需要编译mylibrary1,这样就可以节约build time; 为此我验证了两种依赖下项目的build time,每次重新编译前clean project,改变mylibrary4,然后rebuild project,再查看build time。

使用implemention的build time:

implementation

使用api的build time

1api.jpg

可以看到api的build time比implemention多了1秒多,多次运行都多了1秒多,这还是在module比较小的情况下。如果包比较多,比较大,那么可以节约的时间是非常可观的。 总结起来:如果api依赖,一个module发生变化,这条依赖链上所有的module都需要重新编译;而implemention,只有直接依赖这个module需要重新编译。 三、现在在回过头来看一下依赖传递的问题,之前验证了使用implemention,app不能拿到MyClass3,这是在本地依赖的情况下,而现在的模块化开发多采用远程依赖的模式进行合作。那么如果采用maven远程依赖呢? 同样采用之前的例子,我们新建一个module :mylibrary2

mylibrary2

我们将其上传到我们的本地maven

maven仓库

最后在mylibrary1中利用implemention依赖mylibrary2 //mylibrary1 implementation 'com.example:mylib:1.0.3' 然后我们再将mylibrary1上传到本地maven,然后在app中远程依赖mylibrary1

//mylibrary2
implementation 'com.example:myClass2:1.0.0'
复制代码

也就是app远程implementation mylibrary1,mylibrary1远程implemention mylibrary2,这时候app就可以直接拉到mylibrary2中的myClass2类(命名不规范,别学我)

没有报错 而如果app本地implementation mylibrary1,mylibrary1远程implemention mylibrary2,这时候app则不能获取到mylibrary2中的myClass2类,依然起到了依赖隔离的作用。

由以上可以看到在全部远程依赖模式下,无论是api还是implemention都起不到依赖隔离的作用。不过,在远程依赖模式下,依赖的一个模块如果版本发生变化,implemention与api的构建速度谁快谁慢还需要进一步研究。

综上,在多层次模块化(大于等于三层module)开发时,如果都是本地依赖,implementation相比api,主要优势在于减少build time。如果只有两层module,api与implemention在build time上并无太大的差别。

参考资料: 1、jeroenmols.com/blog/2017/0… 2、www.jianshu.com/p/dd932f951…

作者:一杉先生 链接:www.jianshu.com/p/8962d6ba9… 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

api与implementation的区别相关推荐

  1. api 与 implementation 的区别

    gradle 从 3.4 开始,compile 已经被废弃了,取而代之的是 api | implementation,俩个我们都可以用,但是肯定还是有区别的: api - 本地依赖时依赖不隔离,但是编 ...

  2. api网关和esb区别_具有ESB,API管理和Now .. Service Mesh的应用程序网络功能。

    api网关和esb区别 我最近谈论了微服务模式的演变,以及来自Lyft的Envoy之类的服务代理如何帮助将弹性,服务发现,路由,指标收集等责任推到应用程序下一层. 否则,我们冒着希望并祈祷各种应用程序 ...

  3. 软件开发:API和SDK的区别与联系

    目录 一.API 1.发展由来 2.概念 3.应用案例 4.分类 二.SDK 1.概念 三.API和SDK的区别与联系 一.API 1.发展由来 随着软件规模的日益庞大,常常需要把复杂的系统划分成小的 ...

  4. api 和 implementation的不同点

    api和implementation两种依赖的不同点在于:它们声明的依赖其他模块是否能使用. api:当其他模块依赖于此模块时,此模块使用api声明的依赖包是可以被其他模块使用 implementat ...

  5. API:什么是API?API与interface的区别

    我们都知道,API就是接口,那是什么鬼呢? 1.什么是API? api接口开发,其实和平时开发逻辑差不多:但是也有略微差异: 平时使用mvc开发网站的思路一般是都 由控制器 去 调用模型,模型返回数据 ...

  6. gradle compile mysql_Gradle配置implementation、api与compile的区别

    自Gradle 3.4开始,compile被废弃,取而代之的是implementation和api两个配置项. 掌握这三者的区别实际上就是要清楚什么情况使用implementation替换compil ...

  7. Android Studio3.0中dependencies依赖由compile变为implementation的区别

    前言 Android Studio版本更新至3.0了,更新后,连带着com.android.tools.build:gradle 工具也升级到了3.0.0,在3.0.0中使用了最新的Gralde 4. ...

  8. SDK与API的联系与区别

    在手机App的世界里,法规条文里所谓的"第三方应用或服务"是个看得见摸不着的存在.但事实上,不管是你每天收到的新闻推送,还是促销活动广告,甚至短信验证码,都有可能出自第三方之手. ...

  9. webservice接口和http接口(API接口)的区别

    web service(SOAP)与HTTP接口的区别: 什么是web service? 答:soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为 ...

最新文章

  1. CentOS 6.6 x86_64升级内核到最新版2.6.32-642.3.1.el6.x86_64
  2. 射灯安装方法图解_客厅适合用射灯做基础照明吗?又该如何布灯?
  3. request.getRequestDispatcher()的两个方法forward()/include()!!!
  4. python输入法引擎_Bigram-MLE语言模型和模拟输入法的python实现
  5. HDFS Java API 实践
  6. Python面试题之下面代码会输出什么
  7. 手机不ROOT使用xposed框架-微信群同步-微咖讲师-安装教程
  8. 如何使用代理服务器上网,从基础到高手--转
  9. mysql触发器新增或修改_mysql触发器实例 插入数据前更改数据值
  10. keil C51代码优化等级介绍
  11. 什么是数据库?什么是数据库管理系统?
  12. 二维码名片的生成与读取
  13. CVPR2021:Found a Reason for me? Weakly-supervised Grounded Visual Question Answering using Capsules
  14. 使用wandb报错:ERROR Error while calling WB API: project not found (<Response [404]>)
  15. elasticsearch7.6 词频统计
  16. DPDK内存管理二:初始化
  17. android 页面默认不弹软键盘_Android避免进入页面自动弹出软键盘(真正好用)
  18. python计算器基础知识_Python基础知识+计算器练习
  19. APP性能测试——基于手机的专项测试
  20. Android获取通讯录联系人,右侧字母滑动索引

热门文章

  1. STP/RSTP/MSTP协议简介
  2. myeclipse写简单bbs代码_RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?...
  3. clr 面试_Java中高级面试题及答案
  4. 中山服务器维修点,中山存储服务器
  5. oracle数据库怎么删除数据库,oracle数据库如何删除 oracle数据库删除方法
  6. input python 验证int_全国计算机二级Python真题解析-1
  7. python中size的用法_在Python中PyArray_SIZE的正确用法是什么?
  8. matlab向量的角标,【MATLAB】利用冒号表达式获得子矩阵
  9. 计算机应用基础二00018,2019年10月自学考试00018《计算机应用基础》试题(二)
  10. 学计算机去大工中大,厦门大学和大连理工大学你 选哪个?哪个好。厦门大学和东南大学、天津大学、武汉大学、中山大学去那个...