插件化

作者: wintersweett | 来源:发表于2019-04-02 17:14 被阅读0次

    类似微信 加载其他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

    相关文章

      网友评论

          本文标题:插件化

          本文链接:https://www.haomeiwen.com/subject/uwukbqtx.html