我有一个使用注释处理器(Android Annotations)生成代码的Gradle构建脚本。建筑很好,直到我添加了一个新的Pro风味。我可以构建风味,但是当我构建风味时,注释处理器不运行。这会导致缺少代码并且构建失败。Gradle + Annotations + Flavors =不会运行注释处理器
这里是我的脚本:
Note: Starting AndroidAnnotations annotation processing
在构建:
buildscript {
repositories {
maven { url 'http://repo1.maven.org/maven2' }
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}
ext.androidAnnotationsVersion = '3.0-SNAPSHOT';
configurations {
apt
}
dependencies {
compile files('libs/android-support-v13.jar')
compile fileTree(dir: 'libs', include: '*.jar')
apt "org.androidannotations:androidannotations:${androidAnnotationsVersion}"
compile "org.androidannotations:androidannotations-api:${androidAnnotationsVersion}"
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 7
targetSdkVersion 17
versionCode 29
versionName "2.0.3"
packageName "com.MyCompany.MyApp"
}
productFlavors {
free {
buildConfig "final public static boolean PRO_VERSION = false;"
}
pro {
packageName "com.MyCompany.MyApp.Pro"
versionName (versionName + ".Pro")
buildConfig "final public static boolean PRO_VERSION = true;"
}
}
buildTypes {
release {
buildConfig "final public static String BASE_URL = \"http://data.MyCompany.com/\";", \
"final public static String APP_NAME = \"com.MyCompany.MyApp\";"
}
debug {
buildConfig "final public static String BASE_URL = \"http://192.168.1.15/GDM/\";", \
"final public static String APP_NAME = \"com.MyCompany.MyApp\";"
}
}
}
def getSourceSetName(variant) {
return new File(variant.dirName).getName();
}
android.applicationVariants.all { variant ->
def aptOutputDir = project.file("build/source/apt")
def aptOutput = new File(aptOutputDir, variant.dirName)
println "****************************"
println "variant: ${variant.name}"
println "manifest: ${variant.processResources.manifestFile}"
println "aptOutput: ${aptOutput}"
println "****************************"
android.sourceSets[getSourceSetName(variant)].java.srcDirs+= aptOutput.getPath()
variant.javaCompile.options.compilerArgs += [
'-processorpath', configurations.apt.getAsPath(),
'-AandroidManifestFile=' + variant.processResources.manifestFile,
'-s', aptOutput
]
variant.javaCompile.source = variant.javaCompile.source.filter { p ->
return !p.getPath().startsWith(aptOutputDir.getPath())
}
variant.javaCompile.doFirst {
aptOutput.mkdirs()
}
}
在构建免费变种,由gradle这个输出以下指示注释处理器运行Pro变体,注释处理器不运行,因此对生成的代码的引用失败。
对此的好奇是,我发现(真的是偶然),如果我从脚本中删除packageName "com.MyCompany.MyApp.Pro"
....注释处理器运行并且它将正确地构建。我需要更新Google Play的软件包名称。
当机器人工作室寻找,你可以看到,APT(注释处理工具)正显示出临版本为活动状态,即使我选择了FreeDebug构建变量。我不确定这是否是问题的指示,或者如果这只是测试版android studio的问题(Android Studio版本:0.2.13)。所以,用一粒盐吧。
我是新来的gradle这个构建系统,但我认为我得到了它的窍门。我一遍又一遍地查看脚本,我不明白为什么注释处理器没有运行于pro变体。除了使用--info和--debug参数运行封装外,我还不知道如何调试这些问题。
我已经运行与-info和-debug得到扩展输出gradle这个包装,但有什么也没有表示任何其他错误(或缺少项),直到达到所造成的失踪错误生成的代码。所以这让我相信这只是一个事实,即androidannotations没有被运行,这是根本问题。 (也就是说,我认为这不是上游造成的错误,后来被误报,我可能错了)
我真的很茫然,现在已经坚持了两天。
感谢您分享解决方案。 – ruX
太棒了!谢谢!有没有办法以编程方式提取基本包名称? –
回到十月,我简短地看了一下,看看我能不能做到。这不是一个完全明显的事情,我没有非常彻底地追求它,因为我的时间表很紧。从理论上讲,它应该可以拉入,但我不知道如何去做。 –