类似微信 加载其他apk的页面
首先我们要明确需要解决的三个问题:
1、代码的加载 :创建DexClassLoader加载插件dex文件
2、资源的加载:创建Resources加载资源文件
3、生命周期:创建代理activity,管理插件生命周期
关于2中资源的加载,我们可以源码中查看一下具体是那几个类,以及是如何加载资源的,
首先我们在activity中的getResource()方法来自Context类,而这里是一个抽象方法,继而找到实现类ContextImpl
图1ContextImpl中返回了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
网友评论