Stardust:Android插件补丁于一体的解决方案

2017-01-08  本文已影响539人  Dozen

这篇文章分享了笔者近几个月在插件和热补丁技术方面的一些经验积累以及我们开发的动态加载框架Stardust.

Stardust是什么

针对Android平台,集热更新热修复于一体的解决方案,一套机制解决两个问题

它主要包括三个部分:

简单的背景介绍

Qihoo360/DroidPlugin
CtripMobile/DynamicAPK
mmin18/AndroidDynamicLoader
singwhatiwanna/dynamic-load-apk
houkx/android-pluginmgr
bunnyblue/ACDD
wequick/Small
主要分为两类:

主流插件框架对比

方案 DroidPlugin、ACDD Dynamic-Load-Apk Small
原理 沙盒 加载独立插件 代理模式 非独立插件 组件化方案 非独立插件
缺陷 兼容性问题 需要写代理方法;对于资源的访问受限 不支持即时生效,需要重启进程;首次启动性能较差

总体来说:
1.沙盒的方案是最极致 也是开发成本最高的,但对兼容性和稳定性提出了很高的要求
2.Small修改资源packageId方案的思路值得借鉴,但不本身不适于产品化,比如首次启动插件的性能问题以及一些兼容性的问题

2.热补丁历史

Java流派:
1)更改classloader加载dex顺序,同时绕过pre-verified:qq空间,nuwa, qfix, robust
2)dex合成:tinkerNative流派: AndFix

| 方案 | Tinker | QZone |AndFix|
| -------- | --------| -- |
| 原理 | 反射classloader+ dexdiff 全量合成 | hack classloader + 插桩 | native hook |
| 缺陷 | 合成逻辑复杂,感觉较重 | 运行时性能受到插桩机制的影响 略差 | 兼容性稳定性较差 |

更详细的比较可以参考Tinker(https://github.com/Tencent/tinker/wiki

Stardust介绍

Stardust 插件与补丁的文件结构

结构图.png

这张图中我们需要了解以下几点:

Stardust框架演进过程

Stardust的开发之路并不是顺利的,最初时并没有想的十分清楚,对于四大组件的支持到什么样的程度?
是否真的有必要支持四大组件的动态更新?
对于热补丁采用哪种机制,Tinker/Qzone/AndFix/QFix?,
这些问题当时都很难回答,也是在开发中不断探索,不断汲取别人的经验,过程中我们借鉴了Small以及QFix设计上的很多思路,对此表示感谢,日后我们也会在Stardust更完善的时候将它开源,与大家共同学习成长。

Stardust的最终形态

效果

目前整套机制还在产品的灰度测试中,已覆盖2000+用户

为什么不支持四大组件的动态加载?

最开始的开发中我们已经开发了对四大组件动态加载的原型,在其后的开发中我们也在不断思考动态化加载方案的优势

而引入hook 四大组件加载的机制对于稳定性、兼容性也提出了更高的要求,以及对于插件的进程管理也需要统一的维护管理,反而不如注册在宿主的AndroidManifest.xml中交由交由系统管理,各自的生命周期,对此仅需要规范的开发流程即可保证。

总结

以上是笔者在插件和补丁的技术研究中的一些收获,目的是为了提供一个新的思路,关于具体的实现技术细节并没有做展开的阐述,感兴趣的同学可以参考提供链接

参考:

插件的演化介绍
QFix热补丁机制Small
Tinker

上一篇 下一篇

猜你喜欢

热点阅读