Android热修复总结

来源:互联网 发布:淘宝鞋店推荐女鞋 编辑:程序博客网 时间:2024/05/22 10:57

一、名词理解

1.插件化、热修复、热更新的理解

插件话:apk分为宿主和插件部分,插件在需要的时候才加载进来

                插件话开发的时候有两种场景,一种是插件与宿主apk完全没有交互,还有一种是宿主与插件有很多交互。

                滴滴的插件话技术开源框架:点击打开链接

热修复:更新的类或者插件粒度较小的时候,一般用于修复bug

热更新:其实和热修复是一样的。

2.2016年Google的Android Studio推出了Instant Run功能,同时提出了三个名词。

热部署:方法内的简单修改,无需重新启动app和Activity

暖部署:app无须重启,但是Activity需要重启,比如对资源的修改

冷部署:app需要重启,比如继承关系的改变或者方法签名的变化等


二、目前已开源的Android热修复框架

1、HotFix(QQ空间)

2、Andfix(支付宝)

3、Sophix(手机淘宝)

4、NuWa(大众点评)

5、Tinker(微信)

6、Amigo(饿了么)

...


三、Android热修复的三大领域

1、代码修复

      代码修复两大方案,一种是阿里系的底层替换方案,另一种是腾讯系的类加载方案。

      *底层替换方案限制颇多,但是实效性好,加载轻快,立即见效。

      *类加载方案实效性差,需要重新冷启动才能见效,但是修复范围广,限制少。

2、资源修复

      目前市面上的很多资源热修复基本上都是参考了Instant Run的实现。实际上,Instant Run的推出正式推动这次热修复浪潮的原因。各家热修复方案,在代码、资源等方面的实现,很大程度上参考了Instant Run的代码,而资源修复方案正式被拿来用到最多的地方。

      简单说来,Instant Run中的资源热修复分为两步:

(1)构造一个新的AssetManager,并通过反射调用addAssetPath,把这个完整的新资源包加入到AssetManager中。这样就得到了一个含有所有新资源的AssetManager。

(2)找到所有之前引用到的缘由AssetManager的地方,通过反射,将引用处替换为AssetMamager。

3、so修复

     so库的修复本质上是对native方法的修复和替换

Sophix采用的是类似类修复反射注入的方式。把补丁so库的路径插入到nativeLibraryDirectories数组的前面,就能够达到加载so库的时候是补丁so库,而不是原来的so库目录,从而达到热修复的目的。


四、注意事项

1、在本地执行远端下发的代码是嫉妒危险的行为,利用此方法执行非法代码会绕过审查。

2、在一些访问非常密集的地方使用热更新可能会对效率产生较大的影响,应该避免使用。

3、首先,检查热更新补丁一定要建立在https上,因为下发代码是极其危险的,如果被劫持,后果是无法想象的。其次,请求时最好自       动带上Android版本、手机型号、地区等信息,以方便更精确下发。

4、如果想做hotpatch,一定要保证我们的hotpatch dex文件出现在dexElements列表的前面。


五、Alibaba的热修复技术发展

1、最开始手机淘宝基于Xposed进行改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术--Dexposed。但是这个方案对底层Dalvik结构过于依赖,最终无法继续兼容Android 5.0以后的ART虚拟机。

2、后来支付宝提出了新的热修复方案Andfix。Andfix同样也是一种底层替换方案,但是只提供了代码层面的修复,对于资源和so的修复都没有实现。

3、2017年6月,阿里巴巴手机淘宝团队联合阿里云正式发布新一代飞侵入式Android热修复方案--Sophix。


六、Sophix技术原理

代码修复:

代码修复两大方案,一种是阿里系的底层替换方案,另一种是腾讯系的类加载方案。

      *底层替换方案限制颇多,但是实效性好,加载轻快,立即见效。

      *类加载方案实效性差,需要重新冷启动才能见效,但是修复范围广,限制少。

底层替换方案:

底层替换方案是在已经加载了的类中直接替换掉原有的方法,是在原来类的基础上进行修改的。因而无法实现对原有类进行方法和字段的增减,因为这样会破坏原有类的结构。

一旦补丁类中出现了方法的增加和减少,就会导致整个这个类以及整个Dex的方法数的变化。方法数的变化伴随着方法索引的变化,这样访问方法时就无法正常地索引到正确的方法了。

如果字段发生了增加或减少,和方法变化的情况一样,所以偶字段的索引都会发生变化。

底层替换方案最为人诟病的地方在于不稳定性,而Sophix可以无视底层结构,解决了这个问题。

类加载方案:

类加载方案的原理是在app重新启动的时候让Classsloader去加载新的类。因为app运行到一半的时候,所需要的发生变更的类已经被加载过了,在Andriod上无法对一个类进行卸载。如果不重启,原来的类还在虚拟机中,就无法加载新类。因此只能在下次重启的时候,载还没走到业务逻辑之前抢先加载新类,这样后续访问这个类时,就会Resolve为新类,从而达到热修复的目的。


七、QQ空间的HotFix实现原理

QQ空间热补丁动态修复技术介绍

原创粉丝点击