核心 API
在采用基于事件的模型时,类是用一系列事件来表示的,每个事件表示类的一个元素,比如它的一个标头、一个字段、一个方法声明、一条指令,等等。基于事件的 API 定义了一组可能事件,以及这些事件必须遵循的发生顺序,还提供了一个类分析器,为每个被分析元素生成一个事件,还提供一个类写入器,由这些事件的序列生成经过编译的类。核心的类是ClassVisitor和ClassReader。
特点:使用者可以不用关心字节码的格式,只需要在每个 Visitor 的位置关心自己所修改的结构即可。但是这种模式的缺点是,一般只能在一些简单场景里实现字节码的处理。
树 API
而在采用基于对象的模型时,类用一个对象树表示,每个对象表示类的一部分,比如类本身、一个字段、一个方法、一条指令,等等,每个对象都有一些引用,指向表示其组成部分的对象。基于对象的 API 提供了一种方法,可以将表示一个类的事件序列转换为表示同一个类的对象树,也可以反过来,将对象树表示为等价的事件序列。换言之,基于对象的 API 构建在基于事件的 API 之上。核心是ClassNode,可以在此基础上增加或者删除属性,成员之类的,当然还有更高级的。缺点是:如果使用者对字节码不熟悉的话不好操作
3.掌握插桩应该具备的基础知识
(1)熟练掌握字节码相关技术。之前提到过
(2)groovy语言和Gradle自定义插件,可以直接参考官网
(3)如果你想运用在Android项目中,那么还需要掌握Transform API
这是android在将class转成dex之前给我们预留的一个接口,在该接口中我们可以通过插件形式来修改class文件。共两步,第一步继承Transform接口,第二步register