本文汇总了主流的热修复框架,并对每个框架的特性做了简单的介绍,主流方案比较如下图。
方案对比 | Andfix | 阿里百川HotFix | Sophix | 微信Tinker | 饿了么Amigo | 美团Robust |
---|---|---|---|---|---|---|
即时生效 | yes | yes | 同时支持即时生效和冷启动修复 | no | no | yes |
方法替换 | yes | yes | yes | yes | yes | yes |
so替换 | no | no | yes | yes | yes | no |
资源替换 | no | no | yes | yes | yes | no |
四大组件 | no | no | yes | no | yes | no |
实现原理 | 方法替换jni Hook | 方法替换jni Hook | 组合多种方法 | 修改dexElements数组 | 直接替换classLoader | java hook |
补丁生成 | 依赖apkpatch工具 | SophixPatchTool界面工具 | 便捷,图形化界面 | gradle命令生成 | 新Apk即是补丁文件 | gradle生成 |
补丁大小 | 较小 | 较小 | 不大,仅变动的资源和代码 | Davilk全量较大,Art差异包 | 较大 | 较小 |
接入成本 | 低 | 低 | 低 | 一般 | 低 | 高 |
性能开销 | 较小 | 较小 | 不大,仅变动的资源和代码 | 在App里合成,较大 | 全量替换,较大 | 较小 |
服务器支持 | 无 | 有,支持加密传输及签名校验 | 支持服务端控制 | TinkerPatch平台 | 有,已停止更新 | 无 |
Andfix
原理
方法替换是 AndFix 的热修复方案的关键,虚拟机在加载一个类的时候会将类中方法解析成 ArtMethod 结构体,结构体中保存着一些运行时的必要信息以及需要执行的指令指针地址。那么我们只要在 native 层将原方法的 ArtMethod 结构体替换成新方法的结构体,那么执行原方法的时候便会执行到新方法的指令ÿ