美文网首页
解决 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