Android gradle中的apt依赖范围-它的用途是什么?

Android gradle中的apt依赖范围-它的用途是什么?,android,gradle,android-gradle-plugin,Android,Gradle,Android Gradle Plugin,我有时看到的android gradle文件中的apt依赖范围是什么 一个例子是这样的 apply plugin: 'com.android.application' apply plugin: 'com.neenbedankt.android-apt' android { compileSdkVersion 20 buildToolsVersion '20.0.0' defaultConfig { applicationId "org.ligboy.te

我有时看到的android gradle文件中的apt依赖范围是什么

一个例子是这样的

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
android {
    compileSdkVersion 20
    buildToolsVersion '20.0.0'
    defaultConfig {
        applicationId "org.ligboy.test.card.module1"
        minSdkVersion 14
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

final DAGGER_VERSION = '2.0.2'

dependencies {  
    compile "com.google.dagger:dagger:${DAGGER_VERSION}"
    apt "com.google.dagger:dagger-compiler:${DAGGER_VERSION}"//what is this scope 
    provided 'org.glassfish:javax.annotation:10.0-b28'
}
在顶级build.gradle文件中,它具有以下全局相关性:

buildscript { 
dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    }
}
注意,在依赖项部分有一个apt范围?我只知道编译、打包和提供的范围。编译 在编译时和包中包含依赖项,前提是仅在编译时包含库并在 打包时间,因此不包括在最终构建中。包是相反的,它在包中包含依赖项,而不是在编译时。 但是什么是apt依赖范围,我们显然需要com.neenbedankt.android-apt才能工作,所以我知道它是基于android的

更新: 为什么我不能使用提供的依赖范围而不是apt范围?它们有何不同

我为那些需要更多信息的人创建了一个教程

来自:

android apt插件与android Studio结合使用,有助于使用注释处理器。它有两个目的:

  • 允许将仅编译时注释处理器配置为依赖项,不包括最终APK或库中的工件

  • 设置源路径,以便Android Studio正确拾取从注释处理器生成的代码

您正在使用Dagger,它使用注释处理来生成代码。注释处理代码不应包含在最终APK中,您希望生成的代码对Android Studio可见
android apt
启用此行为

这听起来非常类似于
提供的
范围,但是
apt
在一些关键方面与
提供的
不同。第一个区别是,
apt
依赖项生成的代码可用于IDE,而由
提供的
依赖项生成的代码则不可用

另一个重要区别是,使用
提供的
范围的库中的代码位于IDE类路径上(即,您可以导入类并尝试使用它们),而
apt
依赖项中的代码则不在IDE类路径上。使用提供的
,如果您实际上没有为引用的依赖项提供
编译
作用域对应项,则代码将在运行时崩溃

您可以在上找到关于
apt
vs
的讨论

对于Dagger,应该没有理由在任何代码中包含注释处理器和代码生成器(提供的
范围允许)。因此,
apt
范围更合适

2016年10月更新: 您可能不再需要
apt
android apt
插件了。Android Gradle插件的2.2版有一个
annotationProcessor
配置,您应该改用它


有关如何在Studio 2.2+中更改此设置的详细信息,请参见

dependencies {
    compile 'com.google.dagger:dagger:2.4'
    annotationProcessor "com.google.dagger:dagger-compiler:2.4"
}
将此添加到应用程序渐变模块中。不需要改变任何其他东西


快乐编码:)

为什么在这种情况下我不能使用“提供”而不是apt?我想如果你回答的话,我会把事情弄清楚的。补充了对差异的解释。太棒了。我还使用gradle中提供的“org.glassfish:javax.annotation:10.0-b28”。你认为把它做成一个合适的范围会更好吗?这样就不会在代码中包含任何生成器,对吗?您当然可以尝试一下。但是,如果该依赖项实际上是在运行时使用的(例如,通过反射),并且是由另一个依赖项提供的,则您的应用程序可能会崩溃。