Shadow icon indicating copy to clipboard operation
Shadow copied to clipboard

Caused by: java.lang.ClassCastException: androidx.appcompat.widget.ContentFrameLayout cannot be cast to androidx.appcompat.widget.ContentFrameLayout

Open 9c-x opened this issue 1 year ago • 2 comments

现象 当宿主打开过appCompatActivity之后,插件里面打开appCompatActivity闪退,报类型强转失败 具体错误是下面的: Caused by: java.lang.ClassCastException: androidx.appcompat.widget.ContentFrameLayout cannot be cast to androidx.appcompat.widget.ContentFrameLayout at androidx.appcompat.widget.ActionBarOverlayLayout.pullChildren(Unknown Source:10) at androidx.appcompat.widget.ActionBarOverlayLayout.setWindowCallback(Unknown Source:0) at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(Unknown Source:177) at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(Unknown Source:4) at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(Unknown Source:0) at androidx.appcompat.app.AppCompatActivity.setContentView(Unknown Source:4) at com.theartofdev.edmodo.cropper.CropImageActivity.onCreate(Unknown Source:5) at com.tencent.shadow.core.loader.delegates.ShadowActivityDelegate.onCreate(Unknown Source:297) at com.tencent.shadow.core.runtime.container.PluginContainerActivity.onCreate(Unknown Source:58) at android.app.Activity.performCreate(Activity.java:8159) at android.app.Activity.performCreate(Activity.java:8131) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)

原因 shadow的pluginClassloader的parent使用的是宿主的classloader,只是在loadClass方法里面自己实现了类加载逻辑。实现可以加载宿主的类,但是不走双亲委托模式。但是在系统的LayoutInflater里面sConstructorMap会缓存以前实例化过的view的类构造方法,下一次createView时会检查classloader是否匹配,因为插件的classloader是继承宿主的,所以遍历检查时也是符合的。就直接使用宿主加载过的类创建view返回给插件了,导致插件里面findViewById时强转失败(因为强转的类型是插件加载的,findViewById是拿到以前inflater时createView,这个是宿主的class) 解决办法: 修改PluginClassLoader,将parent改为宿主的classloader的parent。在loadClass里面将原来的super.loadClass(className, resolve),改为直接调用hostClassLoader.loadClass(className)。 修改后加载正常了

9c-x avatar Jan 12 '24 05:01 9c-x

感谢反馈问题。

我需要复现一下问题再确定是不是bug。view构造器缓存我记得是考虑在内的。也许有考虑不全的情况,也许是另外的原因。但我倾向于classloader结构不需要修改。我也得重新看一下那个缓存逻辑,和之前的应对措施。已经记不太清了。

shifujun avatar Jan 12 '24 10:01 shifujun

感谢反馈问题。

我需要复现一下问题再确定是不是bug。view构造器缓存我记得是考虑在内的。也许有考虑不全的情况,也许是另外的原因。但我倾向于classloader结构不需要修改。我也得重新看一下那个缓存逻辑,和之前的应对措施。已经记不太清了。

这个确认有结果了吗

9c-x avatar Jan 17 '24 01:01 9c-x