Tinker如何实现热修复

作者: flynnny | 来源:发表于2021-04-01 00:06 被阅读0次

    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以前的版本

    相关文章

      网友评论

        本文标题:Tinker如何实现热修复

        本文链接:https://www.haomeiwen.com/subject/afdahltx.html