关于android字节码插桩
转自:https://www.jianshu.com/p/c202853059b4
基于字节码插桩可以实现面向切面的编程, 实际是在字节码中插入要执行的相关程序. 通过非侵入的方式实现切面编程.
(1)AOP和OOP
如果说oop模块化编程, 是把功能封装到一个模块中, 那么aop就是把众多模块中的问题, 集中到一起管理.
(2)运行时AOP和编译时AOP
<1>编译时AOP主要是在Apk打包过程中对class文件的字节码进行扫描更改
<2>运行时AOP的实现主要是hook某些关键方法
通常编译时AOP的做法 :自己hook Android编译打包流程并借助ASM库对项目字节码文件进行统一扫描,过滤以及修改。
(3)具体使用情景
比如:要监听程序中所有OnClick的点击事件
(4)AOP插桩点
class文件-> 字节码文件-> dex文件--> 打包-->apk
我们要想对字节码进行修改,只需要在javac之后,dex之前对class文件进行字节码扫描,并按照一定规则进行过滤及修改就可以了,这样修改过后的字节码就会在后续的dex打包环节被打到apk中,这就是我们的插桩入口。
(5)具体做法
<1>字节码扫描,并按照一定规则进行过滤出哪些类的class文件需要进行字节码修改
<2>对筛选出来的类进行字节码修改操作
最后将修改过字节码的class文件,将连同资源文件,一起打入Apk中,得到最终可以在Android平台可以运行的APP。
(6)ASM修改字节码流程
另外:基于ASM和Gradle的Android轻量级AOP Hook插件 HiBeaver , 可以看看, 使用起来非常方便.