Andfix热修复


Andfix的patch文件生成过程:

1、在gradle文件中去引入AndFix的热修复模块。

2、对Andfix所有的API做出封装,封装采用单例模式。封装完以后再application类中完成AndFix的一个初始化。其中我们会调用PatchManager的2个方法。分别是init()方法、loadPatch()方法。

3、利用apk新旧包,使用apkpatch命令生成apatch包。

4、下载patch文件,下次应用重启时生效。

代码具体实现:首先我们定义了一个service,通过service可以让整个修复过程在后台默默的执行,在service中首先执行oncreate方法进行一些初始化工作,比如补丁文件要存放的文件夹,然后就是onStartCommand方法,在其中发送一个事件去checkHasPatch

源码讲解:

打开与我们直接交互的类PatchManager,比较重要的成员变量就是经过排序的set数组,这个数组里面包含了我们应用的所有patch文件。

然后就是PatchManager的构造方法,它就是进行了一系列的初始化,比如上下文context的初始化、AndFixManager、文件夹等等的一些初始化。

下面看一下init方法的实现:它就是对patch文件的删除和添加。如果应用版本升级了,它就删除所有的patch文件,如果应用版本没有它就将所有的patch文件都添加到Set 数组中。

loadPatch:它重载了两个构造方法,一个是没有参数的,没有参数的它会调用mPatch的这个列表,然后对所有的Patch文件中的class都调用一次AndFixManager的Fix()方法;而指定了patch文件的loadPatch方法,它就是单一的修复指定patch文件夹中class。但是无论是有参数的loadPatch方法,还是无参数的他们最终调用的都是AndFixManager的    Fix()方法。而fix()的方法它只是起到了一个转化的效果,将所有class的名字转化为所有的class字节码,有了真正的字节码以后,其中通过反射注解来找到哪些方法需要被替换,最终通过JNI完成方法的替换,从而达到bug的修复。

发布了36 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/j18874964028sss/article/details/78534448