zhuqichao
zhuqichao
> > “插件线程”,”apk运行在线程“,这都是很难理解的说法。建议还是通过代码交流。https://github.com/Tencent/Shadow/blob/50678f5228660b0a7a4b91576605721a89c9ba7c/CONTRIBUTING.md#issue > > 宿主进程一般是主进程,当前进程里有个Activity,能去加载运行在其他进程中的apk(也就是插件)中的view吗? 官方demo中是有类似示例代码的,但是实现方式比较奇怪,是通过全局变量持有宿主的布局容器,然后插件去使用这个布局容器将view添加到宿主中的。 如果宿主和插件运行在同一进程,有比较简单的方式实现,我已验证可行
> 应该是要实现多个`PluginManagerThatSupportMultiLoader`的子类,每个子类分配一个新概念`PluginKey`的值。 > > PPS基类也要换成对应的`MultiLoaderPluginProcessService`。 > > 由`PluginKey`对应多套runtime、loader、插件。然后这个manager的`mPpsController`的类型是`MultiLoaderPpsController`,对比`PpsController`每个方法就都多出了`PluginKey`。 > > 这样调用`getPluginLoaderForPlugin`方法得到的还是跟以前一样的`PluginLoader`接口。所以“插件的partKey”如何传入和以前就是一样的了。 好像不行吧,是这样理解吗: 每个插件有一个PluginKey,每个PluginKey对应一个PluginManagerThatSupportMultiLoader的子类 1、manager对象在什么时机创建呢? 2、由于一个进程只有一个PPS实例,那么PluginManagerThatSupportMultiLoader的onPluginServiceConnected也只会回调一次吧
> > 每个插件有一个PluginKey > > 不是每个插件,是每个`PluginManagerThatSupportMultiLoader`的子类,对应每个loader。 > 我需要实现的需求是,每个进程管理多个插件,每个插件有独立的loader,从而解决重复添加组件的问题,是否是这个场景,如果是的话,是每个插件对应一个PluginManagerThatSupportMultiLoader的子类吗? > > manager对象在什么时机创建呢? > > 和之前一样,由宿主中的代码自行决定。 > 之前不是宿主自行决定,是通过实现ManagerFactory,返回manager实例的 > > 由于一个进程只有一个PPS实例,那么PluginManagerThatSupportMultiLoader的onPluginServiceConnected也只会回调一次吧 > > 你应该还没有测试吧?每个manager实例应该都是独立bind的PPS,所以它们都会各自收到一次bind的回调,进而回调到`onPluginServiceConnected`方法。 > > PS:刚才发现这里的`onPluginServiceConnected`方法名不对,应该叫`onPluginProcessServiceConnected`。
> ` /data/user/0//files/miguplugins/plugin-manager-app.apk/0x6ed667cc40`这个apk看起来还像是shadow项目输出的manager.apk。但是` /data/user/0/包名/[email protected]/0x6f7f2428c0`就完全不是Shadow项目生成的了。所以我推断你的项目里有其他流程"duplicate classes or playing wrongly with class loaders"。 分析崩溃数据,发现崩溃100%是Android9设备,由日志看和Android9内联优化有关 排查代码发现,plugin-manager-app.apk打包了本应该在宿主里的MultiLoaderPluginProcessService这个类,是不是和这个有关系?
宿主新建一个包名类名一致的空类就可以了
这个经过验证是AGP的bug,同样的shadow SDK包,在高版本的AGP就没有这个问题,低版本就有这个问题,目前发现只能通过结束Java进程解决,或者升级AGP版本,但是还没有确定是哪个AGP版本修复
经过实际测试,原生系统在unbindService时是不会回调onServiceDisconnected的
插件manifest中的meta-data属性无效
这个一般是apk文件出问题了,损坏或者被删除了
目前来看,插件本身是不支持多进程的,只能通过宿主在子进程中启动对应插件,因为插件中service并不是真正的service,只是通过PluginServiceManager这个管理类调用了PluginService的生命周期,模拟了service的运行,因此插件中service组件的process属性是不起作用的