插件化和热修复是Android开发较为高级的知识点,是中级开发人员通向高级开发中必备知识点,插件化知识:插件化。下文是对热修复的总结:
什么是热修复?
简单来讲,热修复就是为了修复线上问题而提出的修补方案,程序修补过程无需重新发版。
优点:
正常开发软件流程一般是: 线下开发-->上线-->发现bug-->紧急修复上线。这种方式代价太大。
而热修复的开发流程显得更加灵活,无需重新发布版本,实时高效热修复,无需下载新的应用,代价小,最重要的是及时修复了bug。
当前热门的热修复技术
1:qq空间超级补丁
2:微信Tinker
3:饿了么Amigo
4:美团Robust :
5:360RePlugin :
6:滴滴出行VirtualAPK 等
热修复
要弄清热修复技术的原理,就要先弄清Android的ClassLoader机制。Android的ClassLoader分为PathClassLoader和DexClassLoader,它们都都继承自BaseDexClassLoader,其中PathClassLoader用来加载系统类和应用类;DexClassLoader用来加载jar、apk、dex文件。例如下面要介绍的阿里的Andfix和Sophix的原理如下:
AndFix:
由补丁类的classLoader加载补丁类,在native层针对不同Android架构中的不同的ArtMethod结构调用对应的replaceMethod方法按照定义好的ArtMethod结构一一替换方法的所有信息如所属类、访问权限、代码内存地址等。 稳定性较差,会受到国内ROM厂商对ArtMethod结构更改的影响,所以这正是AndFix不支持很多机型的原因。
Sophix:
由补丁类的classLoader加载补丁类,在native层直接memcpy(smeth,dmth,sizeof(ArtMethod))替换整个artMethod的结构。初始化类时会为这个类分配空间,AllocArtMethodArray会紧挨着的new出来放入art中的方法数组中。通过计算辅助类的前后两个方法的起始地址就可以计算出artMethod结构的大小了。 注:补丁类初始化时,也会分配自己的artMethod空间,拿这个修复过的新ArtMethod去替换旧ArtMethod的内容,不用管ArtMethod的结构。稳定性大大提高!
代码修复有两大主要方案:一种是阿里系的底层替换方案,另一种是腾讯系的类加载方案。底层替换方案限制颇多,但时效性最好,加载轻快,立即见效。类加载方案时效性差,需要重新冷启动才能见效,但修复范围广,限制少。
网友评论