编译、提供、APK - Android 依赖范围

IT小君   2021-12-02T16:02:19

而尤其是在增加新的依赖于Android项目Android StudioDependencies 有三个作用域选项编译/供应/ APK。

选择每一种都有什么效果,我们应该什么时候使用它们?除了名字所说的。

编辑:

“正确处理 'provided' 和 'package' 范围以做他们应该做的事情。'provided' 和 'package' 不能与 Android 库一起使用,并且会产生错误”.. 这是来自http://tools。 android.com/tech-docs/new-build-system

评论(4)
IT小君
  • provided - 仅编译时依赖
  • package - 仅包时依赖
  • compile - 编译时和包时依赖

provided通常用于基于注释处理的库。通常这些库被分成两个工件——“注释”和“编译器”。“编译器”是provided依赖,因为你不需要在应用程序中使用它,只用于编译;并且“注释”是compile依赖项——它在应用程序代码中使用,因此可以编译。或者生成的代码可能需要额外的依赖项,而您的应用程序可能不需要。例如匕首依赖配置:

compile 'com.squareup.dagger:dagger:1.2.2'
provided 'com.squareup.dagger:dagger-compiler:1.2.2'
2021-12-02T16:02:19   回复
IT小君

这些属性来自mavenscopes

它们只是指示如何在构建过程的每个步骤中处理特定的依赖项。

  1. compile- 默认方法,它只是意味着所有依赖项都应该在编译时可用。编译依赖项在项目的所有类路径中都可用。此外,这些依赖关系会传播到依赖项目。运行时通常需要编译时依赖项。

  2. package- 声明用于构建应用程序的附加配置。您可以列出为构建过程添加附加功能的插件。

  3. provided- 这意味着运行时环境包含这些依赖项。例如,当您查看android.jar库内部结构时,您会java.lang.RuntimeException: Stub!在每个方法主体中看到

    这有一些后果:

    • 无需完整的Android环境,即可在本地开发Android应用。
    • 您的 APK 必须在 android 设备或模拟器上运行它,因为它们提供了这些方法的实现。
    • 引用 SDK 类的应用程序将正确构建,因为 jar 提供类元数据。
    • 除非您使用一些提供工件的库(例如Robolectric),否则您必须在模拟器/设备上运行测试。

provided并且package不能与 Android 库一起使用,并且会产生错误。

下面是它的sourceSet样子:

在此处输入图片说明

有关构建系统的更多信息:https : //www.youtube.com/watch?v=LCJAgPkpmR0

一篇关于 Gradle 的精彩文章:http : //www.sinking.in/blog/provided-scope-in​​-gradle/

2021-12-02T16:02:19   回复
IT小君

Xavier在这里谈到了APK范围。

在 Android 插件中,运行时的等效(某种)称为 apk。你可以做

依赖项 { apk 文件('libs/foo.jar')}

它只会被打包,但不会在编译类路径上。

2021-12-02T16:02:20   回复
IT小君

使用 gradle 6.5.1provided给出以下错误

Could not find method provided() for arguments [directory '....'] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

我曾经compileOnly只在编译时使用依赖项,而不是在最终构建工件中使用

2021-12-02T16:02:20   回复