wurensen / gradle_plugin_android_aspectjx

A Android gradle plugin that effects AspectJ on Android project and can hook methods in Kotlin, aar and jar file.
Apache License 2.0
363 stars 50 forks source link

[Error]对引入的第三方Jar文件无效 #46

Closed vlike closed 2 years ago

vlike commented 2 years ago

请提供构建环境相关信息:

我希望覆盖JAR里的某个方法, App能成功编译,没有出错,但没有效果

代码: @Throws(Throwable::class) @Around("execution(* com.abc.fun1())") fun fixfun1(joinPoint: ProceedingJoinPoint): List { return listOf(1) }

类似的问题以前也遇到过,用较老的版本1.1.1可以用此过滤器: includeJarFilter 'com.abc', 'abc.aar'

JAR放在libs目录,引入方式: implementation files('libs/plugins.jar')

输出日志:

Task :atomic:transformClassesWithAjxForDebug [:atomic:transformClassesWithAjxForDebug]: transform start.[isIncrement=false] [ajx] close all open jar files: count=0.[0ms] [:atomic:transformClassesWithAjxForDebug]: PrepareProcedure start. [:atomic:transformClassesWithAjxForDebug]: PrepareProcedure finish.[41ms] [:atomic:transformClassesWithAjxForDebug]: DoAspectProcedure start. [:atomic:transformClassesWithAjxForDebug]: DoAspectProcedure finish.[114ms] [ajx] close all open jar files: count=0.[0ms] [:atomic:transformClassesWithAjxForDebug]: transform finish.[166ms]

vlike commented 2 years ago

忘了发配置

aspectjx { enabled = true // 移除kotlin相关,编译错误和提升速度 exclude 'kotlin.jvm', 'kotlin.internal' exclude 'kotlinx.coroutines.internal', 'kotlinx.coroutines.android' include 'com.abc' }

vlike commented 2 years ago

另外,我也尝试过配置把所有的exclude去掉,结果weaveTmp里仍然没有JAR包里面的东西。 配置成这样: aspectjx { enabled = true }

wurensen commented 2 years ago

@vlike weaveTmp里面只会有class文件对应的输入和输出,对于jar类型,你可以在buildConfigCache.json里面找到对应的输出文件是哪一个。

vlike commented 2 years ago

@wurensen buildConfigCache.json 里面也没有任何JAR包里的东西 很久前,类似情况也发生过,当时用2.0也是不行,但退回到1.1.1版本是可以正常修改JAR包的

{ "matchedInputs": [], "aspectFiles": [ { "target": "/Users/vlike/testproject/atomic/build/tmp/transformClassesWithAjxForDebug/aspectFiles/aspx/AspxConfig.class", "source": "/Users/vlike/testproject/atomic/build/tmp/kotlin-classes/debug/aspx/AspxConfig.class" } ], "weaveOutputs": [], "extension": { "enabled": true, "includes": [ "com.abc.test" ], "excludes": [], "ajcArgs": [] } }

wurensen commented 2 years ago

@wurensen buildConfigCache.json 里面也没有任何JAR包里的东西 很久前,类似情况也发生过,当时用2.0也是不行,但退回到1.1.1版本是可以正常修改JAR包的

{ "matchedInputs": [], "aspectFiles": [ { "target": "/Users/vlike/testproject/atomic/build/tmp/transformClassesWithAjxForDebug/aspectFiles/aspx/AspxConfig.class", "source": "/Users/vlike/testproject/atomic/build/tmp/kotlin-classes/debug/aspx/AspxConfig.class" } ], "weaveOutputs": [], "extension": { "enabled": true, "includes": [ "com.abc.test" ], "excludes": [], "ajcArgs": [] } }

你这边配置了includes规则,得满足规则的class或者jar才会被织入。你确认下你jar的包名能够匹配你配置的这个规则com.abc.test吗?

vlike commented 2 years ago

@wurensen 是的,完全匹配,我就是把includes,excludes都配置成空,也没有效果。各种组合我试了不下50次,都不行所以来求助

wurensen commented 2 years ago

你能提供没有配置过滤规则时候的buildConfigCache.json文件吗?或者直接提供下可复现demo。

vlike commented 2 years ago

重新开了一个模块,把jar文件复制到模块的libs目录, 引入这个JAR包,implementation files('libs/abc.jar')

然后再热行编译,这是编译成功后的buildConfigCache

{ "matchedInputs": [ { "source": "/Users/vlike/testproject/testlib/build/tmp/kotlin-classes/debug/aspx/AspxConfig.class" }, { "source": "/Users/vlike/testproject/testlib/build/intermediates/javac/debug/classes/com/example/sitetw/BuildConfig.class" }, { "source": "/Users/vlike/testproject/testlib/build/intermediates/javac/debug/classes/aspx/AspxJava.class" } ], "aspectFiles": [ { "target": "/Users/vlike/testproject/testlib/build/tmp/transformClassesWithAjxForDebug/aspectFiles/aspx/AspxJava.class", "source": "/Users/vlike/testproject/testlib/build/intermediates/javac/debug/classes/aspx/AspxJava.class" } ], "weaveOutputs": [ { "costMillis": 243, "source": "/Users/vlike/testproject/testlib/build/tmp/transformClassesWithAjxForDebug/weaveTmp/d9f2f77573c16685dd28c8a0dde0bff97e6df92f/input", "outputFiles": [ "/Users/vlike/testproject/testlib/build/intermediates/transforms/ajx/debug/0/aspx/AspxConfig.class" ] }, { "costMillis": 249, "source": "/Users/vlike/testproject/testlib/build/tmp/transformClassesWithAjxForDebug/weaveTmp/228cf8f32f6419e2fcb759e2e3a1d945b467cca5/input", "outputFiles": [ "/Users/vlike/testproject/testlib/build/intermediates/transforms/ajx/debug/1/aspx/AspxJava.class", "/Users/vlike/testproject/testlib/build/intermediates/transforms/ajx/debug/1/com/example/sitetw/BuildConfig.class" ] } ], "extension": { "enabled": true, "includes": [], "excludes": [], "ajcArgs": [] } }

vlike commented 2 years ago

@wurensen 已经解决了,配置放在jar所在的模块里是不行的,一定要把配置放在app模块里才行

wurensen commented 2 years ago

@wurensen 已经解决了,配置放在jar所在的模块里是不行的,一定要把配置放在app模块里才行

你可以具体描述下,jar放个模块,插件是哪个模块引入还是都有引入,我好确认下有没有bug.

vlike commented 2 years ago

你可以具体描述下,jar放个模块,插件是哪个模块引入还是都有引入,我好确认下有没有bug.

@wurensen 我把JAR放在单独的模块(m1)里,app模块再引用m1,m1模块里应用插件:io.github.wurensen.android-aspectjx,m1模块里配置过滤选项,同时要织入的代码也放在此模块。

以上是怎么试都不行的配置

最后,

我把m1上的配置移到app的build.gradle中,只移了插件ID和过滤配置,代码及JAR的位置都保持不变,这时就可以了。

wurensen commented 2 years ago

那这就是正常的,只有app模块才可以对jar进行织入处理(agp流程设计如此,也应该如此),library模块只能对你自己的class文件进行处理。