Когда я применяю AspectJ к проекту Android, аннотации Android не работают

Я использую Androidstudio 0.8.9 и строю с помощью Gradle.

Я использовал Android-аннотации и работает хорошо. И я также хочу использовать AspectJ, поэтому примените плагин (https://github.com/uPhyca/gradle-android-aspectj-plugin).

Но скомпилировать не получается и выдает какое-то сообщение об ошибке

:app:compileDebugJava
Internal compiler error: java.lang.IllegalStateException: java.lang.IllegalArgumentException: Unknown location : SOURCE_OUTPUT at org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.BatchAnnotationProcessorManager.discoverNextProcessor(BatchAnnotationProcessorManager.java:183)
:app:compileDebugAspectj FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugAspectj'.
> Internal compiler error: java.lang.IllegalStateException: java.lang.IllegalArgumentException: Unknown location : SOURCE_OUTPUT at org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.BatchAnnotationProcessorManager.discoverNextProcessor(BatchAnnotationProcessorManager.java:183)

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 13.616 secs
Unknown location : SOURCE_OUTPUT at org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.BatchAnnotationProcessorManager.discoverNextProcessor(BatchAnnotationProcessorManager.java:183)
2:04:32: External task execution finished 'build'.

My build.gradle is

repositories {
    mavenCentral()
}

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.12.2'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.2+'
        classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+'
    }
}

def androidAnnotationsVersion = '3.1';
def daggerVersion = '1.0.0';

apply plugin: 'com.android.application'
apply plugin: 'android-aspectj'
apply plugin: 'android-apt'

android {
    compileSdkVersion 19
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "com.flask.aspectjtest"
        minSdkVersion 16
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        abortOnError false
    }
}

configurations {
    apt
    ajc
    aspects
    ajInpath
}

apt {
    arguments {
        androidManifestFile variant.processResources.manifestFile
        resourcePackageName "com.flask.aspectjtest"
    }
}

ext.aspectjVersion = '1.8.2'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:20.0.0'

    apt "org.androidannotations:androidannotations:${androidAnnotationsVersion}"
    compile "org.androidannotations:androidannotations:${androidAnnotationsVersion}"
    apt "com.squareup.dagger:dagger-compiler:${daggerVersion}"
    compile "com.squareup.dagger:dagger:${daggerVersion}"
}

Итак, я протестировал работу плагина аспекта в одиночку (без Android-аннотаций) и работает хорошо. И я нахожу ответ (Аннотации Android и MonkeyTalk?), Страница часто задаваемых вопросов АА. Но я думаю, что это было решение для затмения, и я не могу решить свою проблему с этим ответом.

Я изменил обработчик аннотаций android-apt на ajc. Но теперь он не может найти файл AndroidManifest.xml. (поскольку конфигурация apt недоступна)

repositories {
    mavenCentral()
    maven { url 'http://repo.spring.io/snapshot' }
}

buildscript {
    repositories {
        mavenCentral()
        maven {
            url "https://oss.sonatype.org/content/repositories/snapshots/"
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.12.2'
        classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+'
    }
}

def androidAnnotationsVersion = '3.1';
def daggerVersion = '1.2.2';

apply plugin: 'com.android.application'
apply plugin: 'android-aspectj'

android {
    compileSdkVersion 19
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "com.flask.aspectjtest"
        minSdkVersion 16
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        abortOnError false
    }
    sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java', 'build/generated/source/apt/${variant.dirName}']
            resources.srcDirs = ['src/main/resources']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['src/main/assets']
        }
    }
}

configurations {
    ajc
    aspects
    ajInpath
}

ext.aspectjVersion = '1.8.2'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:20.0.0'

    ajc "org.androidannotations:androidannotations:${androidAnnotationsVersion}"
    compile "org.androidannotations:androidannotations:${androidAnnotationsVersion}"
    ajc "com.squareup.dagger:dagger-compiler:${daggerVersion}"
    compile "com.squareup.dagger:dagger:${daggerVersion}"
}

Теперь,


:app:generateDebugSources UP-TO-DATE
Note: Resolve log file to /Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/androidannotations.log
Note: Initialize AndroidAnnotations 3.1 with options {}
Note: Start processing for 2 annotations on 13 elements
error: Could not find the AndroidManifest.xml file, going up from path [/Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug] found using dummy file [] (max atempts: file:///Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug/dummy1412644771646)
Note: Time measurements: [Whole Processing = 10 ms], [Extract Annotations = 7 ms], [Extract Manifest = 2 ms], 
Note: Finish processing
Note: Start processing for 0 annotations on 0 elements
Note: Time measurements: [Whole Processing = 0 ms], 
Note: Finish processing
1 error
:app:compileDebugJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugJava'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 3.596 secs
Compilation failed; see the compiler error output for details.
10:19:31: External task execution finished 'build'.

androidannotations.log ниже.


10:17:30.890 [Daemon Thread 2] INFO  o.a.AndroidAnnotationProcessor:84 - Initialize AndroidAnnotations 3.1 with options {}
10:17:31.58 [Daemon Thread 2] INFO  o.a.AndroidAnnotationProcessor:108 - Start processing for 2 annotations on 13 elements
10:17:31.77 [Daemon Thread 2] ERROR o.a.h.AndroidManifestFinder:134 - Could not find the AndroidManifest.xml file, going up from path [/Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug] found using dummy file [] (max atempts: file:///Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug/dummy1412644651076)
10:17:31.78 [Daemon Thread 2] INFO  o.a.p.TimeStats:81 - Time measurements: [Whole Processing = 19 ms], [Extract Annotations = 15 ms], [Extract Manifest = 2 ms],
10:17:31.78 [Daemon Thread 2] INFO  o.a.AndroidAnnotationProcessor:122 - Finish processing
10:19:31.568 [Daemon Thread 3] INFO  o.a.AndroidAnnotationProcessor:84 - Initialize AndroidAnnotations 3.1 with options {}
10:19:31.637 [Daemon Thread 3] INFO  o.a.AndroidAnnotationProcessor:108 - Start processing for 2 annotations on 13 elements
10:19:31.647 [Daemon Thread 3] ERROR o.a.h.AndroidManifestFinder:134 - Could not find the AndroidManifest.xml file, going up from path [/Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug] found using dummy file [] (max atempts: file:///Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug/dummy1412644771646)
10:19:31.648 [Daemon Thread 3] INFO  o.a.p.TimeStats:81 - Time measurements: [Whole Processing = 10 ms], [Extract Annotations = 7 ms], [Extract Manifest = 2 ms],
10:19:31.648 [Daemon Thread 3] INFO  o.a.AndroidAnnotationProcessor:122 - Finish processing


person Flask_KR    schedule 05.10.2014    source источник
comment
Я подозреваю, что существует конфликт между aspectj-plugin и android-apt. Попробуйте заменить AA любым другим процессором аннотаций (например, dagger). Это все еще вызывает ту же проблему?   -  person WonderCsabo    schedule 05.10.2014
comment
Как я могу заменить процессор аннотаций?   -  person Flask_KR    schedule 06.10.2014
comment
Я вижу, у вас уже есть dagger. Просто удалите две строки AA из раздела dependencies.   -  person WonderCsabo    schedule 06.10.2014
comment
Но я хочу использовать обе библиотеки. Это невозможно? Итак, есть ли какая-нибудь библиотека с такими функциями, как AA? (Я думаю, что SOURCE_OUTPUT - это строка конфигурации исходного пути вывода по умолчанию. Если я изменю эту конфигурацию, компиляция может быть успешной?)   -  person Flask_KR    schedule 06.10.2014
comment
Ты не понял меня. Я хочу сказать, что не библиотеки (процессоры, такие как AA и dagger), конфликтуют, а сам плагин android-apt конфликтует с плагином aspectj. Вот почему я сказал попробовать только с одним процессором.   -  person WonderCsabo    schedule 06.10.2014
comment
Ой, извини. Я изменил свой обработчик аннотаций android-apt на ajc. Но теперь он не может найти файл AndroidManifest.xml. Раньше android-apt можно было установить какой-то аргумент этого. Но у ajc нет.   -  person Flask_KR    schedule 07.10.2014
comment
Я не понимаю. android-apt не является обработчиком аннотаций, это плагин, который может добавить обработчик аннотаций в путь к классам gradle. Вы поступили совершенно неправильно, поскольку ajc — это не плагин обработчика аннотаций, а плагин, который может добавлять AspectJ библиотеки в путь к классам. Итак, работает ли он с этим скриптом сборки?   -  person WonderCsabo    schedule 07.10.2014
comment
Спасибо, но если я применю вашу build.gradle, AndroidAnnotations библиотеку, она больше не будет работать. Я хочу использовать обе библиотеки AndroidAnnotations и AspectJ в одном проекте. В вашем build.gradle нет библиотеки AndroidAnnotations, поэтому я не могу использовать функции AndroidAnnotations.   -  person Flask_KR    schedule 08.10.2014
comment
Я знаю. Я удалил AA, чтобы проверить, по чьей вине проблема, описанная выше. Поэтому я предлагаю удалять вещи и постепенно добавлять их обратно, чтобы увидеть, что вызывает проблему.   -  person WonderCsabo    schedule 08.10.2014
comment
Ох, хорошо. Удалите все функции AA и успешно примените сборку build.gradle. Ошибки не возникает, и я могу использовать AspectJ. [отредактировано] И я получил ошибку, когда добавил compile "org.androidannotations:androidannotations:${androidAnnotationsVersion}" в раздел dependencies.   -  person Flask_KR    schedule 08.10.2014
comment
Обратите внимание, что вы должны добавить androidannotations как область действия apt, а androidannotations-api — с областью действия compile.   -  person WonderCsabo    schedule 08.10.2014
comment
OMG .. Он работает отлично, как я и ожидал! Благодарю вас! Я был глуп..   -  person Flask_KR    schedule 09.10.2014
comment
Это интересно, потому что в вашем первом скрипте вы правильно добавили области видимости. Что еще изменилось? :)   -  person WonderCsabo    schedule 09.10.2014
comment
compile "org.androidannotations:androidannotations:${androidAnnotationsVersion}" был неверным, compile "org.androidannotations:androidannotations-api:${androidAnnotationsVersion}" правильным (требовалось -api). Но теперь AspectJ не смог найти сгенерированные классы AA. Добавляю вопрос в gradle-android-aspectj-plugin. Спасибо, в любом случае   -  person Flask_KR    schedule 10.10.2014
comment
@Flask_KR Вы добились интеграции плагина Dagger + aspectj?   -  person Xtreme Biker    schedule 16.02.2015
comment
@XtremeBiker, к сожалению, еще нет. Я сдался. Я попробую позже. Я просто использую АА с Дагером.   -  person Flask_KR    schedule 24.02.2015


Ответы (1)


Вместо плагина AspectJ — com.uphyca.gradle:gradle-android-aspectj-plugin' попробуйте использовать https://github.com/Archinamon/GradleAspectJ-Android для интеграции плагинов dagger+aspectj.

Сначала добавьте ссылку репозитория maven в блок репозиториев файла сборки модуля:

maven { url 'https://github.com/Archinamon/GradleAspectJ-Android/raw/master' }

Добавьте плагин в раздел зависимостей вашего скрипта сборки:

classpath 'com.archinamon:AspectJ-gradle:1.0.15'

Примените плагин aspectj:

apply plugin: 'com.archinamon.aspectj'

Теперь создайте свой проект и запустите.

person umesh singh    schedule 24.07.2015
comment
он не работает, выдавая ошибку thisError: Не удалось найти org.fxclub.aspectj: AspectJ-gradle: 1.0.15. - person Syed Raza Mehdi; 28.07.2015
comment
путь к классам и имя плагина были изменены. Я обновил шаги, описанные выше.. попробуйте сейчас. - person umesh singh; 29.07.2015
comment
@umeshsingh - спасибо за ответ. У меня проблемы с использованием ваших или uPhyca плагинов для создания аспектов с моим многовариантным проектом. Не могли бы вы посоветовать проблему, которую я поднял с помощью системы отслеживания проблем uPhyca (то же самое касается вашей библиотеки); github.com/uPhyca/gradle-android-aspectj-plugin/issues/ 27 - person BrantApps; 02.08.2015