小编典典

Gradle 中的 implementation、api 和 compile 有什么区别?

all

在更新到 Android Studio 3.0
并创建一个新项目后,我注意到build.gradle有一种新的方法可以添加新的依赖项,而不是compilethereimplementationtestCompilethere
testImplementation

例子:

 implementation 'com.android.support:appcompat-v7:25.0.0'
 testImplementation 'junit:junit:4.12'

代替

 compile 'com.android.support:appcompat-v7:25.0.0'
 testCompile 'junit:junit:4.12'

它们之间有什么区别,我应该使用什么?


阅读 230

收藏
2022-02-25

共1个答案

小编典典

tl;博士

只需更换:

  • compilewith implementation(如果你不需要传递性) 或api(如果你需要传递性)
  • testCompiletestImplementation
  • debugCompiledebugImplementation
  • androidTestCompileandroidTestImplementation
  • compileOnly仍然有效。它是在 3.0 中添加的,用于替换提供的而不是编译的。(provided当 Gradle 没有该用例的配置名称并以 Maven 提供的范围命名时引入。)

这是谷歌在 IO17 上宣布的Android Gradle 插件3.0带来的重大变化之一

compile配置现已弃用,应替换为implementationorapi

Gradle
文档
中:

dependencies {
    api 'commons-httpclient:commons-httpclient:3.1'
    implementation 'org.apache.commons:commons-lang3:3.5'
}

出现在api配置中的依赖将传递给库的消费者,因此将出现在消费者的编译类路径中。

implementation另一方面,在配置中找到的依赖项不会暴露给消费者,因此不会泄漏到消费者的编译类路径中。这有几个好处:

  • 依赖项不再泄漏到消费者的编译类路径中,因此您永远不会意外依赖传递依赖项
  • 由于类路径大小减小,编译速度更快
  • 实现依赖项发生变化时减少重新编译:消费者不需要重新编译
  • 更清洁的发布:当与新的 maven-publish 插件一起使用时,Java 库会生成 POM
    文件,这些文件可以准确区分针对库编译所需的内容和在运行时使用库所需的内容(换句话说,不要混合编译库本身所需的内容和针对库编译所需的内容)。

compile 配置仍然存在,但不应使用,因为它不会提供apiimplementation配置提供的保证。


注意: 如果您只在应用程序模块中使用库 - 常见情况 - 您不会注意到任何差异。
如果您有一个复杂的项目,其中的模块相互依赖,或者您正在创建一个库,您只会看到差异。

2022-02-25