Mic*_*ner 13 android gradle annotation-processing android-annotations android-studio
我有一个Gradle构建脚本,它使用注释处理器(Android Annotations)来生成代码.建筑物很好,直到我添加了一个新的Pro Flavor.我可以构建Free味道,但是当我构建Pro flavor时,注释处理器不会运行.这会导致代码丢失并且构建失败.
这是我的脚本:
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()
}
}
Run Code Online (Sandbox Code Playgroud)
构建免费变体时,注释处理器按以下gradle输出中的指示运行:
Note: Starting AndroidAnnotations annotation processing
Run Code Online (Sandbox Code Playgroud)
构建Pro变体时,注释处理器不会运行,因此对生成的代码的引用失败.
奇怪的是,我发现(真的是偶然),如果我packageName "com.MyCompany.MyApp.Pro"
从脚本中删除....注释处理器运行,它将正确构建.我需要更新Google Play的包名称.
在android studio中查看时,即使我选择了FreeDebug构建变体,你也可以看到apt(注释处理工具)显示Pro版本处于活动状态.我不确定这是一个问题的指示,或者这只是beta android studio的问题(Android Studio版本:0.2.13).所以,带上一粒盐.
我是gradle构建系统的新手,但我认为我已经掌握了它.我一遍又一遍地看着脚本,我不明白为什么注释处理器没有为pro变体运行.除了使用--info和--debug参数运行包装器之外,我还不知道如何调试这些问题.
我使用-info和-debug运行gradle包装器以获得扩展输出,但是没有任何指示任何其他错误(或缺少项目),直到它达到由缺少生成的代码引起的错误.所以这让我相信这只是一个事实,那就是android注释并没有运行那个根本问题的变种.(即我不认为这是由上游的某些事情引起的错误,以及后来被误报.虽然我可能是错的)
我真的很茫然,现在已经坚持了2天.
Mic*_*ner 13
我能够解决问题.在仔细查看gradle包装器的-info输出后,我发现androidAnnotations正在尝试运行.错误输出的顺序不正确,因为注释处理消息来自引用不存在的代码(由于注释处理失败而不存在)引起的错误.
这是日志:
:MyCompany:compileProDebug
....\src\main\java\com\MyCompany\MyApp\Activities\activityMain.java:14: error: cannot find symbol
import com.MyCompany.MyApp.Notifications.NotificationSetupActivity_;
^
symbol: class NotificationSetupActivity_
location: package com.MyCompany.MyApp.Notifications
....\src\main\java\com\MyCompany\MyApp\Activities\activityMain.java:24: error: cannot find symbol
import com.MyCompany.MyApp.FantasyScores.ActivityScores_;
^
symbol: class ActivityScores_
location: package com.MyCompany.MyApp.Scores
....\src\main\java\com\MyCompany\MyApp\Activities\activityMain.java:32: error: cannot find symbol
import com.MyCompany.MyApp.Team.activityTeamSelect_;
^
symbol: class activityTeamSelect_
location: package com.MyCompany.MyApp.Team
Note: Starting AndroidAnnotations annotation processing
Note: AndroidManifest.xml file found: ....\build\manifests\pro\debug\AndroidManifest.xml
error: The generated com.MyCompany.MyAppPro.R class cannot be found
Note: Time measurements: [Whole Processing = 190 ms], [Extract Manifest = 129 ms], [Extract Annotations = 49 ms],
....\src\main\java\com\MyCompany\MyApp\Activities\activityMain.java:14: error: cannot find symbol
import com.MyCompany.MyApp.Notifications.NotificationSetupActivity_;
Run Code Online (Sandbox Code Playgroud)
重要的是这些:
注意:启动AndroidAnnotations注释处理
注意:找到AndroidManifest.xml文件:....\build\manifests\pro\debug\AndroidManifest.xml
错误:找不到生成的com.MyCompany.MyAppPro.R类
这些应该是错误日志中的第一个,因为注释处理器在完整编译步骤之前运行,但由于某种原因它们被深埋(可能是androidannotations处理器中的刷新问题??)
无论如何,它无法找到的第三条线com.MyCompany.MyAppPro.R
是关键.资源实际上在com.MyCompany.MyApp.R
(没有Pro).在挖掘了一下后,我发现这篇帖子表明这是AndroidAnnotations的一个已知问题.
我能够通过将'-AresourcePackageName=MyBasePackageName',
参数添加到构建脚本来解决该问题. 注意:这仅在您使用3.0快照时有效.最新发布的AndroidAnnotations版本不支持-AresourcePackageName选项.
添加参数后,所有变体都可以正确构建.
build脚本的compilerArgs部分现在看起来像这样:
variant.javaCompile.options.compilerArgs += [
'-processorpath', configurations.apt.getAsPath(),
'-AandroidManifestFile=' + variant.processResources.manifestFile,
'-AresourcePackageName=MyBasePackageName',
'-s', aptOutput
]
Run Code Online (Sandbox Code Playgroud)
希望这将有助于其他人在将来避免这个问题.
归档时间: |
|
查看次数: |
4922 次 |
最近记录: |