美文网首页Android开发经验谈Android开发
42 AOP(面向切面编程)-AspectJ-使用问题

42 AOP(面向切面编程)-AspectJ-使用问题

作者: 凤邪摩羯 | 来源:发表于2021-01-30 09:23 被阅读0次

    1. 在工程根目录的build.gradle中添加依赖(加粗部分)

    在buildscript的dependencies中添加如下代码

     classpath 'org.aspectj:aspectjtools:1.9.2'
     classpath 'org.aspectj:aspectjweaver:1.9.2'
    

    2. 在library/module中添加依赖

    implementation  'org.aspectj:aspectjrt:1.9.2'
    

    3. 添加gradle任务

    如果你只在你的Application module使用aop,在这个module中的gradle添加如下代码,直接添加在最后就行。

    import org.aspectj.bridge.IMessage
    import org.aspectj.bridge.MessageHandler
    import org.aspectj.tools.ajc.Main
    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.8",
                             "-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;
                }
            }
        }
    }
    

    那么问题来了,如果你的library module中也使用到了aop,这时没有添加依赖的话,使用到library中被@Aspect标注的类的时候,就会出现java.lang.NoSuchMethodError: No static method aspectOf()这个错误。

    在library module 中添加依赖的方法如下,也是和之前一样,添加在build.gradle的最后就好了.

    import org.aspectj.bridge.IMessage
    import org.aspectj.bridge.MessageHandler
    import org.aspectj.tools.ajc.Main
    final def log = project.logger
    
    android.libraryVariants.all{ variant ->
        if (!variant.buildType.isDebuggable()) {
            log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
            return
        }
    
        JavaCompile javaCompile = variant.javaCompiler
        javaCompile.doLast {
            String[] args = ["-showWeaveInfo",
                             "-1.8",
                             "-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
                }
            }
        }
    }
    

    4. gradle_plugin_android_aspectjx

    // AOP 配置
    aspectjx {
        // 排除一些第三方库的包名(Gson、 LeakCanary 和 AOP 有冲突)
        // 否则就会起冲突:ClassNotFoundException: Didn't find class on path: DexPathList
        exclude 'androidx', 'com.google', 'com.squareup', 'com.alipay', 'com.taobao',
                'com.baidu','map','vi', 'org.apache', 'com.chad'
    }
    

    相关文章

      网友评论

        本文标题:42 AOP(面向切面编程)-AspectJ-使用问题

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