转自: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修改字节码流程

关于android字节码插桩

另外:基于ASM和Gradle的Android轻量级AOP Hook插件 HiBeaver , 可以看看, 使用起来非常方便.

分类:

技术点:

相关文章: