我正在尝试在Android Studio中使用AndroidAnnotations创建项目。当我构建并运行项目时,一切似乎编译得很好,但我只得到应用程序的空白活动。此外,AndroidAnnotations似乎没有生成任何内容。
我添加了androidannotations-api-2.7.1.jar
作为项目的依赖项,并启用了处理器路径的注释处理,该路径是androidannotations-2.7.1.jar
的路径,该路径位于androidannotations-api-2.7.1.jar
的单独文件夹中。我检查了商店生成的相对于模块内容根的源,并尝试了许多不同的源目录 - 从generated
到gen/aa
到(当前)build/source/aa
以匹配它看起来的位置生成的文件在Android Studio中创建。没有任何效果。我已将清单中的活动名称更改为Activity_
,并将配置设置为在项目运行时启动它。
我唯一的其他依赖项是android-support-v4和ActionBarSherlock。我试过这两个禁用,没有结果。我最初计划将Roboguice与AndroidAnnotations结合使用,但暂时禁用它以尝试专注于此问题。
我也在使用或尝试使用Gradle。这是我的build.gradle
:
buildscript {
repositories {
maven { url 'http://repo1.maven.org/maven2' }
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
apply plugin: 'android'
dependencies {
compile files('libs/android-support-v4.jar')
compile files('libs/actionbarsherlock-4.3.1.jar')
compile files('libs/androidannotations-api-2.7.1.jar')
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 7
targetSdkVersion 17
}
}
但是,我还没有弄清楚Gradle是如何工作的,所以我大多只是手动添加依赖项,就像普通项目一样,然后将编译行放在Gradle中,这样项目就可以正常编译。我知道这可能不是使用它的正确方法。
我的活动及其布局是相当标准的,我只是从官方指南中复制它们以开始使用AndroidAnnotations。
更新:所以我回到Maven用它来测试构建,我发现了一些奇怪的东西。似乎即使我在Maven中设置了它,也没有生成任何东西。但是,使用Maven构建,我可以运行项目而无需将清单中的活动名称更改为Activity_
,项目将正确编译和运行。这是非常奇怪的,似乎它可能会进一步混淆问题,或者如果它也表明了Gradle的某些内容,则可以简化它。
答案 0 :(得分:26)
这类似于robotoaster的响应,但它在0.4.1中工作,它将生成的java源文件放在一个新目录中(与其他生成的源文件夹一致),这允许Android Studio查看源并停止抱怨。它也适用于更多注释处理器。只需将注释处理器添加到“apt”配置中即可。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4.1'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
}
ext.daggerVersion = '1.0.0';
ext.androidAnnotationsVersion = '2.7.1';
configurations {
apt
}
dependencies {
apt "com.googlecode.androidannotations:androidannotations:${androidAnnotationsVersion}"
compile "com.googlecode.androidannotations:androidannotations-api:${androidAnnotationsVersion}"
apt "com.squareup.dagger:dagger-compiler:${daggerVersion}"
compile "com.squareup.dagger:dagger:${daggerVersion}"
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 10
targetSdkVersion 17
}
}
android.applicationVariants.all { variant ->
aptOutput = file("${project.buildDir}/source/apt_generated/${variant.dirName}")
println "****************************"
println "variant: ${variant.name}"
println "manifest: ${variant.processResources.manifestFile}"
println "aptOutput: ${aptOutput}"
println "****************************"
variant.javaCompile.doFirst {
println "*** compile doFirst ${variant.name}"
aptOutput.mkdirs()
variant.javaCompile.options.compilerArgs += [
'-processorpath', configurations.apt.getAsPath(),
'-AandroidManifestFile=' + variant.processResources.manifestFile,
'-s', aptOutput
]
}
}
更新:这仍然适用于编译,但是使用Android Studio 0.1.1,您无法再使用UI 编辑项目结构,因此您无法告诉AS查看新的源文件夹。我想将文件夹添加到sourceSet,但变体似乎实际上没有自己的sourceSets,所以我不确定它放在哪里。
更新2 :您可以通过右键单击项目浏览器中的build / source / apt_generated / debug并选择,让Android Studio 0.1.1识别apt生成的源文件标记目录As->源根
更新3 :由于gradle插件0.5.5 android.applicationVariants.each
不再有效。请改用android.applicationVariants.all
。请参阅android.com处的更改日志:
访问变体容器不会强制创建任务。
这意味着android。[application | Library | Test]变量在评估阶段将为空。要使用它,请使用.all而不是.each
答案 1 :(得分:6)
这里的答案以及+Hugo Visser在我的Google+ Question上回答我的帮助我得到了这个build.grade配置,它允许使用gradew构建并在Android Studio中添加apt输出路径作为源代码directorys。
buildscript {
repositories {
mavenCentral()
}
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 'com.android.support:support-v4:13.0.+'
apt "org.androidannotations:androidannotations:${androidAnnotationsVersion}"
compile "org.androidannotations:androidannotations-api:${androidAnnotationsVersion}"
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 10
targetSdkVersion 17
}
}
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 android插件0.5.5;将android.applicationVariants.each
更改为android.applicationVariants.all
答案 2 :(得分:4)
添加依赖项不会做任何事情。必须通知JavaCompile任务有关注释处理器的信息。可以在版本0.3中访问JavaCompile任务:
configurations {
compile
androidannotations.extendsFrom(compile)
}
dependencies {
compile 'org.androidannotations:androidannotations-api:3.0-SNAPSHOT'
androidannotations 'org.androidannotations:androidannotations:3.0-SNAPSHOT'
}
android.buildVariants.each {
variant ->
variant.javaCompile.options.compilerArgs += [
'-classpath', configurations.compile.asPath,
'-processorpath', configurations.androidannotations.asPath,
'-processor', 'org.androidannotations.AndroidAnnotationProcessor',
'-AandroidManifestFile=' + variant.processResources.manifestFile
]
}
对于gradle插件0.4以后,编译任务必须以不同的方式附加。感谢Artiom @ Android Project 这里是整个build.gradle应该是什么样子
buildscript {
repositories {
maven { url 'http://repo1.maven.org/maven2' }
}
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}
configurations {
compile
androidannotations.extendsFrom(compile)
}
dependencies {
compile files('libs/android-support-v4.jar')
compile 'org.androidannotations:androidannotations-api:3.0-SNAPSHOT'
androidannotations 'org.androidannotations:androidannotations:3.0-SNAPSHOT'
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 7
targetSdkVersion 16
packageName "org.labaa.aa"
testPackageName "org.labaa.aa.test"
testInstrumentationRunner "org.labaa.aa.test.Runner"
}
}
afterEvaluate { project ->
android.applicationVariants.each { variant ->
variant.javaCompile.options.compilerArgs += [
'-classpath', configurations.compile.asPath,
'-processorpath', configurations.androidannotations.asPath,
'-processor', 'org.androidannotations.AndroidAnnotationProcessor',
'-AandroidManifestFile=' + variant.processResources.manifestFile
]
}
}
这不会更新Android Studio依赖项。手动添加androidannotations-api。从命令行运行构建 gradle installDebug
从Andoid Studio编译时禁用应用启动,否则启动器会抱怨缺少注释活动。
答案 3 :(得分:4)
对于这种情况,项目现在有up to date documentation。还存在full example project。
buildscript {
repositories {
mavenCentral()
}
dependencies {
// replace with the current version of the Android plugin
classpath 'com.android.tools.build:gradle:0.7.3+'
// the latest version of the android-apt plugin
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.2+'
}
}
apply plugin: 'android'
apply plugin: 'android-apt'
repositories {
mavenCentral()
}
android {
compileSdkVersion 19
buildToolsVersion "19.0.1"
defaultConfig {
minSdkVersion 15
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
apt {
arguments {
androidManifestFile variant.processResources.manifestFile
// If you're using Android NBS flavors you should use the following line instead of hard-coded packageName
//resourcePackageName android.defaultConfig.packageName
resourcePackageName "com.example.your.package.name"
// You can set optional annotation processing options here, like these commented options:
// logLevel 'INFO'
// logFile '/var/log/aa.log'
}
}
dependencies {
apt "org.androidannotations:androidannotations:3.0+"
compile "org.androidannotations:androidannotations-api:3.0+"
}
答案 4 :(得分:3)
这是对答案的更新,它做了以下事情:
为了达到这个目的,我将输出复制到build / source / r,在重建期间将继续标记为源。
import groovy.io.FileType
buildscript {
}
apply plugin: 'android'
repositories {
mavenCentral()
}
ext.androidAnnotationsVersion = '2.7.1';
configurations {
apt
}
dependencies {
apt "com.googlecode.androidannotations:androidannotations:${androidAnnotationsVersion}"
compile "com.googlecode.androidannotations:androidannotations-api:${androidAnnotationsVersion}"
}
android {
compileSdkVersion 17
buildToolsVersion "17.0.0"
defaultConfig {
minSdkVersion 10
targetSdkVersion 16
}
}
android.applicationVariants.each { variant ->
aptOutput = file("${project.buildDir}/source/r/${variant.dirName}")
println "****************************"
println "variant: ${variant.name}"
println "manifest: ${variant.processResources.manifestFile}"
println "aptOutput: ${aptOutput}"
println "****************************"
variant.javaCompile.doFirst {
println "*** compile doFirst ${variant.name}"
aptOutput.mkdirs()
aptOutput.eachFileRecurse FileType.FILES, {
if (it.name.equals('R.java')) {
return
}
it.delete()
}
variant.javaCompile.options.compilerArgs += [
'-processorpath', configurations.apt.getAsPath(),
'-AandroidManifestFile=' + variant.processResources.manifestFile,
'-s', aptOutput
]
}
}
欢迎提出非常好的改进建议
编辑 android-apt方式
最近发布了一个名为 android-apt https://bitbucket.org/hvisser/android-apt/overview的软件包,使事情变得更容易(版本1.1支持Android注释需要)
只需像这样更新build.gradle:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "com.neenbedankt.gradle.plugins:android-apt:1.1"
}
}
apply plugin: 'android-apt'
apt {
arguments {
androidManifestFile variant.processResources.manifestFile
}
}
dependencies {
apt 'com.googlecode.androidannotations:androidannotations:2.7.+'
}
非常感谢hvisser是android-apt的创建者
答案 5 :(得分:0)
一个可能的问题是找不到R类。默认情况下,Android Studio不会将R.java放入gen目录中。解决方案是进入项目设置 - >方面 - >选择项目的Android方面 - >编译选项卡,并将“R.java和Manifest.java文件”从“在Make之前运行process-resources Maven任务”更改为“由IDE生成”。