ASM字节码插桩 一、什么是插桩 QQ空间曾经发布的热修复解决方案中利用Javaassist库实现向类的构造函数中插入一段代码解决CLASS_ISPREVERIFIED 问题。包括了Instant Run的实现以及参照Instant Run实现的热修复美团Robus等都利用到了插桩技术。 插桩就是将一段代码插入或者替换原本的代码。字节码插桩顾名思义就是在我们...
如下图,切面可理解为我们的 CostClassVisitor,切入点为不属于 abstract、interface 类,且方法描述带有 CostTime 信息,通知则在方法的前后增加Asm代码,进行插桩,打印耗时信息 。 class CostClassVisitor(cv: ClassVisitor) : ClassVisitor(Opcodes.ASM7, cv) { private var className: String? = null private var isAB...
但是当时只是找了一个特定的class文件,针对某个特定的方法进行插桩,但是真正的开发中不可能这么做的,因为整个工程中会有成百上千的方法,而且存储的位置也各有不同,这个时候,我们就需要借助gradle插件来实现ASM字节码插桩。
接下来,我们使用ASM来修改greet方法,并插入调试代码。以下是插桩代码示例: importorg.objectweb.asm.ClassVisitor;importorg.objectweb.asm.MethodVisitor;importorg.objectweb.asm.Opcodes;publicclassHelloWorldVisitorextendsClassVisitor{publicHelloWorldVisitor(){super(Opcodes.ASM9);}@OverridepublicMethodVisitorvisitMethod(in...
字节码插桩在应用层能做什么? 函数耗时监听 无埋点框架 隐私合规检测 安装包防破解 查看文件字节码 1.在Plugins中搜索 ASM Bytecode Viewer,然后Restart。 2.编译之后,打开编译后的.class文件,使用ASM Bytecode Viewer命令。 3.生成字节码文件。 ASM Core API ...
由于我们操作的是字节码插桩,也就是class文件,所以需要进入 test/java下面使用 javac对这个java类进行编译生成对应的class文件,具体操作是:在Android studio底部Terminal窗口,通过cd进入到test/java目录下,然后执行以下命令: D:\work\plugin\ASMDemo\app\src\test\java>javac com\xyaty\asmdemo\InjectTest.java ...
对于ASM插桩来说,可能很多人都不陌生了,但是大多数可能都停留在core api上,对于现在市面上的一些插桩库,其实很多都用tree api进行编写了,因为tree api的简单与明了的特性,也越来越成为许多开源库的选择。(ASM有两套api类型,分别是core 和 tree) ASM介绍 ...
插桩前代码 首先来看下插桩前代码,就是一个sum方法。 privatefunsum(i:Int, j:Int):Int{ returni + j } 插桩后代码 接下来看下插桩后的代码。 privatefinalint sum(int i, int j) { ArrayList arrayList = new ArrayList(); arrayList.add(Integ...
ASM字节码插桩 个人博客 http://www.milovetingting.cn ASM字节码插桩 前言 热修复的多Dex加载方案中,对于5.0以下的系统存在CLASS_ISPREVERIFIED的问题,而解决这个问题的一个方案是:通过ASM插桩,在类的构造方法里引入一个其它dex里的类,从而避免被打上CLASS_ISPREVERIFIED标签。热修复可以参考其它资料或者前面写的...
插桩技术在软件开发中用于将一段代码插入或替换原有代码,以实现特定功能或监控目的。ASM字节码插桩,具体是指在程序编译成字节码(Class)后,利用Android环境下生成dex之前,修改Class文件,实现增强或修改原有代码逻辑的操作。这一技术尤其适用于需要在方法执行前后插入特定操作的场景,如性能监控、日志记录...