动态加载框架分析之:DL(Dynamic-load-apk)
该框架也是一个较有知名度的安卓动态化框架,由几位国人发起并维护,目前仍在不断的更新中,继对PluginMgr的分析之后,这里再对DL的实现原理进行剖析:DL项目地址:https://github.com/singwhatiwanna/dynamic-load-apk 一款已商业化运营的动态加载框架:apkplughttp://www.apkplu
该框架也是一个较有知名度的安卓动态化框架,由几位国人发起并维护,目前仍在不断的更新中,继对PluginMgr的分析之后,这里再对DL的实现原理进行剖析:
DL项目地址:https://github.com/singwhatiwanna/dynamic-load-apk
一款已商业化运营的动态加载框架:apkplug
正文:
与PluginMgr相比,DL的主要区别是采用了正向代理依赖的方式,没有了动态生成Dex字节码的过程,这样省去了学习DexMaker语法的过程,但是在写代码时就要注意继承DL框架中指定的组件类了,无法像PluginMgr那样对代码的编写没有特殊要求。
在开发时,普通的Activity要继承自 DLBasePluginActivity,FragmentActivity要继承自DLBasePluginFragmentActivity,下面对主要部分做详细说明:
ProxyActivity:
DL框架中动态Apk中的Activity均是依附于ProxyActivity来使用的,Host宿主中的Manifest中要对ProxyActivity进行配置,代码片段如下:
框架初始化时同样是要对动态Load的Apk包进行解析,以获取相关的组件信息与包信息,当要启动动态Apk中的Activity时,DL做了这些处理:
1,用自定义的Classloader对动态包中的目标Activity类进行装载并初始化对象
2,对目标Activity的类型进行判断,找到与类型相对应的ProxyActivity
3,启动对应的ProxyActivity,同时目标Activity作为Intent参数传递
在ProxyActivity内部,主要借助了DLProxyImpl来完成ProxyActivity与目标动态Activity的相互依赖绑定,相关的核心代码在DLProxyImpl类的launchTargetActivity函数内:其中mPluginActivity为动态目标Activity
依赖绑定的过程在ProxyActivity的OnCreate中完成,绑定后,动态目标Activity中的相关生命周期回调就会由ProxyActivity来代理执行,而一些上下文环境则直接使用ProxyActivity的。mRemoteActivity即是与Proxy绑定的动态目标Activity。
相对的,根据Activity类型的不同,代理Activity也分成了两个,普通Activity对应的是DLProxyActivity,FragmentActivity对应的是DLProxyFragmentActivity,它俩内部的实现与原理几乎一致。
同样的,DL也对Service组件进行了支持,原理与对Activity的实现一致,都是采用正向的代理依赖,同时将代理Service与动态包中的Service进行相互绑定的方案来实现的,在此不再赘述,可参看项目代码。
动态包资源:
对于资源的引用,DL的解决方案与PluginMgr中的一致,都是采取反射并修改了AssetManager中的addAssetPath方法,对应的代码在DLPluginManager的createAssetManager方法中:
、
然后根据此AssetManager创建对应的Resources对象供ProxyActivity获取资源使用。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)