说明,第二节课关于热修复的代码落地就不看了,主要关注 06 字节码插桩技术,其他的问题下次有空再看然后补全
一、字节码插桩
1.1 什么是字节码插桩
我们平时在 Java 中编写代码,字节码插桩是在 .class 文件中编写代码。
我们在 AS 中查看 .class 文件的时候,是经过反编译的,变成 java 语言了,真正想看原始的 .class 文件,还需要特定的查看器,课程中老师使用 010 Editor,这个工具可以看很多文件的格式,比如 音频文件,视频文件等等,可以了解下。
所以流程,首先将 .class 读入内存,是个 byte[] ,即 byte 数组,之后再去修改,最后通过 IO 写回去,就完成了。我们不熟悉 .class 文件的格式,所以需要借助ASM这个工具去实现,就像不熟悉 json 格式,可以使用 Gson 框架去解析 json 一样。
二、 ASM 工具
使用步骤:
通过 testImplementation 的方式引入 ASM 这个工具
获取 Java 类的 class 文件,可以使用javac 去实现,或者通过 Build
自己通过 IO 将 class 文件读入 FileInputStream
通过 ASM 提供的 ClassReader 去读取这个 FileInputStream
后续监听 ClassReader 解析到的方法(通过 visitMethod 回调)
改完之后输出结果
我们在监听解析到的方法的时候,一般使用 AdviceAdapter ,因为它提供了2个很好用的方法:onMethodEnter 和 onMethodExit ,一个是刚刚进入方法的时候调用,一个是方法退出的时候调用。这样我们就能很容易执行方法前后插入代码。
ASM 课程也没听完,08听到一半,后续再来
注:热修复demo 老师在最后面给出了 HotFix 的源码,可以用来参考