Android工程师学习的AOP知识
一 在软件行业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程;通过预编译的方式和运行期间动态代理实现程序功能功能的统一维护的一种技术,AOP是OOP的延续,是一种思想,是软件开发中的一个热点。
举个例子:
设计一个日志打印模块,按照OOP思想,我们会设计一个打印日志LogUtils类,然后在需要打印的地方引用即可。看起来没有任何问题吧,但是这个类是横跨并嵌入众多模块里的,在各个模块里分散地很厉害,到处都能看到。从对象组织角度来讲,我们一般采用的分类方法都是以继承关系为主线,我们称之为纵向也就是OOP,设计时只使用OOP思想会带来两个问题:
对象设计的时候一般都是纵向思维,如果这个时候考虑这些不同类对象的共性,不仅会增加设计的难度和复杂性,还会造成类的接口过多而难以维护
需要对现有的对象动态增加某种行为或责任时非常困难。
而AOP就可以很好地解决以上的问题,怎么做呢除了这种纵向分类以外,我们横向去观察这些对象,无需再去到处调用LogUtils,声明哪些地方需要打印这些日志,这个地方就是一个切面,AOP会在适当的时机为你把打印语句插进切面。
如果说OOP是把问题划分到单个模块的话,那么AOP就是把涉及到众多模块的某一类问题进行统一管理。AOP的目标就是把这些功能集中起来,放到一个统一的来控制和管理。利用AOP思想,这样对业务逻辑的各个部分进行了隔离,从而降低业务逻辑各部分之间的耦合,提高程序的可重用性,提高开发效率。
AOP术语:
横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
切面:类是对物体特征的抽象,切面是对横切关注点的抽象。
切入点:对连接点进行拦截的定义。
区别:
OOP是纵向结构,AOP是横向结构。
OOP注重业务逻辑单元的划分,AOP偏重业务处理过程中的某个步骤阶段
它们的联系两者之间是一个相互补充和完善的关系。
二 应用场景:
只要是系统的业务模块都需要引入通用模块,就可以使用AOP。以下是一些常用的业务场景:
1 参数校验和判空 2 Android API23+的权限控制 3 无痕埋点 4 安全控制 5 日志记录 6 事件防抖
7 性能统计 8 事务处理 9 异常处理
三 AOP方法
Android AOP常用的方法有JNI HOOK和静态植入。
1 动态织入Hook方式
在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中。相对静态AOP更加灵活,但切入的关注点需要实现接口,对系统有一点性能影响。
2 动态字节码生成
原理就是在运行期间目标字节码加载后,通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父方法的调用,顺势切入横切逻辑,由于是通过子类来代理父类。
四 ASM简介
ASM是一个字节码操作框架,可用来动态生成字节码或者对现有的类进行增强。ASM可以直接