api 和 implementation 区别
官网
implementation
Gradle 会将依赖项添加到编译类路径,并将依赖项打包到构建输出。不过,当您的模块配置 implementation 依赖项时,会让 Gradle 了解您不希望该模块在编译时将该依赖项泄露给其他模块。也就是说,其他模块只有在运行时才能使用该依赖项。
使用此依赖项配置代替 api 或 compile(已弃用)可以显著缩短构建时间,因为这样可以减少构建系统需要重新编译的模块数。例如,如果 implementation 依赖项更改了其 API,Gradle 只会重新编译该依赖项以及直接依赖于它的模块。大多数应用和测试模块都应使用此配置。
api
Gradle 会将依赖项添加到编译类路径和构建输出。当一个模块包含 api 依赖项时,会让 Gradle 了解该模块要以传递方式将该依赖项导出到其他模块,以便这些模块在运行时和编译时都可以使用该依赖项。
此配置的行为类似于 compile(现已弃用),但使用它时应格外小心,只能对您需要以传递方式导出到其他上游消费者的依赖项使用它。 这是因为,如果 api 依赖项更改了其外部 API,Gradle 会在编译时重新编译所有有权访问该依赖项的模块。 因此,拥有大量的 api 依赖项会显著增加构建时间。除非要将依赖项的 API 公开给单独的模块,否则库模块应改用 implementation 依赖项。
从 Gradle 3.4 开始,compile 已经过时,取而代之的是 api 和 implementation,两者最大的区别是依赖程度的不同,api 和 compile 一样是强依赖,当主模块使用 api 依赖库时,这个库所依赖的库中类是可见的,而 **implementation 是弱依赖,**刚好和 api 相反。在编译时间上看, implementation 相对 api 会快一些,因为它不需要对库中依赖的库进行编译时检查,所以一般情况下我们选用 implementation 来依赖第三方库。
-
implementation类似于“praivte”,module引用implementation只应用于自身,其他module如果dependency该module,无法使用implementation表明的路径。
-
api类似于“public”,其他module如果dependency该module,可以使用implementation表明的路径。也就跟compile类似。
更多
implementation和api的区别
implementation、api、compileOnly区别详解