一、AOP简介
1.1 什么是AOP
AOP,AspectOriented Programming 面向切面编程
OOP,Object-orientedprogramming面向对象编程
AOP和OOP是不同的编程思想。OOP强调的是高内聚,低耦合,封装。
提倡的是将功能模块化,对象化。
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。
1.2 AOP用途
将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
1.3 AOP方式对比选择
|
Hook时机 |
Android中应用场景 |
优点 |
缺点 |
Dexposed |
运行时动态hook |
滑动流畅度监控 事件执行监控 热修复 |
可以动态监控和系统通信的各种方法。 |
不支持5.0以上手机 |
Xposed |
运行时动态hook |
同Dexposed |
可以动态监控和系统通信的各种方法。 |
不支持5.0以上手机 必现root |
Java Proxy |
运行时动态hook |
hook和系统通信接口 例如:插件sdk |
Java 原生API,没有兼容性问题 |
只能hook 有Interface的类 |
AspactJ |
编译时修改代码 |
统计方法执行时长 方法前后注入逻辑 |
Sprint开源的AOP框架,功能强大。注解很多。基本包括所有的编译时注入方式 |
需要引入118K的jar |
ASM |
编译时修改代码 |
同AspactJ |
字节码操作库, |
需要自己写注解和编译脚本。 字节码插入编写比较费劲 |
Javassit |
编译时修改代码 |
同AspactJ |
基于java反射的字节码操作类库。 对比ASM,编写简单 |
对比ASM,修改类时,执行时间长 |