为什么 Android 在 Gradle 依赖项中将 'compile' 更改为 'implementation' 配置?

Why Android change 'compile' to 'implementation' configuration in Gradle dependencies?

正如在 Android Studio 3.0 (Canary 3.0) 中看到的那样,我们现在通过声明 implementation 而不是 compile 配置来添加 depedencies

// Before
compile 'com.android.support:appcompat-v7:25.3.1'

// Currently
implementation 'com.android.support:appcompat-v7:25.3.1'

我们仍然可以使用compile,但我想了解:

似乎 compile 已被弃用,应该使用 apiimplementation 代替。根据The Java Library Plugin - Gradle User Guide Version 3.5:

The compile configuration still exists but should not be used as it will not offer the guarantees that the api and implementation configurations provide.

感谢@petter 非常有用的link,我想添加一个总结如下。

表示Android Gradle build开始使用java-library插件,而不是之前的java插件。这个插件引入了 exposed API 概念,用两个 configuration 来声明依赖关系。

  1. api

should be used to declare dependencies which are exported by the library API

例如,如果您正在构建一个供其他应用程序使用的 Java(或 Android)库。如果你使用任何第三方库并且你想将其 API 也暴露给你的库的消费者,你应该这样声明。

api 'commons-httpclient:commons-httpclient:3.1'
  1. 实施

should be used to declare dependencies which are internal to the component.

在开发Android应用程序时,我们的app模块是终点,不需要向外暴露任何部分。 implementation 应该被使用。

implementation 'org.apache.commons:commons-lang3:3.5'

之前的 compile 配置与 api 相同。然而,implementation 带来了以下好处。

  • 依赖项不会泄漏到消费者的编译类路径中 不再,所以你永远不会意外地依赖于传递 依赖性
  • 由于减小了类路径大小,编译速度更快
  • 实现依赖项更改时减少重新编译: 消费者不需要重新编译
  • cleaner publishing:与新版一起使用时 maven-publish 插件,Java 库生成
    的 POM 文件 准确区分根据
    编译所需的内容 库以及在运行时使用该库需要什么(在其他 话说,不要混淆编译库本身和
    所需的东西 针对库进行编译需要什么)。