Before 3.0之前的依赖方式
provided:只在编译时使用,module只参与编译,不会打包到apk
compile :依赖module参与编译并且打包到最终的 apk 文件中
apk:只会打包到 apk 文件中,而不参与编译,所以不能再代码中直接调用 jar 中的类或方法,否则在编译时会报错
After 3.0 的依赖方式
api : module 编译时可用,module 的使用者编译和运行时可用,这个和过时的 compile 一样的。
implementation : module 编译时可用,module 的使用者运行时可用,对于大量使用 library 的项目,可以显著提高编译时间,因为它可以减少构建系统重新编译一些 module 。
那么什么时候用 api ,什么时候用 implementation 呢?由于公司项目采用的是组件化开发,有个 common module 需要被各个组件依赖,一开始采用的是 implementation ,结果发现会导致别的组件无法引用 common 中的库( common -> A module ,A module 无法引用 common 依赖的库 )。
试验过后得出结论,当这个 module 会被多次引用应该使用 api,不会被别的 module 引用使用 implementation 。
ompileOnly :替换了 provided
runtimeOnly: 替换了 apk
案例:引用framework.jar后报的错
参考https://www.jianshu.com/p/a25a85b6372d做的引用
由于没理解3.0.1的依赖关系的区别,默认 implementation依赖framework.jar,导致编译出错
com.android.builder.dexing.Dex Archive Merger Exception: Unable to merge dex
这类问题一般都是重复依赖导致,随后改了依赖方式为ompileOnly