动态加载框架分析之:DL(Dynamic-load-apk)

该框架也是一个较有知名度的安卓动态化框架,由几位国人发起并维护,目前仍在不断的更新中,继对PluginMgr的分析之后,这里再对DL的实现原理进行剖析:


DL项目地址:https://github.com/singwhatiwanna/dynamic-load-apk

 

一款已商业化运营的动态加载框架:apkplug

http://www.apkplug.com/

正文:

与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方法,对应的代码在DLPluginManagercreateAssetManager方法中:

 

然后根据此AssetManager创建对应的Resources对象供ProxyActivity获取资源使用。

你可能感兴趣的:(Android,安卓,ANDROID,应用,动态化,DL)