Android科普知识库Android开发经验谈简友广场

api与Implementation区别

2021-08-16  本文已影响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。

上一篇 下一篇

猜你喜欢

热点阅读