首先双手奉上官方文档 官方文档直通车
首先我们要知道为什么使用热修复?
热修复就是让用户不知道的情况下对App进行打补丁修复,比如用户反馈发现重大bug然后就会找到程序员进行及时修改,对App进行修复然后再从新打包上线,这样比较耗费人力,所以就出现了热修复,通过事先定设定的借口从网上下载无bug的代码来替换有bug的代码,这样比较省事用户体验也好,尤其是对于用户量多的App,一个bug不只是影响到几个几十个用户,一些创业公司的APP,崩溃或者bug可能直接导致用户卸载和永不使用所以我们的app也要适当考虑加入热修复
原理:
Tinker呢是基于类加载来实现的,对于底层我也不太懂,简单介绍一下
前提是不必须保证Apk的主包没有问题,可以跑得起来
首先有一个系统原有的Apk,然后我们自身也有一个类加载器加载和系统一样的apk进行对比,然后通过事先定义好的接口去下载没有问题的文件包,加载到自身进行合并,并且提升自己的优先级,让这个Dex文件排在dexElements数组前面 然后通过反射插入到系统的dexElements数组中,而ClassLoader加载到正确的类之后就不会去加载有bug的类了,然后让类加载器重新加载。
Android的类加载器分为两种 PathClassLoader和DexClassLoader 都继承BaseDexClassLoader
PathClassLoader用来加载系统类和应用类
DexClassLoader用来加载jar ,apk, dex文件,加载jar,apk也是最终抽取里面的Dex文件进行加载
方案:
基于ClassLoader的双亲委托模型,给原ClassLoader设置parent ClassLoader,这样查找类时,会优先会使用parent ClassLoader去加载补丁类,其余类交给原ClassLoader.