【问题标题】:When I apply AspectJ to Android project with Androidannotations not work当我将 AspectJ 应用于 Android 项目时,Androidannotations 不起作用
【发布时间】:2014-10-05 05:39:05
【问题描述】:

我正在使用 Androidstudio 0.8.9 并使用 gradle 构建。

我使用的是 Android-Annotations 并且运行良好。我也想使用 AspectJ,所以申请插件(https://github.com/uPhyca/gradle-android-aspectj-plugin)。

但是编译失败,并抛出一些错误信息

:app:compileDebugJava 内部编译器错误:java.lang.IllegalStateException:java.lang.IllegalArgumentException:未知位置:org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.BatchAnnotationProcessorManager.discoverNextProcessor(BatchAnnotationProcessorManager.java:183)的 SOURCE_OUTPUT :app:compileDebugAspectj 失败 FAILURE:构建失败并出现异常。 * 什么地方出了错: 任务 ':app:compileDebugAspectj' 执行失败。 > 内部编译器错误:java.lang.IllegalStateException:java.lang.IllegalArgumentException:未知位置:org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.BatchAnnotationProcessorManager.discoverNextProcessor(BatchAnnotationProcessorManager.java:183)的 SOURCE_OUTPUT * 尝试: 使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获得更多日志输出。 构建失败 总时间:13.616 秒 未知位置:org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.BatchAnnotationProcessorManager.discoverNextProcessor 的 SOURCE_OUTPUT(BatchAnnotationProcessorManager.java:183) 2:04:32:外部任务执行完成“构建”。

我的build.gradle

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}"
}

所以,我单独测试了 aspectj 插件的工作(没有 android-annotations),并且运行良好。 我找到了一些答案(Android Annotations and MonkeyTalk?),FAQ Page of AA。 但我认为这是eclipse解决方案,我无法用这个答案解决我的问题。

我将注释处理器 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 最新 注意:将日志文件解析为 /Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/androidannotations.log 注意:使用选项 {} 初始化 AndroidAnnotations 3.1 注意:开始处理 13 个元素上的 2 个注释 错误:找不到 AndroidManifest.xml 文件,从使用虚拟文件 [] 找到的路径 [/Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug] 向上(最大尝试次数:file:/ //Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug/dummy1412644771646) 注意:时间测量:[Whole Processing = 10 ms]、[Extract Annotations = 7 ms]、[Extract Manifest = 2 ms]、 注:完成加工 注意:开始处理 0 个元素上的 0 个注释 注意:时间测量:[整个处理 = 0 ms], 注:完成加工 1 个错误 :app:compileDebugJava 失败 FAILURE:构建失败并出现异常。 * 什么地方出了错: 任务 ':app:compileDebugJava' 执行失败。 > 编译失败;有关详细信息,请参阅编译器错误输出。 * 尝试: 使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获得更多日志输出。 构建失败 总时间:3.596 秒 编译失败;有关详细信息,请参阅编译器错误输出。 10:19:31:外部任务执行完成“构建”。

androidannotations.log 在下方。

10:17:30.890 [守护线程 2] INFO o.a.AndroidAnnotationProcessor:84 - 使用选项初始化 AndroidAnnotations 3.1 {} 10:17:31.58 [守护线程 2] INFO o.a.AndroidAnnotationProcessor:108 - 开始处理 13 个元素上的 2 个注释 10:17:31.77 [守护线程 2] 错误 o.a.h.AndroidManifestFinder:134 - 找不到 AndroidManifest.xml 文件,从路径 [/Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug ] 使用虚拟文件 [] 找到(最大尝试次数:file:///Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug/dummy1412644651076) 10:17:31.78 [守护线程 2] INFO o.a.p.TimeStats:81 - 时间测量:[整个处理 = 19 毫秒],[提取注释 = 15 毫秒],[提取清单 = 2 毫秒], 10:17:31.78 [守护线程 2] INFO o.a.AndroidAnnotationProcessor:122 - 完成处理 10:19:31.568 [守护线程 3] 信息 o.a.AndroidAnnotationProcessor:84 - 使用选项初始化 AndroidAnnotations 3.1 {} 10:19:31.637 [守护线程 3] 信息 o.a.AndroidAnnotationProcessor:108 - 开始处理 13 个元素上的 2 个注释 10:19:31.647 [守护线程 3] 错误 o.a.h.AndroidManifestFinder:134 - 找不到 AndroidManifest.xml 文件,从路径 [/Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug ] 使用虚拟文件 [] 找到(最大尝试次数:file:///Users/flask/Documents/workspace_android/AspectJTest/app/build/intermediates/classes/debug/dummy1412644771646) 10:19:31.648 [守护线程 3] INFO o.a.p.TimeStats:81 - 时间测量:[整个处理 = 10 毫秒],[提取注释 = 7 毫秒],[提取清单 = 2 毫秒], 10:19:31.648 [守护线程 3] INFO o.a.AndroidAnnotationProcessor:122 - 完成处理

【问题讨论】:

  • 我怀疑 aspectj-plugin 和 android-apt 之间存在冲突。尝试用任何其他注释处理器(如 dagger)替换 AA。它仍然会导致同样的问题吗?
  • 如何替换注释处理器?
  • 我看到你已经有dagger。只需从 dependencies 部分删除两条 AA 行。
  • 但我想同时使用这两个库。这是不可能的吗?那么,有没有像 AA 这样的库? (我认为SOURCE_OUTPUT是源输出路径配置的默认字符串。如果我改变这个配置,编译可能成功?)
  • 请注意,您应将androidannotations 添加为apt 范围,并将androidannotations-api 添加为compile 范围。

标签: android gradle aspectj android-annotations


【解决方案1】:

代替 AspectJ 插件 - com.uphyca.gradle:gradle-android-aspectj-plugin' 尝试使用 https://github.com/Archinamon/GradleAspectJ-Android 进行 dagger+aspectj 插件集成。

首先将一个 maven repo 链接添加到模块构建文件的 repositories 块中:

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

将插件添加到构建脚本的依赖项部分:

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

应用 aspectj 插件:

apply plugin: 'com.archinamon.aspectj'

现在构建您的项目并运行。

【讨论】:

  • 它不工作,给出错误 thisError:Could not find org.fxclub.aspectj:AspectJ-gradle:1.0.15.
  • 类路径和插件名称已更改。我更新了上述步骤。请立即尝试。
  • @umeshsingh - 谢谢你的回答。在我的多风格项目中使用你的或 uPhyca 的 aspectj 编织插件时遇到问题。您能否就我使用 uPhyca 的问题跟踪器提出的问题提出建议(同样会影响您的库); github.com/uPhyca/gradle-android-aspectj-plugin/issues/27
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2014-03-30
  • 2018-02-20
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多