美文网首页
解决 Aspectj 在kotlin中使用不生效 但java中有

解决 Aspectj 在kotlin中使用不生效 但java中有

作者: 雨来 | 来源:发表于2022-12-07 10:35 被阅读0次

配置:

先说一下我说编译环境:
gradle plugin 7.0.0
gradle版本7.0.2
jdk:11.0.10
aspectj的版本是 1.9.9.1
android studio 版本 arctic fox 2020.3.1

project 的gradle配置:
classpath 'org.aspectj:aspectjtools:1.9.9.1'
classpath 'org.aspectj:aspectjweaver:1.9.9.1'

app gradle的配置:

implementation 'org.aspectj:aspectjrt:1.9.9.1'
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main

android.applicationVariants.all { variant ->

// add the versionName & versionCode to the apk file name
    variant.outputs.all { output ->
        def newPath = outputFileName.replace(".apk", "-${variant.versionName}.${variant.versionCode}.apk")
        outputFileName = new File(outputFileName, newPath)


        def fullName = ""
        output.name.tokenize('-').eachWithIndex { token, index ->
            fullName = fullName + (index == 0 ? token : token.capitalize())
        }

        JavaCompile javaCompile = variant.javaCompiler

        MessageHandler handler = new MessageHandler(true)
        javaCompile.doLast {
            String[] javaArgs = ["-showWeaveInfo",
                                 "-1.9",
                                 "-inpath", javaCompile.destinationDir.toString(),
                                 "-aspectpath", javaCompile.classpath.asPath,
                                 "-d", javaCompile.destinationDir.toString(),
                                 "-classpath", javaCompile.classpath.asPath,
                                 "-bootclasspath", project.android.bootClasspath.join(
                    File.pathSeparator)]

            String[] kotlinArgs = ["-showWeaveInfo",
                                   "-1.9",
                                   "-inpath", project.buildDir.path + "/tmp/kotlin-classes/" + fullName,
                                   "-aspectpath", javaCompile.classpath.asPath,
                                   "-d", project.buildDir.path + "/tmp/kotlin-classes/" + fullName,
                                   "-classpath", javaCompile.classpath.asPath,
                                   "-bootclasspath", project.android.bootClasspath.join(
                    File.pathSeparator)]

            new Main().run(javaArgs, handler)
            new Main().run(kotlinArgs, 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
                }
            }
        }
    }

}

最终 解决办法:
被 @Aspectj 标注的文件一定是要kotlin的
demo地址:
https://gitee.com/xiaoyingxiongyulai/aspect-jdemo

相关文章

网友评论

      本文标题:解决 Aspectj 在kotlin中使用不生效 但java中有

      本文链接:https://www.haomeiwen.com/subject/lirnfdtx.html