Tencent / Shadow

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

使用shadow反射插件资源时出现异常 #1324

Closed AndroidMuggle closed 1 month ago

AndroidMuggle commented 1 month ago

本地集成shadow的时候,需要在宿主中反射调用插件中的类及方法,发现了两个问题: 1、constraintlayout的约束属性未正常生效 2、插件资源中使用string对象赋值给textview的text属性异常 我这边已经fork了代码并提交了可复现的代码,分支为[test_reflection_android_muggle],主要的代码逻辑在com.tencent.shadow.sample.host.PluginLoadActivity#startPlugin方法内,麻烦大佬看看,可能是什么原因导致的呢,不胜感激

shifujun commented 1 month ago

在宿主中加载插件View并不是Shadow的设计目的。Shadow虽然也在宿主中加载插件View了,但这个宿主的Activity是很特别的ContainerActivity。ContainerActivity的Context和各种生命周期方法都完全服务于插件框架。所以插件的View才能正常在ContainerActivity这个宿主Activity中正常工作。

你的尝试是更进一步的想在任何宿主Activity里使插件View正常工作。你的代码中只修改了宿主Activity的getResources方法。这是完全不够的。你可以把传给LayoutInflater的context换成ChangeApkContextWrapper,就会发现那个text加载出来了。所以ChangeApkContextWrapper中多做的事解决了这个问题。

约束布局的自定义属性还需要更多的代码支持,所以ShadowLayoutInflater又多做了很多事。

总之,你拿Shadow的部分代码利用遇到问题是很正常的。

AndroidMuggle commented 1 month ago

好的,非常感谢大佬的解答!!!我这边业务里有这种使用场景,所以在调研通过插件反射的方式 ,将view相关逻辑解耦。大佬提到的ChangeApkContextWrapper和ShadowLayoutInflater这一块的逻辑细节自己确实不太了解,还是要再认真看看框架的一些实现细节。再次感谢大佬的解答!!!