Android 热修复方案小结

    xiaoxiao2021-09-11  88

    之前一个blog简单介绍了Android热修复的nuwa使用demo。这篇blog主要来汇总下Android热修复的几种方案和利弊比较。

    Android热修复技术方案主要是两种:1.QQ空间超级补丁和微信Tinker方式。2.阿里巴巴的And Fix、Hot Fix方案。

    现在分别介绍下这两种方案的利弊,及使用场景。

    1. QQ空间超级补丁和微信Tinker方式。

        这两种方案设计的出发点是替换原有的资源、成员变量、方法和类。这两种方式实现的又略有不同。

       1)QQ空间超级补丁

            实现原理是基于Google提供的mutlidex方式。即apk可以加载多个dex文件。针对apk中需要修复的dex,做一个修复的patch.dex文件。当apk重新加载的时候,优先加载patch.dex。之后再加载其他dex文件。这样apk运行的时候,使用的就是新的class文件。

            限制:a)  需要apk重新启动才能生效   

                       b)   需要考虑到Android 对类的verify操作。

                          “Android对类的verify操作”,即apk安装到机器上,在运行时,虚拟机会将dex文件优化成odex文件,

                           在这个过程中,会对类检查,如果一个类的引用都在同一个dex文件中,则会打上CLASS_ISPREVERIFIED的标志。

                            所以,这里我们需要对需要热修复的类都要避免打上这个标志。nuwa(采用该原理),实现方式是让app中所有java都导入一个辅助apk中的类。这样app中所有java文件,导入的类,都不在一个dex文件中,所以,就不会打上CLASS_ISPREVERIFIED标志。

                      c)  patch.dex的加载,会影响app的启动速度。

                      d)  Android ART模式下,如果改动了类的结构,就可能会出现内存错乱的问题。所以,需要将相关类和父类、子类都放到patch.dex。

     2)微信Tinker方式。

         微信的实现原理,则是将patch.dex,与自由的dex文件合并。第二次启动app的时候,会执行新的dex文件,从而解决此问题。

         限制:a) 需要app二次启动才能生效

    b) dex文件合并可能会出现失败

                    c) dex文件合并会占用机器的存储

        总结:1)可以进行成员变量、方法、类的替换。支持力度较大。

                   2)app需要重新启动才能生效

                       

    2.AndFix、HotFix方式。

         HotFix是AndFix的升级版,即将patch.dex文件可以进行加密等安全方面处理。

         它的实现方式是更改方法的引用指针指向,然后及时更新。

         限制:1)只能修改函数。热修复使用范围有限,修改点有限。

         

        总结:1)只能修改函数,不能更新资源文件、添加成员变量等

                   2)app运行时候立刻就能起作用

                   3)代价较小。

                适合函数的bug修复。

    转载请注明原文地址: https://ju.6miu.com/read-677542.html

    最新回复(0)