1. 面向切面编程
1.1 定义
AOP是Aspect Oriented Program的首字母缩写,译为:面向切面编程。类似的OOP,译为:面向对象编程。
-
AOP:在这些独立的模块间,在特定的切入点进行hook,将共同的逻辑添加到模块中而不影响原有模块的独立性。下图,在不同的模块中加入日志、缓存、性能检测功能,并不影响原有的架构。
-
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内存中,唯一一个不会发生OOM的内存块。
2.2、为什么要设计程序计数器呢?
2.2.1、CPU时间片段轮转机制:
CPU在一段时间片段内,会有多个线程来争斗CPU的时间片,但是谁能获得当前时间片,取决于系统调度。
比如:
三个线程A B C 同时争夺CPU资源,A线程获得CPU时间片,那么它执行自己的代码,执行完成,程序计数器指向。
下图表示的就是栈区代码执行的过程
ASM 框架中,有几个重要的角色
1、ClassReader分析器:负责分析Class字节码文件
2、ClassWriter:负责操作class字节码文件
3、ClassVisitor:class访问器,可以访问类信息:包括类的属性,方法,以及注解,唯独不能操作方法体
4、MethodVisitor:方法访问器,可以访问操作方法体