Tinker如何实现热修复
Android热修复1、class文件与dex文件解析https://www.jianshu.com/p/dea6a368944d
Android热修复2、虚拟机深入讲解https://www.jianshu.com/p/17f7843e09bc
Android热修复3、ClassLoader原理讲解https://www.jianshu.com/p/e3970180a002
Android热修复4、热修复简单讲解https://www.jianshu.com/p/1691685aeedf
Android热修复5、AndFix详解https://www.jianshu.com/p/1cfad3d1079a
Android热修复6、Tinker详解及两种方式接入https://www.jianshu.com/p/0ae5c0c259d1
Android热修复7、引入热修复后代码及版本管理https://www.jianshu.com/p/cd5104a6205c
tinker工作流程
106.png 107.pngdex文件放到旧版的前面,双亲委派机制被使用(classloader原理)
资源文件直接替换AssetManager
tinker的dex会包含所有的class信息,所以比较大。tinker自研了Dexdiff算法用来减小体积。
基于Dex的差分算法 Dexdiff
算法举例:
108.png先对内容进行排序,并有两个指针指向队首:
109.png逐个比较(删除多余的、判断新增的,相等的也记录变化)
110.png优化了位置8的replace(两个操作成了一个)。最终如下
111.png记录了所有操作。
实际上比较的内容:
112.png最核心的DexSectionDiffAigorithm里的execute()方法源码:
113.png最后,连续相同的Index的Add和Del 替换为replace
基于Dex的合成算法
最核心的DexSectionPatchAigorithm里的execute()方法源码和上面差分的主要内容完全一样。
Dex加载
114.png把extraElements插到了前面,把剩下的original插到了后面。
皮肤包资源增量差分方案
115.png1替换新的AssetManager时只需要添加一个AssetPath
2App则有一些合成开销,如果资源包比较大,会比较耗时
BSDiff算法基于Entry作比较
117.png下面的if是为了兼容5.0以前的版本