开源库Android知识图谱

Tinker如何实现热修复

2021-04-01  本文已影响0人  flynnny

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.png

dex文件放到旧版的前面,双亲委派机制被使用(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.png

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

116.png

BSDiff算法基于Entry作比较

117.png

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

上一篇下一篇

猜你喜欢

热点阅读