10

我正在尝试在 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 的某些东西,它会简化它。

4

6 回答 6

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 中,但变体似乎实际上并没有自己的 sourceSet,所以我还不确定将它放在哪里

更新 2:您可以通过在项目浏览器中右键单击 build/source/apt_generated/debug 并选择Mark Directory As->Source Root来让 Android Studio 0.1.1 识别 apt 生成的源文件

更新 3:由于 gradle 插件 0.5.5 不再android.applicationVariants.each起作用。改为使用android.applicationVariants.all请参阅android.com上的更改日志: 访问变体容器不会强制创建任务。这意味着 android.[application|Library|Test]Variants 在评估阶段将为空。要使用它,请使用 .all 而不是 .each

于 2013-05-28T22:01:16.063 回答
6

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

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

于 2013-07-24T17:03:14.150 回答
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 编译时禁用应用程序启动,否则启动器会抱怨缺少带注释的活动。

于 2013-05-23T18:06:51.990 回答
4

该项目现在具有此案例的最新文档。还存在一个完整的示例项目。

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+"
}
于 2014-01-31T23:07:41.217 回答
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
        ]
    }
}

欢迎仍然非常hacky的改进建议

编辑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.+'
}

非常感谢 android-apt 的创建者 hvisser

于 2013-07-02T08:44:16.250 回答
0

一个可能的问题是未找到 R 类。默认情况下,Android Studio 不会像 eclipse 那样将 R.java 放入 gen 目录。解决方案是进入 Project Settings -> Facets -> 为您的项目选择 Android facet -> Compiler 选项卡,然后将“R.java 和 Manifest.java 文件”从“Run process-resources Maven task before Make”更改为“由 IDE 生成”。

于 2013-07-16T13:25:27.217 回答