2013-05-22 36 views
10

我想在Android Studio中使用AndroidAnnotations创建一个项目。当我构建并运行该项目时,一切似乎都可以正常编译,但除了应用程序的空白活动外,我什么都没有得到。另外,AndroidAnnotations不会生成任何内容。AndroidAnnotations Nothing Generated,Empty Activity

我已经加入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的支持-V4和ActionBarSherlock。我已经尝试了这两个禁用,没有结果。我最初计划将Roboguice与AndroidAnnotations结合使用,但暂时禁用它以专注于此问题。

我也使用或试图使用,摇篮。这是目前我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 
    } 
} 

不过,我还没有真正想通了摇篮是如何工作的,所以我大多只是手动添加的依赖关系,你会一个正常的项目,再放入摇篮编译线,因此项目会正确编译。我知道这可能不是使用它的正确方法。

我的活动和它的布局非常标准,我只是复制他们的官方指南开始使用AndroidAnnotations。

更新:所以,我只是回去的Maven与测试的内部版本,我发现了一些奇怪的。看起来,即使我在Maven中设置了它,也没有任何东西产生。但是,使用Maven构建,我可以运行项目而不将清单中的活动名称更改为Activity_,并且项目将编译并正确运行。这很奇怪,似乎它可能会进一步混淆问题,或者如果它也可以用Gradle指示某些事情,那么它可以简化它。

+1

也许这将帮助 - > [链接](http://stackoverflow.com/questions/11375953/how-do-you-integrate-the-java-annotation-processor-into-the-java-插件) –

回答

26

这类似于robotoaster的反应,但它在0.4.1工作以及放置在新目录中生成的Java源文件(与其他产生源文件夹一致),这使得Android的工作室看到源和停止抱怨。它也适用于更多注释处理器。只需将您的注释处理器添加到“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 
     ] 
    } 
} 

UPDATE:这仍然有效编译,但与Android工作室0.1.1你可以不再与UI 编辑您的项目结构,所以你不能告诉AS看,新中源夹。我想将文件夹添加到sourceSet,但变体似乎实际上并没有自己的sourceSets,所以我不知道在哪里放置它

更新2:你可以得到的Android 0.1.1工作室认识到通过建立/源/ apt_generated /在项目浏览器调试右键单击并选择马克目录AS-在apt-生成的源文件>源根

更新3:由于gradle这个插件0.5.5的android.applicationVariants.each不工作了。改为使用android.applicationVariants.all。请参阅更改日志android.com访问变体容器不会强制创建任务。 这意味着android。[应用程序|库|测试]在评估阶段,变体将是空的。要使用它,使用的。每个

+0

这是一个很好的解决方案,尤其是因为它允许多个注释处理器。我已经改变了这一点,因此被标记为接受的答案,但是这个和robotoaster的解决方案都很好。感谢所有的帮助。 – NSchock

+1

难道不可能将生成的文件添加到src路径以及Android Studio中吗?摆弄项目设置会破坏构建文件的目的...... – botteaap

+0

另外,如果您的gradle构建文件使用'packageNameSuffix'属性,则需要添加参数'-AresourcePackageName = yourPackage'或者您的R类不会被AA找到处理器(需要最新的AA 3.0) – tbruyelle

4

添加依赖关系不起任何作用。 JavaCompile任务必须通知注释处理器。这是可能的访问JavaCompile任务0.3版本:

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编译禁用应用程序启动时,否则启动器会抱怨缺少注释的活动。

+0

它似乎在0.4 android.buildVariants被改为android.applicationvarariants。使用这个我可以建立项目很好,但我仍然没有得到任何生成。 – NSchock

+0

是的,请按照http://code.google.com/p/android/issues/detail?id=55764 – robotoaster

+0

啊,是的,谢谢!该代码工作。 – NSchock

3

。所有这实际上是一个更新,做下面的事情了答案:

  • 作品与Android工作室0.1.9
  • 从IDE删除语法错误(即使在重建)
  • 使用androidannotations而不匕首

为了实现这一点,我复制的输出建立/源/ 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-容易的方式

最近一包叫做Android的易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的易

+0

是啊有点哈克,但它的作品。我有一个奇怪的行为,它建设两次。 –

+0

@RomainPiel尝试'gradle clean && gradle build'有时可以帮助 – Calin

0

一个可能的问题的创建者R类是找不到的。 Android Studio不会将R.java默认放置在gen目录中,如eclipse。解决方案是进入项目设置 - > Facets - >选择你的项目的Android方面 - >编译器选项卡,并从“在make之前运行process-resources Maven任务”中将“R.java和Manifest.java文件”更改为“由IDE生成”。

6

这里的答案和+Hugo Visser谁在我的Google+ Question回答我的帮助我得到了这个build.grade配置,它允许gradew构建,并且还添加了Android Studio中的apt输出路径作为源directorie。

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() 
    } 
} 

UPDATE:更新的gradle这个Android插件0.5.5;改变android.applicationVariants.eachandroid.applicationVariants.all

+1

使用此配置的其他人的注意事项(这是我使用的)。如果您决定稍后将Flavors添加到此配置并重命名该包(如com.mycompany.myapp到com.mycompany.myapp.pro),那么在“pro”中解决R.Java类文件时可能会遇到问题,版。为了解决这个问题,使用'-AresourcePackageName = MyBasePackageName'参数将androidannotations重定向到正确的R.Java文件。更深入的解释,请参阅http://stackoverflow.com/questions/19351168/gradle-annotations-flavors-wont-run-annotations-processor –

4

该项目现在有up to date documentation这种情况。 A 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+" 
} 
+0

他们只是恢复了我的维基变化。我想弄清楚我做错了什么。 –

+0

该示例对我无效... – syklon