AndroidAnnotations Nothing Generated,Empty Activity

时间:2013-05-22 05:16:04

标签: android gradle android-studio android-annotations

我正在尝试在Android Studio中使用AndroidAnnotations创建项目。当我构建并运行项目时,一切似乎编译得很好,但我只得到应用程序的空白活动。此外,AndroidAnnotations似乎没有生成任何内容。

我添加了androidannotations-api-2.7.1.jar作为项目的依赖项,并启用了处理器路径的注释处理,该路径是androidannotations-2.7.1.jar的路径,该路径位于androidannotations-api-2.7.1.jar的单独文件夹中。我检查了商店生成的相对于模块内容根的源,并尝试了许多不同的源目录 - 从generatedgen/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的某些内容,则可以简化它。

6 个答案:

答案 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)

这是对答案的更新,它做了以下事情:

  • 适用于Android Studio 0.1.9
  • 从IDE中删除语法错误(即使在重建时)
  • 使用没有匕首的androidannotations

为了达到这个目的,我将输出复制到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生成”。