Tencent / Shadow

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

宿主获取插件Fragment可显示,宿主跳转到插件FragmenActivity报错,请指教 #1274

Closed budaowengd closed 3 months ago

budaowengd commented 6 months ago

一 需求: 插件模块:有 AFragmen 和 AFragmentActivity,2个类都是androidx.fragment.app包下的

宿主模块有2个按钮: 需求1:点击按钮1,跳转到 插件的 AFragmentActivity。 需求2:点击按钮2,获取插件的 AFragmen,并显示在当前宿主Activity页面。

二 问题: 需求1,在Shadow默认可以实现。 需求2,会报错java.lang.ClassCastException: com.plugin.testa.AFragmen cannot be cast to androidx.fragment.app.Fragment

三 改造: 为了解决业务2,在加载插件的时候,配置了白名单 androidx.fragment.app,ok,需求2可以实现了。

但是需求1又不行了,会报错 AFragmentActivity cannot be cast to "com.tencent.shadow.core.runtime2.ShadowActivity"

参考了:https://github.com/Tencent/Shadow/issues/669、https://github.com/Tencent/Shadow/issues/151 还没解决

请问上面的需求1和需求2可以同时实现吗?调试了2天,还没有结果,请帮忙看下。@shifujun

sansecy commented 5 months ago

插件Activity会经历transform 白名单区分了class使用宿主还是插件, 配置白名单意味着,使用宿主的androidx.fragment,那么插件activity被拉起时会出现 xxxFragmentActivity cannot be cast to "com.tencent.shadow.core.runtime2.ShadowActivity", fragment被添加进宿主中可能会遇到资源访问的问题。 不配置白名单,宿主使用插件fragment会出现androidx.fragment.app.Fragment cannot be cast to "androidx.fragment.app.Fragment" 本质上shadow在设计上就是为了资源隔离,所以用法上是以Activity为基准 如果要按照需求设计,那么应该是在宿主创建一个fragment来适应宿主的环境,然后让插件的功能来创建view,再把view放进宿主的fragment里

budaowengd commented 3 months ago

明白了,谢谢兄弟指教