ASM插桩--多线程运行监测,flutter瀑布流显示其它组件

复制代码public class ThreadRunVisitor extends ClassVisitor {private String className;private boolean needInject;public ThreadRunVisitor(String className, ClassVisitor classVisitor) {super(Opcodes.ASM5, classVisitor);this.className = className;}@Overrid
摘要由CSDN通过智能技术生成

复制代码

public class ThreadRunVisitor extends ClassVisitor {

private String className;

private boolean needInject;

public ThreadRunVisitor(String className, ClassVisitor classVisitor) {

super(Opcodes.ASM5, classVisitor);

this.className = className;

}

@Override

public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {

//判断是否需要给该类的方法注入

this.needInject = isInjectClass(className, interfaces, superName);

super.visit(version, access, name, signature, superName, interfaces);

}

@Override

public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {

MethodVisitor methodVisitor = this.cv.visitMethod(access, name, descriptor, signature, exceptions);

boolean isInject = this.needInject && isInjectMethod(name, descriptor);

if (!isInject) {

return methodVisitor;

}

return (MethodVisitor) new AdviceAdapter(groovyjarjarasm.asm.Opcodes.ASM5, methodVisitor, access, name, descriptor) {

@Override

protected void onMethodEnter() {

super.onMethodEnter();

//在方法前插入你想要插入的代码(这个代码在你app工程里)

this.mv.visitMethodInsn(INVOKESTATIC, “com/example/project/AopUtil”, “runStart”, “()V”, false);

}

@Override

protected void onMethodExit(int opcode) {

//在方法结束时插入你想要插入的代码(这个代码在你app工程里)

this.mv.visitMethodInsn(INVOKESTATIC, “com/example/project/AopUtil”, “runEnd”, “()V”, false);

}

};

}

public boolean isInjectClass(String className, String[] interfaces, String superName) {

if (className == null)

return false;

//1、支持runnable和android.os.Handler.Callback

if (interfaces != null) {

for (String inter : interfaces) {

if (“java/lang/Runnable”.equals(inter)

|| “android/os/Handler$Callback”.equals(inter))

return true;

}

}

//2、支持ExtendsAsyncTask

if (“android/os/AsyncTask”.equals(superName)) {

return true;

}

//3、支持Handler.handleMessage

if (“android/os/Handler”.equals(superName)) {

return true;

}

//4、支持Thread.run

if (“java/lang/Thread”.equals(superName)) {

return true;

}

return false;

}

public boolean isInjectMethod(String methodName, String methodDesc) {

if (methodName == null || methodDesc == null)

return false;

//1、runnable和thread的run方法

if (methodName.equals(“run”) && methodDesc.equals("()V"))

return true;

//2、extendedAsyncTask.doInBackground方法

if (methodName.equals(“doInBackground”))

return true;

//3、handler和callback的handleMessage方法

if (methodName.equals(“handleMessage”)) {

return methodDesc.equals("(Landroid/os/Message;)V") || methodDesc.equals("(Landroid/os/Message;)Z");

}

return false;

}

}

复制代码

这里说明一下,在以下代码中,new Runnabl

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值