在Android Studio中使用AspectJ .aj文件,编织似乎没有发生

时间:2015-03-31 16:34:57

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

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

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

项目build.gradle:

intermediates

app module 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()
    }
}

'blahblah'库模块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')
}

我错过了什么?

1 个答案:

答案 0 :(得分:0)

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

项目build.gradle:

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

allprojects {
    repositories {
        jcenter()
    }
}

app module 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
    }
}