比较阿里开源组件化和插件化框架的区别
name | 模块化开发 | 模块间路由 | 动态加载 | 热修复 | 兼容性问题 |
---|---|---|---|---|---|
组件化ARouter | 支持 | 支持 | 无 | 无 | 无 |
插件化Atlas | 支持 | 支持 | 支持 | 支持 | 有 |
总的来说,组件化框架功能单一,专心于模块化开发,但没有黑科技,不存在Android版本的兼容问题。而插件化框架功能强大,最关键的是具备热修复、模块动态加载、删除的能力,但因为需要hook系统组件,所以存在可能的兼容性问题。
Atlas的热修复使用的是自家的Andfix,基于Native hook。
插件化实现原理
插件化是体现在功能拆分方面的,它将某个功能独立提取出来,独立开发,独立测试,再插入到主应用中动态加载。以此来规避主应用规模超限。通过代理或Hook来实现。
代理
打开插件中Activity需要的资源要正常打开插件中的Activity,需要以下资源:
1,通过DexClassLoader加载插件apk
2,通过包管理器,获取当前已加载的类信息
3,通过AssetManager获取插件apk中的资源
4,通过壳app中的代理Activity,提供上下文Context和生命周期管理(插件中的四大组件因为并没有注册到壳app的AndroidManifest.xml,所以并不具备生命周期)
通过代理Activity启动和同步插件Activity的生命周期
Hook
hook方式实现插件化Hook其中的第一步或第十步实现插件Activity启动。
通过hook的方式启动插件Activity需要解决如下问题:
a、插件Activity如何绕开Manifest中注册的检测
b、如何创建Activity实例,并同步生命周期
我们通过VirtualApk插件化框架来看其实现方案:
a、预先在Manifest中注册各种启动模式的Activity占坑,启动时hook第1步,将Intent根据启动模式替换成预先在Manifest占坑的Activity,这样就解决了Manifest中注册的检测
b、hook第10步,使用插件的ClassLoader反射创建插件Activity,之后Activity的生命周期回调都通知给插件Activity,这样就解决了创建Activity并同步生命周期的问题
动态加载小tips
1,关于dex的生成
我们可以用dx工具,将jar包转成dex文件
2,dex的加载过程
通过DexClassLoader加载dex文件,然后解析其中的class、method等
网友评论