文档章节

api与implementation的区别

shzwork
 shzwork
发布于 07/08 16:54
字数 1167
阅读 7
收藏 0

一、从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、https://jeroenmols.com/blog/2017/06/14/androidstudio3/
2、https://www.jianshu.com/p/dd932f951137



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

本文转载自:https://www.jianshu.com/p/8962d6ba936e

shzwork
粉丝 15
博文 827
码字总数 18401
作品 0
厦门
私信 提问
Android Studio3.0中dependencies依赖由compile变为implementation的区别

前言 Android Studio版本更新至3.0了,更新后,连带着com.android.tools.build:gradle 工具也升级到了3.0.0,在3.0.0中使用了最新的Gralde 4.0 里程碑版本作为gradle的编译版本,该版本gradl...

SilenceOO
2017/12/06
0
0
Android Studio中Gradle依赖详解 - 知乎

一、不同类型的library引入方案: 1、本地Module library依赖: 通过这种方式依赖的弊端是每次都需要构建module,当module比较多时构建非常耗时,建议控制module的依赖数量,避免构建耗时 2、...

张明云的知识共享
昨天
0
0
implementation 和 api 的区别

Gradle plugin 3.0依赖方式增加了 implementation 和 api ,用以取代 compile. 有工程 A、B、C A 依赖 B (implementation、api 都可以) 若B implementation C A 不能调用 C 的方法 若 B api ...

Reiser实验室
2018/03/23
0
0
api与implementation的区别

一、从3.4版本的gradle开始,compile已经被api与implementation取代,官网也给出了三者之间的区别: 图1、api与implementation的区别 从官网介绍可以看出,implementation可以让module在编译...

亭子happy
02/14
29
0
【我的Android进阶之旅】Configuration 'compile' is obsolete and has been replaced with 'implementation' and

版权声明:本文为【欧阳鹏】原创文章,欢迎转载,转载请注明出处! 【http://blog.csdn.net/ouyang_peng】 https://blog.csdn.net/qq446282412/article/details/87712726 文章目录 一、问题描...

欧阳鹏
02/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JIT编程与方法内联

JIT的比较冷门,首先你要读一下这两篇 帖子: 《面向JIT编程-方法内联》 https://blog.csdn.net/u012834750/article/details/79488572 《浅谈对JIT编译器的理解》 https://www.cnblogs.com/...

爱吃窝窝头
27分钟前
4
0
基于TCP的RPC实现

RPC即远程服务调用 出现原因:随着项目越来越大,访问量越来越大,为了突破性能瓶颈,需要将项目拆分成多个部分,这样比起传统的项目都是本地内存调用,分布式的项目之间需要在网络间进行通信...

少年已不再年少
37分钟前
6
0
OSChina 周二乱弹 —— 他只能用这个办法劝你注意身体了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# Kodaline《High Hopes》 《High Hopes》- Kodaline 手机党少年们想听歌,请使劲儿戳(这里) @xiaoshiyue :仙女...

小小编辑
58分钟前
1K
21
Spring Boot Actuator 整合 Prometheus

简介 Spring Boot 自带监控功能 Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等。这一节结合 Prometheus 、Grafana 来更加直观...

程序员果果
今天
11
0
Linux文件查找命令详解

对于文件查找,我们最好用的还是属于find命令了,在说find命令之前,先把另外几个查找命令介绍一下。 目录 0x01 查询命令介绍 0x02 find命令介绍 0x01 查询命令介绍 在介绍之前,首先先了解一...

无心的梦呓
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部