0%

05-热修复-第二节

说明,第二节课关于热修复的代码落地就不看了,主要关注 06 字节码插桩技术,其他的问题下次有空再看然后补全

一、字节码插桩

1.1 什么是字节码插桩

我们平时在 Java 中编写代码,字节码插桩是在 .class 文件中编写代码。

我们在 AS 中查看 .class 文件的时候,是经过反编译的,变成 java 语言了,真正想看原始的 .class 文件,还需要特定的查看器,课程中老师使用 010 Editor,这个工具可以看很多文件的格式,比如 音频文件,视频文件等等,可以了解下。

所以流程,首先将 .class 读入内存,是个 byte[] ,即 byte 数组,之后再去修改,最后通过 IO 写回去,就完成了。我们不熟悉 .class 文件的格式,所以需要借助ASM这个工具去实现,就像不熟悉 json 格式,可以使用 Gson 框架去解析 json 一样。

二、 ASM 工具

使用步骤:

  1. 通过 testImplementation 的方式引入 ASM 这个工具

  2. 获取 Java 类的 class 文件,可以使用javac 去实现,或者通过 Build

  3. 自己通过 IO 将 class 文件读入 FileInputStream

  4. 通过 ASM 提供的 ClassReader 去读取这个 FileInputStream

  5. 后续监听 ClassReader 解析到的方法(通过 visitMethod 回调)

  6. 改完之后输出结果

我们在监听解析到的方法的时候,一般使用 AdviceAdapter ,因为它提供了2个很好用的方法:onMethodEnteronMethodExit ,一个是刚刚进入方法的时候调用,一个是方法退出的时候调用。这样我们就能很容易执行方法前后插入代码。

ASM 课程也没听完,08听到一半,后续再来

注:热修复demo 老师在最后面给出了 HotFix 的源码,可以用来参考

谢谢你的鼓励