shadow
dynamic-host项目
PluginProcessService:
放到插件进程的Service。作用
- 1.代表插件进程的生命周期。插件进程由它触发创建,由它负责自毁。
- 2.接收反向注册进来的插件文件路径管理器(UuidManager),供Loader查找Manager安装好的插件文件路径。
- 3.加载动态实现的Runtime和Loader。
- 4.获取Loader的Binder接口。
- 5.使插件中的Service能够跨进程工作。
PpsBinder:
Service端执行远程指令
PPSController:
Client端发送远程指令
ImplLoader:
通过DexClassLoader
负责APK加载
PluginManager:
(Manager
接口实现类DynamicPluginManager
)负责插件的下载逻辑、入口逻辑,预加载逻辑等(一切还没有进入到Loader之前的所有事情)
1
2
3
4
5
6
7
/**Manager的唯一方法,宿主中只会调用这个方法。传入当前界面的Context以便打开下一个插件Activity。
* @param context context
* @param formId 标识本次请求的来源位置,用于区分入口
* @param bundle 插件中可能用到的参数
* @param callback 用于从PluginManager实现中返回View
*/
void enter(Context context, long formId, Bundle bundle, EnterCallback callback);
- ShadowPluginLoader:负责插件加载(抽象类,loader工程需要继承这个模块eg.SamplePluginLoader)
- 两个重要的函数
1 2
getHostActivityDelegate//:获取Host Activity代理 getHostContentProviderDelegate//:获取Host ContentProvider代理
- 怎么创建
- 1.loader工程需要实现
CoreLoaderFactory
工厂(比如simple-loader中的CoreLoaderFactoryImpl) - 2.DynamicPluginLoader通过1中的工厂名称反射创建实例。
- 1.loader工程需要实现
加载插件流程
graph TD
PluginLoadActivity.startPlugin -->A[HostApplication.getApp.getPluginManager]
A-->B1[SamplePluginManager.enter]
B1-->B2[SamplePluginManager.onStartActivity]
B2-->C1[FastPluginManager.installPlugin]
C1-->C2[FastPluginManager.startPluginActivity]
C2-->C3[FastPluginManager.convertActivityIntent]
C3-->C4[FastPluginManager.loadPlugin]
C4-->C5[FastPluginManager.loadPluginLoaderAndRuntime]
C5-->C6{mPpsController == null}
C6-->|true|D1[PluginManagerThatUseDynamicLoader.bindPluginProcessService]
D1-->D2[PluginManagerThatUseDynamicLoader.waitServiceConnected]
C6-->|false|D3[PluginManagerThatUseDynamicLoader.loadRunTime]
D3-->D4[PluginManagerThatUseDynamicLoader.loadPluginLoader]
D2-->D3
D4-->E1[BinderPluginLoader.loadPlugin]
This post is licensed under CC BY 4.0 by the author.