相信不少人都用过aspactJ!,有同窗反应,在debug都状态下打包测试是没有问题的,可是在Release下,AOP失效了???java
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
}
}
}
}
复制代码
if (!variant.buildType.isDebuggable()) {
log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
return
}
复制代码
看一下上面这一段代码,若是构建的类型是非debug的,就会直接返回不会执行下面的配置代码,也就是是说,若是当前构建类型是release,那么就不会执行下面的配置,那么配置若是不生效,aspctj也就不会生效了。因此必定要把这段代码删除掉!!!android
我相信有不少小伙伴被这个问题搞的焦头烂额,甚至放弃AOPJ,我也不知道当初写这个配置的人到底什么目的,这让第一次使用接触aspactJ的小伙伴彻底没有心理准备,总觉得问题出如今更深的其余地方,会认为编译器或者混淆的问题,偏离了排查轨迹,会很容易忽略配置的排查,这是一种严重的误导!app
最后,若是你觉的这个问题能帮到你,点个赞,让更多的小伙伴看到这个问题。测试