org.objectweb.asm.commons.AdviceAdapter最终继承自MethodVisitor,是工具类库org.ow2.asm:asm-common:7.1提供给我们的便捷访问方法体内部的类,通过这个类可以更加便捷的操作字节码,因为它几乎是提供了与JVM 字节码指令同名或类似名称的方法,在我们修改字节码的时候直接从ASM 插件中拿到对应的字节码传入指定的方法即可。
字节码插桩就是在编写的java源码编译成class字节码后,在Android下生成dex之前修改class文件,修改或者增强原有代码逻辑的操作。 二、引入ASM库 可以访问ASM官网,https://asm.ow2.io/index.html,更新asm的版本,目前最新版本9.3 在app/build.gradle下引入asm库 dependencies{/** * 使用 testImplementation引入,这表示我...
通过Gradle插件提供的Transform API,可以在编译成dex文件之前得到class文件,得到class文件之后,便可以通过ASM对字节码进行修改,即可完成字节码插桩。 有什么效果呢: 当导入了我们自定义的这个Gradle插件,就可以将我们需要变更的代码注入到最终的apk中,主项目代码无需关心Gradle插件的任何信息,主项目几乎是无感知的。 实现...
与ASM思路一致,但是和ASM对比,效率不够高。 ASM框架进行字节码函数插桩 经过上述方案的对比,最终采用ASM进行字节码插桩。主要是对代码的侵入低,可定制化配置(过滤采集页面,过滤时长,配置页面映射等)。 下图箭头指向处就是进行函数插桩的位置。 代码侵入性低 方案实现是在代码文件编译成class文件之后进行方法的插入,无...
二、字节码操作框架 上面我们提到QQ空间使用了Javaassist来进行字节码插桩,除了Javaassist之外还有一个应用更为广泛的ASM框架同样也是字节码操作框架,Instant Run包括AspectJ就是借助ASM来实现各自的功能。 我们非常熟悉的JSON格式数据是基于文本的,我们只需要知道它的规则就能够轻松的生成、修改JSON数据。同样的Class字节码...
1、查看Class文件 ASM码 image.png 2、Class源文件写入要插入的代码 image.png 3、查看上面两部分不同 image.png image.png 4、复制不同内容,简单修改 Label label1=newLabel();methodVisitor.visitLabel(label1);methodVisitor.visitLineNumber(14,label1);methodVisitor.visitTypeInsn(NEW,"com/billy/app_lib_in...
简介:Android 进阶——代码插桩必知必会&ASM7字节码操作 一、ASM库概述 ASM 是一个Java 字节码(.class)操控框架,它可以用来动态生成类的字节码或者改变现有类的字节码。借由ASM可以直接创建或修改字节码文件,也就能在类被加载到JVM执行之前动态改变原有的类行为。其目的是生成、转换和分析以字节数组来表示的已编译...
但是这个注入是怎么操作的呢?这个就设计到ASM字节码插桩了。 // 这个正常逻辑的代码 public int getStringLength(String name){ return name.length; } // 修改字节码之后的代码 public int getStringLength(String name){ if(crash){ // 奔溃之后的处理逻辑...
可以看到,在transform方法中,我们将每个jar包和class文件复制到dest路径,这个dest路径就是下一个Transform的输入数据,而在复制时,我们就可以做一些狸猫换太子,偷天换日的事情了,先将jar包和class文件的字节码做一些修改,再进行复制即可,至于怎么修改字节码,就要借助我们后面介绍的ASM了。而如果开发过程要看你当前transfo...
ASM字节码插桩分析慢函数耗时,超过阈值上报观测平台(Matrix)。 方案一: 主线程Printer监测 Looper.Printer基本能满足绝大部分场景,下面小木箱带大家看一下看下 Looper#loop 代码片段: public static void loop() {...for (;;) {...// This must be in a local variable, in case a UI event sets the ...