插件化

2019-04-02  本文已影响0人  wintersweett

类似微信 加载其他apk的页面

首先我们要明确需要解决的三个问题:

1、代码的加载 :创建DexClassLoader加载插件dex文件

2、资源的加载:创建Resources加载资源文件

3、生命周期:创建代理activity,管理插件生命周期

关于2中资源的加载,我们可以源码中查看一下具体是那几个类,以及是如何加载资源的,

首先我们在activity中的getResource()方法来自Context类,而这里是一个抽象方法,继而找到实现类ContextImpl

图1

ContextImpl中返回了mResources,继续找

图2

可以看到,被resources赋值,而这个resources来自packageInfo的getResources方法

图3

来自ActivtyThread的getTopLevelResources()方法

图4 图5 图6 图7 图8 图9 图10

通过以上10幅图,我们可以得出结论:Resources初识化的时候,借助了AssetManager对象,AssetManager对象通过调用addAssetPath(),将apk路径添加到资源管理器里,最后生成Resource对象返回出来。所以Resouce对象才拥有了访问应用程序资源的功能

如图11:

(1)Resource是不能访问插件apk的资源文件的,需要创建Resources,创建过程中关联AssetManager,而AssetManager需要关联插件apk的path

(2)PathClassLoader不能直接访问到插件apk的dex文件,需要创建一个DexClassLoader去加载dex文件

(3)Instrutation管理activity的生命周期,插件没有运行,即使将插件apk的activity实例化了,也是不具备生命周期的,所以就没有上下文,此时我们需要创建一个代理类Proxyactivity,使得它与Activity的生命周期同步。

图11
上一篇下一篇

猜你喜欢

热点阅读