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

Jac*_*cob 43 java dependencies android gradle android-studio

在向android项目中添加新的依赖项时尤其是Android StudioDependencies 有三个范围选项Compile/provided/APK中.

选择每一种产品有什么影响?我们应该何时使用它们?除了名字之外.

编辑:

"正确处理'提供'和'包'范围来做他们应该做的事情.'提供'和'包'不能与Android库一起使用,并且会产生错误"......这是来自http://工具. android.com/tech-docs/new-build-system

Kir*_*nov 42

  • provided - 仅编译时依赖项
  • package - 仅限包时间依赖
  • compile - 编译时和包时限

provided通常用于基于注释处理的库.通常这些库分为两个工件 - "注释"和"编译器"."编译器"是provided依赖项,因为您不需要在应用程序中使用它,仅用于编译; 和"注释"是compile依赖 - 它在应用程序代码中使用,因此编译.或者生成的代码可能需要额外的依赖关系,而您的应用程 例如dagger依赖配置:

compile 'com.squareup.dagger:dagger:1.2.2'
provided 'com.squareup.dagger:dagger-compiler:1.2.2'
Run Code Online (Sandbox Code Playgroud)


Kam*_*nek 36

这些属性来自maven范围.

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

  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/


aow*_*ows 16

泽维尔在这里讨论关于APK范围的问题.

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

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

它只会打包但不会在编译类路径上.

  • 我能想到的唯一场景是在运行时使用不同的实现来编译某种存根. (3认同)