AspectJ为什么打Release包,AOP不起作用?这就告诉你答案

1,927 阅读1分钟

相信很多人都用过aspactJ!,有同学反应,在debug都状态下打包测试是没有问题的,但是在Release下,AOP失效了???

你用了错误的gradle配置!!

在网上流传这这样一份配置

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

注意,这份配置在主app的gradle是有问题的!!!请删除下面这段代码!!!

if (!variant.buildType.isDebuggable()) {
            log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
            return
}

看一下上面这一段代码,如果构建的类型是非debug的,就会直接返回不会执行下面的配置代码,也就是是说,如果当前构建类型是release,那么就不会执行下面的配置,那么配置如果不生效,aspctj也就不会生效了。所以一定要把这段代码删除掉!!!

我相信有很多小伙伴被这个问题搞的焦头烂额,甚至放弃AOPJ,我也不知道当初写这个配置的人到底什么目的,这让第一次使用接触aspactJ的小伙伴完全没有心理准备,总以为问题出现在更深的其他地方,会认为编译器或者混淆的问题,偏离了排查轨迹,会很容易忽略配置的排查,这是一种严重的误导!

最后,如果你觉的这个问题能帮到你,点个赞,让更多的小伙伴看到这个问题。