Tinker如何实现热修复

时间:2021-7-21 作者:qvyue

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工作流程

Tinker如何实现热修复
106.png
Tinker如何实现热修复
107.png

dex文件放到旧版的前面,双亲委派机制被使用(classloader原理)

资源文件直接替换AssetManager

tinker的dex会包含所有的class信息,所以比较大。tinker自研了Dexdiff算法用来减小体积。

基于Dex的差分算法 Dexdiff

算法举例:

Tinker如何实现热修复
108.png

先对内容进行排序,并有两个指针指向队首:

Tinker如何实现热修复
109.png

逐个比较(删除多余的、判断新增的,相等的也记录变化)

Tinker如何实现热修复
110.png

优化了位置8的replace(两个操作成了一个)。最终如下

Tinker如何实现热修复
111.png

记录了所有操作。

实际上比较的内容:

Tinker如何实现热修复
112.png

最核心的DexSectionDiffAigorithm里的execute()方法源码:

Tinker如何实现热修复
113.png

最后,连续相同的Index的Add和Del 替换为replace

基于Dex的合成算法

最核心的DexSectionPatchAigorithm里的execute()方法源码和上面差分的主要内容完全一样。

Dex加载

Tinker如何实现热修复
114.png

把extraElements插到了前面,把剩下的original插到了后面。

皮肤包资源增量差分方案

Tinker如何实现热修复
115.png

1替换新的AssetManager时只需要添加一个AssetPath
2App则有一些合成开销,如果资源包比较大,会比较耗时

Tinker如何实现热修复
116.png

BSDiff算法基于Entry作比较

Tinker如何实现热修复
117.png

下面的if是为了兼容5.0以前的版本

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。