Gradle 依赖声明的 compile 早就已经被弃用了,取而代之的则是 implementationapi。之前一直以为两者的区别在于是否可以传递依赖。
现在仔细看了下文档,发现 implementation 的禁止“传递依赖”只是指编译时的,而被传递的依赖项仍然会被打到最终的包里,在运行时提供。这么做主要还是为了提升编译效率:进行依赖隔离,当单个模块发生变更之后,对其没有直接依赖的模块可以不用重新编译。

Gradle 里真正禁止”传递依赖“(编译时 + 运行时):

针对单个依赖 ModuleDependency.setTransitive(boolean)

1
2
3
4
5
dependencies {
implementation('com.google.guava:guava:23.0') {
transitive = false
}
}

针对 configuration Configuration.setTransitive(boolean)

1
2
3
configurations.all {
transitive = false
}

参考