前言
什么是热修复?
热修复其实在外面大家日常生活中很常见,就比如现在很火的腾讯手游,在进入游戏经常有一些数据包进行更新,然后再进入到游戏中,这其实也就是游戏中出现了一些BUG,检查更新也就是对这个BUG进行修复,这个数据包也可以称之为补丁包
效果图如下:
热修复的优势
热修复通常具有无需重新对应用程序进行下载的功能,极大的方便了用户对应用程序的体验感,也因其热修复也使用户不用消耗过多的流量,所以变向的节省了用户的流量
对公司而言,热修复技术能够极大的提高对BUG的修复率,同时也避免了因为这种BUG的出现导致对公司的带来的业务中的损失,可以将这种损失达到最低化
热修复的不足
热修复虽然可以对BUG的修复率能够进行极大的提高,但并不能保证所有的热修复框架进行一个完全的修复,也就是说对BUG的修复只是相对的
热修复的框架的核心技术
热修复的代码是其最为常见的,同时也是我们要进行热修复中必不可少的一部分,通常在程序发生错误的时候其实都是代码逻辑中出现的错误。我们进行热修复所使用的方案也不过是仅仅对戴安热修复进行支持,下面是对框架结构的说明
框架结构主要分为三类
代码修复:
一个app程序重新启动中,会对补丁中的类进行一个优先加载,以此来达到其热修复的结果,andfix所使用的方式就是使用替换功能在已经加载了类中的native层进行替换,也就是在其本身的类上进行修改,以此来对其达到即时生效的结果
资源修复:
基本上在当前市面上有很多的资源热修复方案都是以lnstant Run为其参考实现
资源修复总的来说一共分为两步,首先先构造出一个新的AssetManager,让其通过反射进行调用addAssetPath,然后将其进入到AssetManager中,这样就能够得到一个拥有其所有新资源的AssetManager,最后再找到引用到AssManager的所有之前的地方,让其通过反射,将引用出替换成AssetManager,这样就达到了资源修复的结果
动态链修复:
现在的操作系统中通常有很多以DLL作为后缀的文件,称之为应用程序拓展,也就是系统里的动态链接库文件,一般来说,有很多的应用程序进行运行的过程中基本上都会对这些动态库文件进行一个调用,同样的,在对应用程序进行卸载的时候,这些动态链文件也会被其误删,这样就会使其他程序进行运行时因无法找到动态链文件而发生错误,当然了,遇到这种问题也并不需要对其重装操作系统,只要对其动态库文件进行修复即可解决
项目文件结构图:
现在我们就开始实现热修复的功能
第一步:首先编写一个带有bug代码文件 BugClass.java
public class BugClass {
static String str1 = "bug已修复,优秀!"; //修复后的代码
static String str2 = "一个完美的bug"; //默认是带有bug的
public static String Bug(Context context){
Toast.makeText(context,str2,Toast.LENGTH_SHORT).show();
return str2;
}
}
第二步:对 FixDexUtil.java 热修复工具类进行复制
public class FixDexUtil {
//这下面两个属性可自己修改
private