Android Gradle实现与CompileOnly性能

时间:2017-10-04 03:18:49

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

The docs提到implementationcompile / api提供了显着的构建时间改进。那么compileOnly呢?

我的用例是一个多模块(抱歉,我不喜欢Gradle的多项目术语)项目,我有一个Android应用程序,以及该应用程序所依赖的多个库(implementation)。一些图书馆也相互依赖。在声明库模块中的依赖项时,我应该使用implementation还是compileOnly?我的app模块将使用implementation来依赖这些工件,因此我不需要它们通过库模块传递。

2 个答案:

答案 0 :(得分:20)

api配置应该用于导出到外部modules (传递依赖性)的依赖项。副Versa implementation配置应该用于组件内部的依赖关系(不是传递依赖)

实施与compileOnly

他们的工作没有相似之处,compileOnly

  • 从java-plugin继承的配置
  • 在编译时需要
  • 也不包含在运行时类路径中或暴露给依赖项 项目。

因此compileOnly不会替换implementation配置作业,例如:

implementation 'com.android.support:appcompat-v7:25.1.0' // can't use compileOnly here
testCompile 'junit:junit:4.12'

compile "com.google.dagger:dagger:2.8" // can't use here also
annotationProcessor "com.google.dagger:dagger-compiler:2.8" // can't use here also
compileOnly 'javax.annotation:jsr250-api:1.0' // we can use compileOnly here because it's required on run time only.

由于您的案例是"多模块",您必须使用api配置,在您到达最终模块之前,最好使用implementation

下图描述了这些配置:

enter image description here

<强>性能吗

我认为api需要更多内存,因为 gradle 会对传递 模块中的每个类进行快照,反之亦然{{1是一个首选配置,因为(如上所述)它用于自己的内部实现。

答案 1 :(得分:6)

在Android Gradle插件3.0中,现已弃用compile关键字,而推荐使用implementationapi

  • api:您通过自己的接口泄漏了此模块的接口,其含义与旧的compile依赖项完全相同

  • implementation:您仅在内部使用此模块,不会通过界面泄漏它

详细了解api与实现herehere

compileOnly依赖项的功能类似于provided,从而允许您声明仅在编译时使用的非传递性依赖项。

仅编译依赖性解决了许多用例,包括:

  • 在编译时需要依赖,但在运行时则不需要, 例如仅源注释或注释处理器;
  • 在编译时需要但在运行时才需要的依赖 使用某些功能时,也称为optional dependenciesusing it);
  • 在编译时需要其API的依赖项 实施将由使用方库,应用程序提供 或运行时环境。

仅编译依赖性与常规编译依赖性明显不同。它们不包含在运行时类路径中,并且是非传递性的,这意味着它们不包含在相关项目中。

在此处了解更多-https://blog.gradle.org/introducing-compile-only-dependencies