Tencent / Shadow

零反射全动态Android插件框架
BSD 3-Clause "New" or "Revised" License
7.36k stars 1.29k forks source link

关于插件uuid的设计问题 #1317

Closed spaceLB closed 2 months ago

spaceLB commented 2 months ago

基于现在的设计,是不是没办法动态的给插件分配进程。现在的系统好像是默认同一个Service里的所有插件uuid都是一样的。如果我有两个不同uuid的插件包,是不是没办法把他们加载到同一个Service里?

shifujun commented 2 months ago

uuid是版本号。一组不同partkey的插件可以协同工作,就可以分配相同的uuid。插件启动在哪个进程,是由PPS和ContainerActivity决定的。这两件事不相关。

manager的代码是动态的,就可以动态的决定从哪一个PPS 启动插件。

spaceLB commented 2 months ago

en, 我再说详细一点吧,我两个partkey不同,uuid也不同,然后在manager里面给他们分配同一个pps来加载。由于pps里面对之前加载pluginLoader时的uuid做了缓存,所以后面用partkey来加载插件时,第一个先加载的插件是可以的,但加载第二个插件时,由于pps里缓存了第一个插件的uuid,就直接使用第一个插件的uuid去处理了,造成第二个插件找不到。

spaceLB commented 2 months ago

#929,之前有人提过这个问题,当时的回复确实是同一个进程只能启动相同uuid的插件,想问下这么设计的初衷是什么?如果改成同一个进程启动不同uuid的插件有没有什么问题?

shifujun commented 2 months ago

uuid是版本号。关于版本控制都是些通用的设计,没什么特殊的。混合加载不同版本的组件会引起什么问题可以参考一些动态库兼容性方面的资料,都是差不多的。

spaceLB commented 2 months ago

我们的理解可能有点偏差,应该不涉及到版本控制的问题。比如这里有两个插件,我们没办法控制他们uuid必须一样,他们有各自的版本,但理论上还是应该可以把他们分配到同一个进程。我看现在的设计里同一个进程中的插件uuid必须要统一,为什么不同的插件uuid要一致呢?

shifujun commented 2 months ago

你没有提供具体的场景,也许你的插件非常简单,没有版本控制也能正常工作。比如一个插件是计算器,一个插件是相册,那它们就没什么关系嘛。版本不一致也不会显露出什么问题。但这种情况下你也可以把它们版本号设为相同的,也不影响什么。

你要还认为这跟版本控制没关系,就关了issue吧。这个uuid就是版本号。没啥好讨论的了。

spaceLB commented 2 months ago

你举的这个例子就可以啊,按照你的解释,计算器和相册的版本号每次都要设置一样,否则就没法在同一个进程。但实际开发中,计算器和相册的版本号不可能一直一样吧,比如计算器出问题了,我升级了一个版本,相册没动,那计算器新版本插件下发之后就不能和老版本的相册在同一进程工作了。不知道这个场景,你们怎么处理呢?

shifujun commented 2 months ago

版本号可以一直一样,这个uuid又不是编译到插件里的。它只是安装插件时的配置文件内容。怎么组织插件包,怎么管理怎么下发都可以在CI/CD环节处理。

如果相册没有更新,又是完全兼容的,我们给新的uuid的相册分配和旧的uuid的相册同一个相册apk文件就行了。又或者插件都很小,就当相册也更新了,也没什么关系,可以简化逻辑,也是一种选择。

对于运行时的插件系统来说,要有这个uuid来阻止混乱的版本组合一起加载。这是一种基本保障。

你也可以把uuid去掉,也可以开发更复杂的版本号兼容逻辑。自己评估好成本和风险就好了。

spaceLB commented 2 months ago

了解,谢谢