面向切面编程

1. 面向切面编程

1.1 定义

AOP是Aspect Oriented Program的首字母缩写,译为:面向切面编程。类似的OOP,译为:面向对象编程。

  • AOP:在这些独立的模块间,在特定的切入点进行hook,将共同的逻辑添加到模块中而不影响原有模块的独立性。下图,在不同的模块中加入日志、缓存、性能检测功能,并不影响原有的架构。


    image.png
  • OOP:面向对象思想简单理解就是,需要把各功能封装为独立模块,然后把他们简单拼装成为产品。Android系统的各个模块封装就遵循OOP(下图)。


    这里写图片描述

2. 框架

名称 Time 操作对像 优点 缺点
使用JDK的动态代理API RunTime java类 无需引入第三方框架 耦合性比较强,仅仅对java接口有效
AspectJ BuildTime class文件字节码 门槛低,上手简单。对开发者友好 框架过于复杂;破坏封装;需要专门的Java编译器
Dexposed RunTime Dexposed只对部分系统版本有效,不支持art平台。因此在2015年 Android L推出后,它就逐渐失声,慢慢地淡出了广大开发者的视线了
Xposed RunTime xposed需要root权限
javassit BuildTime(配合Gradle自定义Task使用) class文件字节码 简单,效率高,使用java编码,对开发者友好 Javassist实现机制中包括了反射,所以比ASM慢
BCEL BuildTime(配合Gradle自定义Task使用) class文件字节码 简单,效率高,使用java编码,对开发者友好 比ASM慢
ASM BuildTime(配合Gradle自定义Task使用) class文件字节码 效率高,灵活,可以感知细到字节码指令层次 门槛高,比较难使用,API非常底层,贴近字节码层面,需要字节码知识和虚拟机相关知识,对开发者不友好

(偏方)DexMaker:Dalvik 虚拟机上,在编译期或者运行时生成代码的 Java API。
(偏方)ASMDEX(一个类似 ASM 的字节码操作库,运行在Android平台,操作Dex字节码)

不同工具库生成同一个类的耗时比较

2、下面,主要介绍一下ASM字节码插桩的原理。

2.1、JVM内存模型:

JVM内存模型

程序计数器:
是线程私有的,在多线程环境下,记录程序执行位置,是在JVM内存中,唯一一个不会发生OOM的内存块。

2.2、为什么要设计程序计数器呢?

2.2.1、CPU时间片段轮转机制:
CPU在一段时间片段内,会有多个线程来争斗CPU的时间片,但是谁能获得当前时间片,取决于系统调度。
比如:
三个线程A B C 同时争夺CPU资源,A线程获得CPU时间片,那么它执行自己的代码,执行完成,程序计数器指向。

多线程争斗CPU时间片

下图表示的就是栈区代码执行的过程


栈区代码执行演示

ASM 框架中,有几个重要的角色
1、ClassReader分析器:负责分析Class字节码文件
2、ClassWriter:负责操作class字节码文件

Class字节码操作流程

3、ClassVisitor:class访问器,可以访问类信息:包括类的属性,方法,以及注解,唯独不能操作方法体
4、MethodVisitor:方法访问器,可以访问操作方法体

Visitor

你可能感兴趣的:(面向切面编程)