为什么Android会在Gradle依赖项中将“编译”更改为“实现”配置?

时间:2017-06-07 01:19:52

标签: android gradle android-gradle android-studio-3.0

如Android Studio 3.0(canary 3.0)所示,我们现在通过声明depedencies而不是implementation配置来添加compile

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

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

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

  • implementationcompile配置有什么区别?
  • 为什么Android Gradle构建更改以使用implementation作为默认值?

2 个答案:

答案 0 :(得分:28)

感谢来自@petter的真正有用的链接,我想添加如下摘要。

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

  1. API
  2.   

    应该用于声明由...导出的依赖项   库API

    例如,在您正在构建其他应用程序使用的Java(或Android)库的情况下。如果您使用任何第三方库并且想要将其API公开给您的库的消费者,您应该声明如下。

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

      应该用于声明内部的依赖项   成分

      在开发Android应用时,我们的app模块是终点,无需在外部公开任何部分。应该使用implementation

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

      之前的compile配置与api 的工作方式相同。但是,implementation带来了以下好处。

      • 依赖关系不会泄漏到使用者的编译类路径中 不再,所以你永远不会意外地依赖传递 依赖
      • 由于减少了类路径大小,编译速度更快
      • 实现依赖项更改时的重新编译次数减少: 消费者不需要重新编译
      • 清洁发布:与新的一起使用时 maven-publish插件,Java库生成的POM文件 准确地区分编译需要什么 库以及在运行时使用库所需的内容(在其他方面) 单词,不要混合编译库本身所需的内容和
        编译库需要什么。)

答案 1 :(得分:13)

似乎已弃用compile,而应使用apiimplementation。根据{{​​3}}:

  

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