Android “什么是”呢;实施";在Kotlin Gradle dependencies中?
我正在使用Android Studio 3.0预览版启动新的Kotlin项目。当我试图在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
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文件,这些文件能够准确区分针对库编译所需的内容和在运行时使用库所需的内容(换句话说,不要混淆编译库本身所需的内容和针对库编译所需的内容)
要了解更多,请阅读
所以我想你已经回答了这三个问题
我希望有帮助