通知:切面当中的方法,声明通知方法在目标业务层的执行位置。 如下图,切面可理解为我们的 CostClassVisitor,切入点为不属于 abstract、interface 类,且方法描述带有 CostTime 信息,通知则在方法的前后增加Asm代码,进行插桩,打印耗时信息。 class CostClassVisitor(cv: ClassVisitor) : ClassVisitor(Opcodes.ASM7, cv) {...
* 进行ASM字节码插桩 * @param file 需要插桩的class文件 */ private void doASM(File file) { def fis = new FileInputStream(file) def cr = new ClassReader(fis) def cw = new ClassWriter(ClassWriter.COMPUTE_MAXS) cr.accept(new ASMClassVisitor(Opcodes.ASM9, cw), ClassReader.SKIP_FRAMES | ...
org.objectweb.asm.commons.AdviceAdapter最终继承自MethodVisitor,是工具类库org.ow2.asm:asm-common:7.1提供给我们的便捷访问方法体内部的类,通过这个类可以更加便捷的操作字节码,因为它几乎是提供了与JVM 字节码指令同名或类似名称的方法,在我们修改字节码的时候直接从ASM 插件中拿到对应的字节码传入指定的方法即可。
在执行类中做test检测方法,将InjectTest.class进行字节码插桩操作,再输出新的字节码文件。 publicvoidtest(){try{Filefile=newFile("src/main/java/com/example/asmbytecode/simpledemo/InjectTest.class");FileInputStreamfis=newFileInputStream(file);//将class文件转成流ClassReadercr=newClassReader(fis);//Clas...
由于我们操作的是字节码插桩,也就是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 ...
字节码插桩技术---Transform配合ASM进行插桩(三) 字节码插桩技术简单来讲就是通过操作class文件的字节码,对class文件进行改造。在很多三方框架都有应用,比如路由框架ARouter,热修复框架Robust等。而字节码插桩一般都会使用ASM工具进行操作,这篇文章会介绍ASM的简单使用,下篇博客会详细介绍,Android项目中如何进行字节码插桩...
下面是实现Java插桩ASM的基本流程: 流程图 创建ASM项目编写插桩代码使用ASM进行字节码转换运行插桩后的程序 每一步详细说明 1. 创建一个ASM项目 首先,你需要确保你的开发环境中有ASM库。可以通过Maven来添加ASM依赖: <dependency><groupId>org.ow2.asm</groupId><artifactId>asm</artifactId><version>9.3</versio...
ASM是一个可以分析和操作字节码的框架,通过它可以动态地修改字节码内容。使用ASM可以实现无埋点统计、性能监控等。 什么是字节码插桩 Android编译过程中,往字节码插入自定义的字节码。 插桩时机 Android打包要经过:java文件--class文件--dex文件,通过Gradle提供的Transform API,可以在编译成dex文件前,得到class文件,然...
ASM框架进行字节码函数插桩 经过上述方案的对比,最终采用ASM进行字节码插桩。主要是对代码的侵入低,可定制化配置(过滤采集页面,过滤时长,配置页面映射等)。 下图箭头指向处就是进行函数插桩的位置。 代码侵入性低 方案实现是在代码文件编译成class文件之后进行方法的插入,无需在编写阶段进行。
插桩技术在软件开发中用于将一段代码插入或替换原有代码,以实现特定功能或监控目的。ASM字节码插桩,具体是指在程序编译成字节码(Class)后,利用Android环境下生成dex之前,修改Class文件,实现增强或修改原有代码逻辑的操作。这一技术尤其适用于需要在方法执行前后插入特定操作的场景,如性能监控、日志记录...