api与implementation的区别

一、从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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • 我会保持初心 我也会让身边朋友戒烟
    还需要记得阅读 99评论 0 0
  • 榆钱儿,榆树到了春天先要长榆钱儿。以前我们那里家家都用榆钱做苦累吃。苦累是用棒子面和榆钱搅和一起,蒸熟吃。我理解是...
    刘现辉民俗画阅读 1,161评论 1 2