gradle 的 implementation、api 和 compile

文章目录

    • 区别
    • 原因
    • 补充

区别

在 android gradle 插件 3.0 之前,我们使用 compile 来依赖第三方库或 module。

在 3.0 后,废弃了 compile,使用 implementationapi 来代替。

api 等同于 compile,意思是:我会把你暴露给第三方。

implementation 意思是:我不会把你暴露给第三方。

比如有三个 module,app、lib1、lib2,app 依赖于 lib1,lib1 依赖于 lib2。

如果是这样:

// app/build.gradle
implementation project(":lib1")

// lib1/build.gradle
implementation project(":lib2")

在 app 中是无法访问 lib2 的代码的。

如果是这样:

// app/build.gradle
implementation project(":lib1")

// lib1/build.gradle
api project(":lib2")

在 app 中就可以访问 lib2 的代码了。

原因

为什么要这么分呢?为了提高编译效率。

还用上面的例子来看:

// app/build.gradle
implementation project(":lib1")

// lib1/build.gradle
api project(":lib2")

这时 lib2 会暴露给 app,那 app 就有可能用到 lib2,所以 lib2 发生改变时,lib2、lib1、app 都需要重新编译一遍。

如果是这样:

// app/build.gradle
implementation project(":lib1")

// lib1/build.gradle
implementation project(":lib2")

这时 lib2 没有暴露给 app,那 app 一定没用到 lib2,所以 lib2 发生改变时,只有 lib2、lib1 需要重新编译一遍。

补充

// app/build.gradle
compile project(":lib1")

// lib1/build.gradle
compile project(":lib2")

在 android studio 升到 3.2.1 后,使用 android 插件版本 2.2.3,发现像上面这样,使用 compile 时 app 忽然引用不到 lib2 了。

只能在 app 中再依赖一遍才可以:

// app/build.gradle
compile project(":lib1")
compile project(":lib2")

// lib1/build.gradle
compile project(":lib2")

更新:该问题在 3.3 版本上已修复。

你可能感兴趣的:(Android,Gradle)