区别
在 android gradle 插件 3.0 之前,我们使用 compile 来依赖第三方库或 module。
在 3.0 后,废弃了 compile,使用 implementation
和 api
来代替。
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 版本上已修复。