AndroidAnnotations Ничего не создано, пустая активность

Я пытаюсь создать проект с помощью AndroidAnnotations в Android Studio. Когда я создаю и запускаю проект, кажется, что все компилируется нормально, но я не получаю ничего, кроме пустой активности для приложения. Кроме того, похоже, что 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.


person NSchock    schedule 22.05.2013    source источник
comment
возможно, это поможет -›link< /а>   -  person Bobby Hargett    schedule 23.05.2013


Ответы (6)


Это похоже на ответ 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 вы больше не можете редактировать структуру проекта с помощью пользовательского интерфейса, поэтому вы не можете указать AS просмотреть новый источник. папка. Я хотел бы добавить папку в исходный набор, но варианты, похоже, на самом деле не имеют своих собственных исходных наборов, поэтому я еще не уверен, куда ее поместить.

ОБНОВЛЕНИЕ 2. Вы можете заставить Android Studio 0.1.1 распознавать сгенерированные apt исходные файлы, щелкнув правой кнопкой мыши build/source/apt_generated/debug в браузере проекта и выбрав Mark Directory As -> Исходный корень

ОБНОВЛЕНИЕ 3: Начиная с плагина Gradle 0.5.5, android.applicationVariants.each больше не работает. Вместо этого используйте android.applicationVariants.all. См. журнал изменений на android.com: доступ к вариантам контейнер не заставляйте создавать задачу. Это означает, что android.[application|Library|Test]Variants будет пустым на этапе оценки. Чтобы использовать его, используйте .all вместо .each

person Alec B. Plumb    schedule 28.05.2013
comment
Это отличное решение, тем более что оно позволяет использовать несколько обработчиков аннотаций. Из-за этого я изменил это, чтобы пометить его как принятый ответ, но и это, и решение robotoaster работают хорошо. Спасибо за помощь. - person NSchock; 30.05.2013
comment
Разве нельзя было бы добавить сгенерированные файлы в пути src, чтобы Android Studio могла их подобрать? Игра с настройками проекта побеждает цель файла сборки... - person botteaap; 17.06.2013
comment
Кроме того, если ваш файл сборки Gradle использует атрибут packageNameSuffix, вам необходимо добавить параметр -AresourcePackageName=yourPackage, иначе ваш класс R не будет найден процессором AA (требуется последняя версия AA 3.0) - person tbruyelle; 28.06.2013
comment
У меня возникли проблемы с работой с android studio 0.1.8 и android gradle 0.4.2, какие-нибудь советы? - person Calin; 02.07.2013
comment
@Shockwave Android Studio не распознает Activity_ (классы подчеркивания), и приложение падает с java.lang.RuntimeException: невозможно создать экземпляр активности ComponentInfo (...MainActivity_) - person Calin; 02.07.2013
comment
@Shockwave, пожалуйста, игнорируйте мой комментарий, теперь все работает, я сделал gradleclean && gradle build из консоли - person Calin; 02.07.2013
comment
если вы не хотите вручную помечать каталог как исходный корень в студии Android, взгляните на мой ответ. конфигурация там добавляет выходной путь apt к sourceSets для всех вариантов сборки - person Dodge; 24.07.2013
comment
@Deekay Update 3 - альтернативно используйте afterEvaluate { project -› android.applicationVariants.each, как указано в android-review.googlesource.com/#/c/62933 - person robotoaster; 07.08.2013
comment
@robotoaster Вы предпочитаете это решение представленному или это просто равноценная альтернатива? - person deekay; 07.08.2013
comment
это просто альтернатива, упомянутая Ксавье Дюкроэ - person robotoaster; 07.08.2013
comment
Это ничего не сделало для меня. Где он передает фактические процессоры для выполнения? - person Matthias; 22.09.2013
comment
Он все еще актуален? Я использую AS 4.0.2 и получаю эту ошибку, используя упомянутый build.gradle: Не удалось найти com.googlecode.androidannotations:androidannotations-api:2.7.1. - person Eugene; 09.01.2014

с ответами здесь и с помощью +Hugo Visser, который ответил мне на моем Вопрос Google+. Я получил эту конфигурацию build.grade, которая позволяет создавать градации, а также добавляет apt выходной путь в Android Studio в качестве исходных каталогов.

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

person Dodge    schedule 24.07.2013
comment
Примечание для других, использующих эту конфигурацию (которую использую я). Если вы решите позже добавить Flavors в эту конфигурацию и переименовать пакет (например, com.mycompany.myapp в com.mycompany.myapp.pro), вы, вероятно, столкнетесь с проблемой разрешения файла класса R.Java в профессиональной версии. Чтобы обойти это, используйте параметр «-AresourcePackageName=MyBasePackageName», чтобы перенаправить аннотации android в правильный файл R.Java. Для более подробного объяснения см. stackoverflow.com/questions/19351168/ - person Michael Stoner; 14.10.2013

добавление зависимостей ничего не делает. Задача 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 отключите запуск приложения, иначе лаунчер будет жаловаться на отсутствие аннотированной активности.

person robotoaster    schedule 23.05.2013
comment
Кажется, в 0.4 android.buildVariants был изменен на android.applicationVariants. Используя это, я могу нормально построить проект, но я все равно ничего не сгенерировал. - person NSchock; 24.05.2013
comment
Привет, спасибо @robotoaster, этот код работает в Gradle в командной строке. Однако я не могу использовать подчеркнутые классы в Android Studio, поскольку они создаются в каталоге, о котором Android Studio не знает. У вас есть помощь? - person deekay; 28.05.2013
comment
в Android Studio откройте структуру проекта и в источниках модуля выберите /build/classes/debug/ в качестве источника. - person robotoaster; 28.05.2013
comment
Работая с Gradle 0.5.0, я получаю Annotation processor 'org.androidannotations.AndroidAnnotationProcessor' not found - person Calin; 16.07.2013
comment
вы запускаете его из командной строки gradle assembleDebug или аналогичного? - person robotoaster; 17.07.2013
comment
Спасибо, у меня отлично работает с последней версией плагина и Android Studio. - person Matthias; 22.09.2013

Теперь в проекте есть актуальная документация для этого случая. Также существует полный пример проекта.

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+"
}
person Heath Borders    schedule 31.01.2014
comment
Они только что отменили мои изменения в вики. Я пытаюсь понять, что я сделал не так. - person Heath Borders; 03.02.2014

это обновление ответа, которое выполняет следующие действия:

  • работает с 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

Недавно пакет под названием 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.

person Calin    schedule 02.07.2013
comment
да немного хакерский, но это работает. У меня было странное поведение, когда он строился дважды. - person Romain Piel; 03.07.2013
comment
@RomainPiel попробуйте gradle clean && gradle build иногда помогает - person Calin; 03.07.2013

Одна из возможных проблем заключается в том, что класс R не найден. Android Studio не помещает R.java в каталог gen по умолчанию, как eclipse. Решение состоит в том, чтобы перейти в «Настройки проекта» -> «Фасеты» -> «Выбрать аспект Android для вашего проекта» -> вкладка «Компилятор» и изменить «Файлы R.java и Manifest.java» с «Запустить задачу Maven с ресурсами процесса перед созданием» на «Сгенерировано IDE».

person Dan Osipov    schedule 16.07.2013