热修复框架研究

2020-02-29  本文已影响0人  瀚海网虫

1. 当前常见热修复框架

基本上只在国内用,国外比较佛系,有错发版改就哦了。就像在国外Kotlin大行其道的时候,国内还在java 一统江湖,Kotlin 畏畏缩缩,还没成气候。

热修复框架笼统讲,分为两个流派:

image.png

2. AndFix 方案

image.png

native层动态hook java 层代码,NDK开发,注解方式,实现AOP,AndFix 为即时生效。

3. Robust

image.png
image.png

对每个函数都在编译打包阶段自动的插入了一段代码。类似于代理,将方法执行的代码重定向到其他方法中。 即时生效 + 插桩 + 代理 java 层实现

3. Tinker

image.png

问题dex 与修正dex 做差分计算,下发差分dex。
重启后生效。 hook 类加载,利用了dex 加载机制。

Tinker 的热修复的一大亮点是改进了差分算法,bsdiff。针对dex特性,做了优化,dexdiff,效率更高。 但so的热修,依然是基于bsdiff(二进制文件差分)

关于Android N 混合编译:系统可能提前缓存了部分热点class,解决方式为在ActivityThread 启动时,直接替换PathClassLoader,以绕过系统缓存。

关于:Devik 虚拟机 Pre-verified 问题(MainActivity所引用的class,如果被打进同一个dex,且会做Pre-verified 标记),tinker 机制插入dex 至数组头部时,就会报跨dex调用的异常信息:
解决方式:主要是避免类被打上Pre-verified标识,使用gradle插桩的方式,干涉gradle打包流程,在生成javac命令之后,在dx命令之前,在所有我们编写的class构造函数内部,加上 相关类 的直接使用(反射引用是不行的)。

4. 类查找过程

image.png
上一篇下一篇

猜你喜欢

热点阅读