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

时间:2015-02-12 08:38:05

标签: java android android-studio gradle dependencies

向android项目添加新的依赖项时,尤其是Android Studio中的Dependencies,有三个范围选项Compile / provided / APK。

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

编辑:

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

3 个答案:

答案 0 :(得分:42)

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

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

compile 'com.squareup.dagger:dagger:1.2.2'
provided 'com.squareup.dagger:dagger-compiler:1.2.2'

答案 1 :(得分:35)

这些属性来自maven scopes

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

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

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

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

    这有一些后果:

    • 您可以在本地开发Android应用程序,而无需完整的Android环境。
    • 您的APK必须在Android设备或模拟器上运行,因为他们提供这些方法的实现。
    • 引用SDK类的应用程序将正确构建,因为jar提供了类元数据。
    • 除非您使用某些提供工件的库(例如Robolectric),否则您必须在模拟器/设备上运行测试。
  4. providedpackage不能与Android库一起使用,并会生成错误。

    以下是sourceSet的样子:

    enter image description here

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

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

答案 2 :(得分:16)

Xavier与{strong> APK 范围讨论here

  

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

     

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

     

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