字节码框架ASM与AOP,ASM与BufferKnife/FastJSON,Hook机制与AOP,字节码插桩

-- 字节码插桩-- https://juejin.im/post/5c886d4ce51d4560fd3ea9a7
 生成Android Dex编译过程: .java -> .class -> .dex
 插桩,就是在.class转为.dex之前,修改.class文件从而达到修改或替换代码的目的。对插桩的理解是:插入,替换代码。
 字节码修改工具。如AspectJ,ASM,javasisst。

- 函数插桩知识点:1.Android打包流程;2.Java字节码;3.自定义Gradle插件、Transform API;4.ASM;

-- ASM 与 Transform

一个简单易懂的transformDemo, 包括了如何支持增量更新, 如何使用ASM Core和ASM Tree Api, 具一定的封装性- https://github.com/YuTianTina/TransformDemo

> java字节码框架ASM
  ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。
  ObjectWeb ASM轻量级的Java字节码处理框架,它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。ASM 提供了与 BCEL和SERP相似的功能,只有22K的大小,比起350K的BCEL和150K的SERP来说,是相当小巧的,并且它有更高的执行效率,是BCEL的7倍,SERP的11倍以上。
-- ASM包括主要三个类:
1、ClassReader : 负责从类文件中读取输入流,并依照固定的顺序调用 ClassVisitor 中声明的多个 visitorXxx的方法。
2、ClassVisitor : 抽象类,负责类内容的访问。
3、ClassWriter :负责生成byte[]字节流。ClassWriter是ClassVisitor的子类。

> ASM与AOP;使用ASM操作Java字节码,实现AOP原理;ASM与编译时注解
  BufferKnife与ASM,objectweb asm,一种.class的代码生成器的开源项目.
  用字节码来生成类;使用ASM动态生成Java字节码文件(.class) 或者 加载字节码后动态修改字节码,添加我们需要执行的代码,来模拟实现Spring AOP。
   使用ASM操作Java字节码,实现AOP原理- https://yq.aliyun.com/articles/4798#

> FastJSON使用到了ASM框架

 

> Hook机制与AOP

- Hook 框架 :Epic
Dynamic java method AOP hook for Android(continution of Dexposed on ART), Supporting 4.0~10.0- https://github.com/tiann/epic

神奇的Hook机制,一文读懂AOP编程- https://mp.weixin.qq.com/s/kEqH-mK3nebRbWfg6eQt2Q
- OOP 与 AOP 的区别
1.面向目标不同:简单来说 OOP 是面向名词领域,AOP 面向动词领域。
2.思想结构不同:OOP 是纵向结构,AOP 是横向结构。
3.注重方面不同:OOP 注重业务逻辑单元的划分,AOP 偏重业务处理过程中的某个步骤或阶段。

- 动态字节码生成
  Cglib + Dexmaker , Cglib 是一个强大的,高性能的 Code 生成类库, 原理是在运行期间目标字节码加载后,通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。由于是通过子类来代理父类,因此不能代理被 final 字段修饰的方法。
  但是 Cglib 有一个很致命的缺点:底层是采用著名的 ASM 字节码生成框架,使用字节码技术生成代理类,也就是通过操作字节码来生成的新的 .class 文件,而我们在 Android 中加载的是优化后的 .dex 文件,也就是说我们需要可以动态生成 .dex 文件代理类,因此 Cglib 不能在 Android 中直接使用。有大神根据 Dexmaker 框架(dex代码生成工具)来仿照 Cglib 库动态生成 .dex 文件,实现了类似于 Cglib 的 AOP 的功能。详细的用法可参考:将cglib动态代理思想带入Android开发-https://blog.csdn.net/zhangke3016/article/details/71437287

JavaPoet- https://github.com/square/javapoet
静态织入对系统无性能影响。但灵活性不够:APT;AspectJ;ASM;Javassist;DexMaker;ASMDEX;

https://img-blog.csdnimg.cn/20190228102429909.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYXJlVXM=,size_16,color_FFFFFF,t_70

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值