Tencent / Shadow

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

请问:如果host有loader和runtime后,插件还支持动态loader和runtime吗? #1265

Closed budaowengd closed 6 months ago

budaowengd commented 7 months ago

我们有10个SDK需要做成插件化,大部分SDK插件不需要动态loader和runtime,部分SDK插件需要,

请问: 1、如果host有loader和runtime后,插件还支持动态loader和runtime吗? 2、每个SDK都需要维护自己的loader和runtime,维护成本有点高,有啥更好的方式吗?

shifujun commented 7 months ago

不管是loader还是什么部分,它能动态化完全是基于classloader查找类的原理实现的。不同classloader加载的同名类压根就不是一个类。宿主和插件或者loader等都是不同classloader加载的,它们各自打包了什么类根本不相关。让它们协作起来就是设计好跨classloader查找类的方案,典型的例子就是双亲委派机制。

多个loader之类的问题有很多种解决方案。如果多个插件的loader总是同一份代码,那它们似乎就是同一个uuid发布的一套插件,只是partkey不同。uuid主要是标识各部分是同一个版本,可以协同工作。如果是不同版本或业务总是复用同一个part,那可以在下载和打包层面复用文件,为相同文件分配新的uuid就可以了。插件管理这块和业务相关性比较大,自己完全重新实现也是可以的,不会和shadow的主要代码有什么冲突。我其实想把manager删掉,引入一个开源的管理库来代替这块功能。但没找到合适的。

budaowengd commented 7 months ago

感谢指教,明白了您说的了,谢谢。

SunShineMy66 commented 7 months ago

你们是每个插件.apk、Loader.apk、Runtime.apk都放到zip包里吗?感觉维护起来很麻烦,每次都要打3个apk。

我想把把Loader 和 Runtime 直接集成到Host里面。 如果zip包里没有Loader.apk就默认使用Host的,如果有,则使用zip包里的,不知这种方案是否可行呢?