Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android “什么是”呢;实施";在Kotlin Gradle dependencies中?_Android_Gradle_Android Gradle Plugin_Kotlin - Fatal编程技术网

Android “什么是”呢;实施";在Kotlin Gradle dependencies中?

Android “什么是”呢;实施";在Kotlin Gradle dependencies中?,android,gradle,android-gradle-plugin,kotlin,Android,Gradle,Android Gradle Plugin,Kotlin,我正在使用Android Studio 3.0预览版启动新的Kotlin项目。当我试图在build.gradle中添加依赖项时,我看到的是实现范围,而不是通常的编译 androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) impleme

我正在使用Android Studio 3.0预览版启动新的Kotlin项目。当我试图在
build.gradle
中添加依赖项时,我看到的是
实现
范围,而不是通常的
编译

androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'com.android.support:appcompat-v7:25.3.1'
testImplementation 'junit:junit:4.12'
还有
androidTestImplementation
testImplementation
范围

最后,我添加了
compile
,以添加第三方依赖项,它可以正常工作

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
所以我的问题是

  • 什么是
    实施
    androidTestImplementation
    测试实施
    范围
  • 它与
    compile
    testCompile
    androidTestCompile
    有什么不同吗
  • 我的Kotlin项目应该使用哪一个
编辑:
我的错,这个问题不是针对科特林的。这是新的。

这不是Kotlin特有的,但与Android的新Gradle插件有关

compile
提供的
apk
现在不推荐使用。
使用
implementation
api
代替
compile
compileOnly
代替提供的
,以及
runtimeOnly
代替
apk

这样做的原因是为了加快多模块构建。给定模块
A
,该模块依赖于模块
B
,而模块
C
,模块
C
中的更改也会触发模块
A
的重新编译。如果
A
不直接使用
C
,则
A
C
更改时无需重新编译

implementation
配置确保了这一点:如果在
B
中指定
implementation项目(':C')
,则无法从
A
访问
C
,并且可以避免构建不必要的模块。在大型多模块项目中,这可以节省大量时间


有关更多信息,请参见。

早期版本的
gradle v3.0.0-alpha1
用于使用
编译
,但现在已被弃用

为什么?

compile
配置中出现的依赖项将传递给库的使用者,因此将出现在使用者的编译类路径上。另一方面,在实现配置中找到的依赖项不会向使用者公开,因此不会泄漏到使用者的编译类路径中

让我们举个例子来理解这一点。比如说,我创建了一个
库\u Image\u Upload
,它支持
图像上传到服务器。我在
Library\u Image\u Upload
中使用了
Library\u Network
lib,它支持所有网络操作。我的库只使用图像上传,并提供了一种方便的上传图像的方式。现在,当我在我的
Library\u Image\u Upload
项目中使用
Library\u Network
lib时,使用此lib的每个人都将拥有
图像上传功能以及所有网络操作,有人也可能使用重要)。后来,我认为有一种更好的方法可以替代
Library\u Network
作为
Library\u Magic\u Image
,并使用了它。因此,
Library\u Network
公开的所有API函数都消失了,使用这些函数的人已经破坏了构建

实施
有几个好处:

  • 依赖项不再泄漏到使用者的编译类路径中,因此您永远不会意外地依赖于可传递依赖项
  • 由于减小了类路径大小,编译速度更快
  • 实现依赖项更改时减少重新编译:消费者不需要重新编译
  • Cleaner publishing:当与新的maven publish插件结合使用时,Java库会生成POM文件,这些文件能够准确区分针对库编译所需的内容和在运行时使用库所需的内容(换句话说,不要混淆编译库本身所需的内容和针对库编译所需的内容)
要了解更多,请阅读

所以我想你已经回答了这三个问题

我希望有帮助