Shadow icon indicating copy to clipboard operation
Shadow copied to clipboard

在插件进程中启动Provider,这个Provider在另外一个进程,出现hostContentProviderDelegate is null的报错问题

Open BBNO opened this issue 2 years ago • 8 comments

在插件进程中启动Provider,这个Provider在另外一个进程,出现以下报错问题: java.lang.IllegalArgumentException: hostContentProviderDelegate is null ,请检查ContentProviderDelegateProviderHolder.setDelegateProviderHolderPrepareListener是否调用,或PluginContainerContentProvider 是否和插件在同一进程。 报错的代码:

private void checkHostContentProviderDelegate() {
        if (hostContentProviderDelegate == null) {
            throw new IllegalArgumentException("hostContentProviderDelegate is null ,请检查ContentProviderDelegateProviderHolder.setDelegateProviderHolderPrepareListener是否调用,或" + this.getClass().getSimpleName() + " 是否和插件在同一进程");
        }
    }

BBNO avatar Mar 29 '22 02:03 BBNO

Provider的壳子和插件Uri的对应转换关系只存在于Loader内存中,因此插件不能跨进程直接调用。Activity、Service也是如此。

支持这一特性需要对Loader添加跨进程共享插件信息的进一步开发。

shifujun avatar Mar 29 '22 03:03 shifujun

能否帮忙做一下这方面的支持?

BBNO avatar Mar 29 '22 07:03 BBNO

Shadow是一个开源技术交流项目,并不提供商业服务。

如果我们业务中有遇到这种场景,我们有这方面的实现的话,我们是很乐意开源分享出来的。不过暂时没有这方面的需求。

shifujun avatar Mar 29 '22 08:03 shifujun

怎么对这种场景进行支持,能给个思路吗?

BBNO avatar Mar 29 '22 10:03 BBNO

https://github.com/Tencent/Shadow/blob/11a71f0ea95decc4de7ad58953f8bc97a4b2d654/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/PluginContentProviderManager.kt#L34-L49

Provider的映射信息就是这个类的3个Map。所以你需要让不同进程的这个类的对象相互共享其他进程的这些map。

一旦找到映射关系,将插件的Provider映射成系统认可的壳子Provider,那么跨进程调用Provider本身就是正常被系统支持的了。然后壳子Provider因为带有映射关系作为参数,就可以在对应进程里委托Loader再映射回插件Provider。

shifujun avatar Mar 29 '22 11:03 shifujun

进程间怎么去共享这三个map,有没有参考的例子?

BBNO avatar Mar 30 '22 02:03 BBNO

进程间怎么去共享这三个map,有没有参考的例子?

用任何跨进程通信方案都可以的。

shifujun avatar Mar 30 '22 02:03 shifujun

我Provider声明在宿主的mainfest中,属于主插件进程,也会出现这个问题。 这是为何?Provider应该是可以在插件进程中声明的吧?

aa5279aa avatar Aug 24 '22 07:08 aa5279aa