微信号:CtripMobile

介绍:携程无线技术公众号,分享携程在无线开发、框架、性能优化以及平台工具方面的实践经验.

再议携程Android动态加载框架DynamicAPK

2015-11-10 22:03 陈博士

上一篇分享了携程的Android插件化和动态加载框架DynamicAPK及其实现原理,很多朋友提出了一些疑问和需求,本篇将针对这些疑问进行解答,相关需求也会尽快加入到代码中。

DynamicAPK是什么?

DynamicAPK是一套用于实现多dex/apk加载的解决方案。它可以帮助你重新组织Android工程的配置和开发模式,实现多个子工程并行开发(以android studio module的形式),同时支持hot fix(在线修复有问题的功能), 插件式载入不常用的功能(下载插件后再载入)。所有动态加载的插件不仅包含代码,也可以包含资源(资源的动态加载比代码要麻烦很多),因此是以APK形式实现的。

DynamicAPK框架是否只适用于Hot Fix?

No. Hot Fix只是DynamicAPK功能之一,其实最初目的还是更好的工程解耦。DynamicAPK不需要实现任何activity或fragment proxy来管理他们的生命周期。修改后的aapt会处理插件中的资源,因此R.java中的资源引用和普通Android工程没有区别。开发者可以保持原有的开发范式,无需做特殊的更改。

目前Hot Fix只能针对插件apk中的功能进行fix,实际上可以针对宿主apk中的任意功能进行hotfix,原理可以参考QQ空间团队的方案,他们对于Android ClassLoader原理的研究更深入,请阅读左下角『阅读原文』。我们会优化现有框架,未来可以实现对宿主apk中的功能进行hot fix。

为什么是使用PathClassLoader而不是DexClassLoader?

携程App比较特殊,启动的时候需要序列化一些插件apk中的对象Model,DexClassLoader会导致出错,因此使用更底层的PathClassLoader。

与其他Android动态加载方案有什么区别?

  • DynamicLoadApk https://github.com/singwhatiwanna/dynamic-load-apk

    迁移成本很重:需要使用『that』而不是『this』,所有activity都需要继承自proxy avtivity(proxy avtivity负责管理所有activity的生命周期)。

    无法启动apk内部的activity。

    不支持Service和BroadcastReceiver。

  • AndroidDynamicLoader https://github.com/mmin18/AndroidDynamicLoader

    迁移成本很重:

    使用资源时要用MyResources.getResource(Me.class)而不是context.getResources()

    使用Fragment作为UI容器,所有每个页面都是使用Fragment而不是Activity,需要使用URL mapping才能实现页面跳转。

  • android-pluginmgr https://github.com/houkx/android-pluginmgr

    未经过生产环境App测试。

    不支持Service和BroadcastReceiver。

  • DroidPlugin from 奇虎360 https://github.com/Qihoo360/DroidPlugin

    非常有趣的动态加载框架!DroidPlugin能够在一个App内启动一个没有安装的完整App。这个特性可能更适合360的安全产品,因为被启动的App和宿主App完全没有任何关联,相互间不能支持资源和代码调用。


 
CtripMobile 更多文章 App定位和地图的那些坑 携程App网络服务通道治理和性能优化@2016 携程Android App插件化和动态加载实践 携程无线新旅程
猜您喜欢 JavaScript基础工具清单 第六讲 getchar() 贝叶斯的路——概率论迷思 【干货】PHP项目中CodeIgniter使用的一些建议 使用Java进行Web开发的随想