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.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

配置完成但拦截不生效

lr784521 opened this issue · comments

    classpath 'com.android.tools.build:gradle:7.2.1'
    classpath 'io.github.wurensen:gradle-android-plugin-aspectjx:3.2.0'

apply plugin: 'io.github.wurensen.android-aspectjx'

@aspect
public class MainUtil {

//实现全局监听点击事件

// @pointcut("execution(* com.huayun.application.page.splash.SplashActivity.aasee())")
@pointcut("execution(* android.view.View.OnClickListener.onClick(android.view.View))")
public void setOnClick(){
}

@Around("setOnClick()")
public void setOnClickListener(ProceedingJoinPoint point){
    LogUtil.xLoge("setOnClickListenersetOnClickListener");
    try {
        point.proceed();
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }
}

}

@lr784521 自己检查下织入规则是否正确,正确情况下可以查看下是否参与了织入:问题排查

@lr784521 不对啊,你这规则是对android.view.View.OnClickListener.onClick进行织入啊,这是Android framework的类,是没办法直接修改的啊。

506d032f587ebac31e1187ef012a08f
0b02e88868dd4b7de9c74889bd9a23f

![6847d626540449ffaf60c2bea29e9b8](https://user-images.githubusercontent.com/36124038/194795350-40bb5aa3-9e59-4283-bd81-6e41f988981e.j
d25540326948f7fc0ff2a4fbb73affa
pg)

这是我之前写的demo 用的是
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
api 'org.aspectj:aspectjrt:1.9.7'
老的 是可以拦截的

这是我的联系方式 1243418334@qq.com 我希望把demo分享给你

09b6beb2a0eab5eaadd4b11cacf676b
47fb230a8d89ce2a9aab0bd4bf425cc

而且 你看我这个规则 就是拦截 一个普通方法 也没有生效,所以我感觉 是不是 我的配置哪里不对呢,希望您指导下 非常感谢

@lr784521 你到对应modulebuild/tmp/transformClassesWithAjxForVariantName目录下,提供下buildConfigCache.json,先确定有没有参与织入。

759da4ae42840896b88ca6ec3fbad78
buildConfigCache.txt

这是文件 我将 .json 改为 txt 方便上传

看了一下,是有参与到织入的,你先看下app\build\intermediates\javac\envDevelopRelease\classes\com\huayun\application\page\splash\SplashActivity.class这个类反编译的情况,方便的话发出来看看。
建议你再随便创建个类,然后针对这个类的某个函数进行织入,测试下是不是正常,因为我发现你这个activity还用到hilt来生成。

这是刚才普通方式设置点击事件编译出来的代码,我项目使用了Hilt 和 阿里 Route
086bef8eeb09899db730203c3035d9b
SplashActivity.zip
这是编码后源码。
另外我觉得应该是生效了,原因如下:
当我使用butterknife给控件设置点击事件后,这时候触发点击事件后会崩溃,而用系统原生的ivStart.setOnClickListener设置点击事件 确实没有拦截到,并且不会崩溃。
资料如下:
![b2cd532081a3ad10bd20fa4d1932919](https://user-images.githu
58ed703546ee7994f00ea8adb0784ff
busercontent.com/36124038/194820147-64d7a9ea-6993-4b7d-b5f6-a0ca76e4acce.jpg)
SplashActivity.zip
这是使用butterknife设置点击事件后 的编译源码

这是 使用butterknife设置点击事件,触发事件后崩溃的错误信息
Process: com.huayun.planet.release, PID: 12348
java.lang.NoSuchMethodError: No static method aspectOf()Lcom/huayun/application/util/MainUtil; in class Lcom/huayun/application/util/MainUtil; or its super classes (declaration of 'com.huayun.application.util.MainUtil' appears in /data/app/com.huayun.planet.release-FnVQ5LFzkz0fFQ4G6SwVzQ==/base.apk)
at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:15)
at android.view.View.performClick(View.java:7257)
at android.view.View.performClickInternal(View.java:7213)
at android.view.View.access$3800(View.java:828)
at android.view.View$PerformClick.run(View.java:27921)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7830)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1040)

你要清楚这个工具是针对字节码进行修改,所以你的规则也是要匹配上对应的字节码的。
你如果担心织入规则错误,可以用我这个项目的demo来测试,如果我这个有效,证明织入规则是没问题的。

嗯 我试着跑你的源码 没有跑起来,但是 我是复制之前 那个老版本的Aspect 规则确实是没问题,我老版本demo也可以正常运行,然后 现在这个项目主要是用的gradle版本高,老的已经没法用了,所以现在使用了您提供的,配置是按照说明来的,就是现在普通方法拦截 没有生效 ,然后我看规则写的也没有问题,所以我怕是我配置的问题 或者其他方面的疏忽 所以想请您帮忙看下,为什么现在普通方法 没有拦截到

AspectJ.zip
这是我之前用老版本写的demo

嗯 我试着跑你的源码 没有跑起来,但是 我是复制之前 那个老版本的Aspect 规则确实是没问题,我老版本demo也可以正常运行,然后 现在这个项目主要是用的gradle版本高,老的已经没法用了,所以现在使用了您提供的,配置是按照说明来的,就是现在普通方法拦截 没有生效 ,然后我看规则写的也没有问题,所以我怕是我配置的问题 或者其他方面的疏忽 所以想请您帮忙看下,为什么现在普通方法 没有拦截到

我这个项目没有跑起来?发生什么错误了?你先用我的demo来验证你的规则,这样可以先确定织入规则有没有问题。

这是报错内容
b3e6d08986b93f0cf5214da8646a9c1

Caused by: groovy.lang.MissingPropertyException: Could not get unknown property 'ossrhUsername' for Credentials [username: null] of type org.gradle.internal.credentials.DefaultPasswordCredentials_Decorated.

是要改maven配置吗?

直接注释掉上传模块的代码就行了

@lr784521 这是我要上传的仓库相关的用户名密码等,你看提示缺少什么key,就自己配置到gradle.properties里面就行,值随便给

@lr784521 这是我要上传的仓库相关的用户名密码等,你看提示缺少什么key,就自己配置到gradle.properties里面就行,值随便给

兄弟,可以麻烦看下我提的那个问题不

可以了 注释掉 仓库就行 我试了下 你的demo 是正常可以,我再试下我自己编写规则

我试了下 普通的方法是可以拦截到,但是系统的拦截不到了
0a1a5cc3ef74c5a7b0f2993ac8251ac
但是以前老版本AspectJ是可以全局拦截 系统的点击事件的,在我上面提供的demo中有写,并且可以运行,如果您有空的话看一看,能实现老版本的功能是最好的,这样的业务场景比较重要

另外 大佬 方便建个 讨论群吗?