美文网首页
api与implementation的区别

api与implementation的区别

作者: 瑜小贤 | 来源:发表于2020-03-29 18:24 被阅读0次

    一. 关于引用的区别。

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

    api与implementation的区别
    从官网介绍可以看出,implementation可以让module在编译时隐藏自己使用的依赖,但是在运行时这个依赖对所有模块是可见的。而apicompile一样,无法隐藏自己使用的依赖

    具体通过例子来看,下图为项目结构:


    项目结构

    app依赖模块mylibrary1、mylibrary1依赖模块mylibrary3
    mylibrary1如下:

    package com.example.mylibrary1;
    
    public class MyClass1 {
        public static String  get(){
            return "MyClass1";
        }
    }
    

    mylibrary3如下:

    package com.example.mylibrary3;
    
    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设计implementationapi的目的,因为官方文档中说这样设计的目的在于减少build的时间,那么implementation是如何减少build time的呢?

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


    项目结构

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


    项目依赖层级图
    1. 如果mylibrary3使用api依赖mylibrary4,那么当mylibrary4发生变化时,编译需要重新编译mylibrary4、mylibrary3、mylibrary1;
    2. 如果mylibrary3使用implementation依赖mylibrary4,那么当mylibrary4发生变化时,编译需要重新编译mylibrary4、mylibrary3,这个时候不需要编译mylibrary1,这样就可以节约build time;

    为此我验证了两种依赖下项目的build time,每次重新编译前clean project,改变mylibrary4,然后rebuild project,再查看build time。

    使用implementation的build time 使用api的build time

    可以看到api的build time比implementation多了1秒多,多次运行都多了1秒多,这还是在module比较小的情况下。如果包比较多,比较大,那么可以节约的时间是非常可观的。
    总结起来:如果api依赖,一个module发生变化,这条依赖链上所有的module都需要重新编译;而implementation只有直接依赖这个module需要重新编译

    三. 关于maven远程依赖

    现在在回过头来看一下依赖传递的问题,之前验证了使用implementation,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远程implementation mylibrary2,这时候app就可以直接拉到mylibrary2中的myClass2类(命名不规范,别学我)

    没有报错

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

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

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

    感谢:https://www.jianshu.com/p/8962d6ba936e

    相关文章

      网友评论

          本文标题:api与implementation的区别

          本文链接:https://www.haomeiwen.com/subject/kmpuuhtx.html