1. 当前常见热修复框架
基本上只在国内用,国外比较佛系,有错发版改就哦了。就像在国外Kotlin大行其道的时候,国内还在java 一统江湖,Kotlin 畏畏缩缩,还没成气候。
热修复框架笼统讲,分为两个流派:
-
multidex 流
Tinker Q-Zone 鹅厂出品
AndFix 阿里出品 -
Instantrun 流
Robust 美团出品
2. AndFix 方案
image.pngnative层动态hook java 层代码,NDK开发,注解方式,实现AOP,AndFix 为即时生效。
3. Robust
image.pngimage.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构造函数内部,加上 相关类 的直接使用(反射引用是不行的)。
网友评论