Gradle中的实现和编译有什么区别?

更新到android studio 3.0并创建一个新的项目后,我注意到,在build.gradle有一个新的方法来添加新的依赖关系,而不是compileimplementation

而不是testCompiletestImplementation

例如:

  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' 

他们之间有什么区别,我应该使用什么。

这是Gradle推出的突破性改变之一:Google 在IO17 Gradle 3.0版中宣布的 3.0版

compile配置现在不推荐使用 ,应该用implementationapi替换

从gradle文档 :

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

出现在api配置中的依赖关系将被传递给图书馆的消费者,因此会出现在消费者的编译类路径中。

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

  • 依赖关系不会泄漏到消费者的编译类路径中,所以您将永远不会意外地依赖于传递依赖项
  • 更快的编译感谢减少的类路径大小
  • 当实现依赖关系发生变化时,重新编译会更少:消费者不需要重新编译
  • 清理器发布:当与新的maven-publish插件结合使用时,Java库会生成POM文件,这些文件可以精确地区分编译库所需的内容和运行时使用库所需的内容(换句话说,不要混合编译图书馆本身所需要的东西,以及对图书馆编译所需的东西)。

编译配置仍然存在,但不应该使用,因为它不会提供api和实现配置提供的保证。


TL;博士:
只要用implementation替换compile ,用debugImplementation compile ,用debugImplementation compile testCompiletestImplementation compile androidTestImplementation

Compile配置已被弃用,应该由implementationapi替换。

您可以在https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation中阅读文档。

简要的部分是 –

标准Java插件和Java库插件之间的主要区别在于后者引入了暴露给消费者的API的概念。 库是一个Java组件,意味着被其他组件所使用。 在多项目构建中,这是一个非常常见的用例,但是一旦有外部依赖项,也是如此。

该插件公开了两个可用于声明依赖关系的配置:api和实现。 应该使用api配置来声明由库API导出的依赖关系,而应该使用实现配置来声明组件内部的依赖关系。

有关更多解释,请参阅此图像。 简单的解释