api与Implementation区别

作者: 蚍蜉一生 | 来源:发表于2021-08-16 21:29 被阅读0次

    上官方链接

    https://developer.android.com/studio/build/dependencies

    来官方截图

    api与implementation.png

    翻译与解释

    implementation

         Gradle 会将依赖项添加到编译类路径,并将依赖项打包到构建输出。不过,当您的模块配置 implementation 依赖项时,会让 Gradle 了解您不希望该模块在编译时将该依赖项泄露给其他模块。也就是说,其他模块只有在运行时才能使用该依赖项。使用此依赖项配置代替 api 或 compile(已弃用)可以显著缩短构建时间,因为这样可以减少构建系统需要重新编译的模块数。例如,如果 implementation 依赖项更改了其 API,Gradle 只会重新编译该依赖项以及直接依赖于它的模块。大多数应用和测试模块都应使用此配置。|

    api

         Gradle 会将依赖项添加到编译类路径和构建输出。当一个模块包含 api 依赖项时,会让 Gradle 了解该模块要以传递方式将该依赖项导出到其他模块,以便这些模块在运行时和编译时都可以使用该依赖项。此配置的行为类似于 compile(现已弃用),但使用它时应格外小心,只能在您需要以传递方式导出的依赖库中使用它,所以主工程一般是使用不上这个的。这是因为,如果 api 依赖项更改了其外部 API,Gradle 会在编译时重新编译所有有权访问该依赖项的模块。因此,拥有大量的 api 依赖项会显著增加构建时间。除非要将依赖项的 API 公开给没有直接依赖的模块,否则库模块应改用 implementation 依赖项

    示例

         我们主工程模块为A,我们三方库lib-c、lib-d、lib-d放入到一个基础库集合lib-b中,那么我们是希望A只引入一个基础库lib-b,就可以使用众多的基础库,那么我们在A的build.gradle中就这样写:

    implementation project(':lib-b')
    

    在lib-b的build.gradle中这样写:

    api project(':lib-c')
    api project(':lib-d')
    api project(':lib-e')
    

    如果lib-c发生了修改,那么lib-b和主工程A都需要重新编译。所以我们要自己检查各个库里面的api引入,是否是真的把lib-b引入的库lib-c暴露给它的上级A,如果不需要那么就换成implementation。

    相关文章

      网友评论

        本文标题:api与Implementation区别

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