【问题标题】:Using AspectJ .aj file with Android Studio, weaving appears to not be happening在 Android Studio 中使用 AspectJ .aj 文件,编织似乎没有发生
【发布时间】:2015-03-31 16:34:56
【问题描述】:

我是 AspectJ 的新手,我们正在努力将最初使用 Eclipse 编写的第三方应用程序迁移到使用 Android Studio 1.1.0 和 Gradle 来代替。我们已经获取了这个应用程序需要的一个外部库,并在项目中创建了一个库模块,并且这个库有一个 AspectJ .aj 文件,我们需要编译它并与主应用程序一起工作以用于字段-水平可观察模式。使用 here 找到的插件,我已经能够将 .aj 文件编译成 .class 文件,通过查看 intermediates 文件夹进行验证。

问题出现在“编织”步骤,该代码应该被注入到必要类的字节码中。这似乎没有发生,因为应该在字段更改时通知的侦听器没有发生。以下是我的构建文件。

项目 build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.0'
        classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.12'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

应用模块 build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 14
        targetSdkVersion 19
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile project(':blahblah')
    compile 'com.android.support:support-v4:19.1.0'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.google.android.gms:play-services:6.1.11'
    compile files('libs/commons-lang3-3.3.2.jar')
}

'blahblah' 库模块 build.gradle:

import com.android.build.gradle.LibraryPlugin
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main

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

def gsonVersion = '2.2.4'
def aspectjVersion = '1.8.5'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile "com.google.code.gson:gson:${gsonVersion}"
    compile "org.aspectj:aspectjrt:${aspectjVersion}"
}

android {
    compileSdkVersion 19
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

android.libraryVariants.all { variant ->

    LibraryPlugin plugin = project.plugins.getPlugin(LibraryPlugin)

    variant.javaCompile.doLast {
        String[] args = ["-showWeaveInfo",
                         "-1.5",
                         "-inpath", javaCompile.destinationDir.toString(),
                         "-aspectpath", javaCompile.classpath.asPath,
                         "-d", javaCompile.destinationDir.toString(),
                         "-classpath", javaCompile.classpath.asPath,
                         "-bootclasspath", plugin.project.android.bootClasspath.join(
                File.pathSeparator)]

        MessageHandler handler = new MessageHandler(true);
        new Main().run(args, handler)

        def log = project.logger
        for (IMessage message : handler.getMessages(null, true)) {
            switch (message.getKind()) {
                case IMessage.ABORT:
                case IMessage.ERROR:
                case IMessage.FAIL:
                    log.error message.message, message.thrown
                    break;
                case IMessage.WARNING:
                case IMessage.INFO:
                    log.info message.message, message.thrown
                    break;
                case IMessage.DEBUG:
                    log.debug message.message, message.thrown
                    break;
            }
        }
    }
}

我错过了什么?

【问题讨论】:

  • 你可以看看my plugin :) 希望对你有帮助!现在它解决了几乎所有关于在 Android 上使用 aspectj 的现有愿望。

标签: android android-studio android-gradle-plugin aspectj build.gradle


【解决方案1】:

经过更多研究,我已经能够让一切按预期工作。以下是最终的 build.gradle 文件:

项目 build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

应用模块 build.gradle:

import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main

buildscript {

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'org.aspectj:aspectjtools:1.8.1'
    }

}

apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

def gsonVersion = '2.2.4'
def aspectJVersion = '1.8.1'

dependencies {
    compile project(':blahblah')
    compile "org.aspectj:aspectjrt:${aspectJVersion}"
    compile 'com.android.support:support-v4:19.1.0'
    compile "com.google.code.gson:gson:${gsonVersion}"
    compile 'com.google.android.gms:play-services:6.1.11'
    compile files('libs/commons-lang3-3.3.2.jar')
}

android {
    compileSdkVersion 19
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 14
        targetSdkVersion 19
    }

    lintOptions {
        abortOnError true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

// The section below is what performs the AOP "weaving" (injecting the AOP code into
// the appropriate classes).  Please do not remove.

final def log = project.logger
final def variants = project.android.applicationVariants

variants.all { variant ->
    if (!variant.buildType.isDebuggable()) {
        log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
        return;
    }
    JavaCompile javaCompile = variant.javaCompile
    javaCompile.doLast {
        String[] args = ["-showWeaveInfo",
                         "-1.5",
                         "-inpath", javaCompile.destinationDir.toString(),
                         "-aspectpath", javaCompile.classpath.asPath,
                         "-d", javaCompile.destinationDir.toString(),
                         "-classpath", javaCompile.classpath.asPath,
                         "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
        log.debug "ajc args: " + Arrays.toString(args)
        MessageHandler handler = new MessageHandler(true);
        new Main().run(args, handler);
        for (IMessage message : handler.getMessages(null, true)) {
            switch (message.getKind()) {
                case IMessage.ABORT:
                case IMessage.ERROR:
                case IMessage.FAIL:
                    log.error message.message, message.thrown
                    break;
                case IMessage.WARNING:
                    log.warn message.message, message.thrown
                    break;
                case IMessage.INFO:
                    log.info message.message, message.thrown
                    break;
                case IMessage.DEBUG:
                    log.debug message.message, message.thrown
                    break;
            }
        }
    }

}

'blahblah' 库模块 build.gradle:

def gsonVersion = '2.2.4'

buildscript {

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "com.android.tools.build:gradle:1.1.0"
        classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.12'
    }

}

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

repositories {
    mavenCentral()
}

dependencies {
    compile "com.google.code.gson:gson:${gsonVersion}"
}

android {
    compileSdkVersion 19
    buildToolsVersion "22.0.1"
    lintOptions {
        abortOnError true
    }
}

【讨论】:

  • 您已将 AspectJ 版本从 1.8.5 降级到 1.8.1。我认为您应该回到 1.8.5,因为与 1.8.1 相比,它包含几个错误修正。无论如何,如果您自己找到了解决方案,请接受您自己的答案以关闭问题。如果您在散文中提到您实际上必须更改哪些内容才能使其正常工作,而不仅仅是结果,那也会很好。几乎不可能在这里对“之前”和“之后”的情况进行并排区分。
  • 顺便说一句,您真的想使用 Java 5 源/目标进行编译吗?您使用参数"-1.5" 调用AspectJ 编译器的方式表明您希望使用Java 5 合规性。如果你是故意的,那很好。否则,您可能想切换到 Java 7 或 8。
  • Aspect J 依赖项是否只能限制在库中,以便其他人可以发布和使用它,而无需知道 Aspect J 正在下面使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多