shifujun

Results 282 comments of shifujun

https://github.com/Tencent/Shadow/blob/150c24e69d537ae5479e9450669c3679a27fc631/projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/BasePluginManager.java#L326-L332 这个deleteInstalledPlugin是早就合入了的。前面贴的没合入的只是测试代码。

`deleteInstalledPlugin`完全是持久化相关的卸载操作。你可以看一下代码,它就是删除文件和删除数据库的行。返回值是true就是成功了。没有IO异常的话一般不会失败的。 Shadow没有内存中卸载已加载插件的能力。Android系统没有相关的底层接口支持反加载class或so。

> 在宿主无法在强转为BaseFragment。 怎么无法?缺少关键信息。

你遇到的Crash跟fragment没有关系,是那个fragment类中引用的activity类型所致的。 除此之外,宿主使用插件fragment还需要在资源上在宿主和插件中二选一。因为fragment只能和其attach的activity共用context。 从你的需求来说,完全没必要复用fragment这个官方设计。你可以模仿它的思想自己写一个将activity代码分解的类型,就不会遇到这么多和android系统api的冲突了。

> 资源activity使用宿主的,fragment使用插件的 这是现在无法做到的。因为Fragment的设计就是跟Activity使用相同Context的,所以它只能使用宿主资源。 因此我才建议你自己定义一个MyFragment接口,模仿Fragment的设计去解耦你的Activity代码到插件中。 Fragment主要关心的是Activity的生命周期以及其他和系统交互的API,对View并不特别干涉。而View本身是可以有独立的Context的。所以宿主中的Activity是可以添加来自插件的View的,这个View可以有自己来自插件的资源。

应该是可行的,这样做就是把宿主中一个Fragment类的部分代码委托到插件中的普通类,从而动态化了。 宿主获取插件Context,以及宿主获取你定义的普通类,都需要通过控制反转设计,由插件向宿主注入这些类或对象的工厂。就像`simple-host-lib`中的类那样。

@DaSheng1994 方便的话,请签署一下cla,这是腾讯开源项目统一的协议。 ![image](https://user-images.githubusercontent.com/3535204/111420155-abc0a180-8725-11eb-8e21-8ab5f41bf0e2.png)

插件Manifest中声明的process都是无效的。实际上插件的Manifest对系统来说不可见,它其中能生效的配置都是通过插件框架进行解析后,转换为运行时逻辑使其生效的。比如插件的ContentProvider声明后可以被找到,也是插件框架通过宿主中的壳子Provider调用参数进行转换而实现的。 对于进程process字段来说,没有运行时的API可以使我们动态创建新进程,因此无法支持这一字段。插件框架最多可以做到将其绑定到宿主中已注册的进程中。Shadow目前是通过PPS来绑定不同进程的。 与此相关的知识可以自行搜索,应该来说插件技术都无法支持动态新增进程。 另外,Wiki有一篇与此相关:[Shadow的跨进程设计与插件Service原理](https://juejin.im/post/5d1968545188255543342406)

可以参考测试代码: https://github.com/Tencent/Shadow/blob/aa7dcf4b834fccb3d024f2c87b8a7485a2366545/projects/test/dynamic/host/test-dynamic-host/src/main/AndroidManifest.xml#L90-L93 添加多个PPS,然后由不同的manager持有它们操作对应进程。

支持不支持什么特性永远是试试才准确。“支持,但不完全支持”可能是常态。 compose基本上是完全自绘的,所以应该没什么需要特别支持的地方,我猜是支持的。