Shadow
Shadow copied to clipboard
PluginContainerContentProvider中call方法的参数extras为空,请问这是什么问题导致的?
java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter extras
at com.tencent.shadow.core.loader.delegates.ShadowContentProviderDelegate.call(Unknown Source:7)
at com.tencent.shadow.core.runtime.container.PluginContainerContentProvider.call(PluginContainerContentProvider.java:121)
at android.content.ContentProvider.call(ContentProvider.java:2158)
at android.content.ContentProvider$Transport.call(ContentProvider.java:481)
at android.content.ContentProviderClient.call(ContentProviderClient.java:558)
at android.content.ContentProviderClient.call(ContentProviderClient.java:546)
at hux.c5.a(ContentResolver.kt:3)
at hux.ra.a(ServiceManagerConnectorBase.kt:2)
at hux.ra.c(ServiceManagerConnectorBase.kt:3)
at hux.ta$a.a(SystemServiceManager.kt:3)
at hux.ta$a.invoke(SystemServiceManager.kt:1)
at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)
也看不到你代码,我猜是因为你调了API 29新增的call方法还没有支持的关系吧。
https://developer.android.com/reference/kotlin/android/content/ContentResolver?hl=en#call_1
现有代码只支持了一个call方法: https://github.com/Tencent/Shadow/blob/aa7dcf4b834fccb3d024f2c87b8a7485a2366545/projects/sdk/core/transform/src/main/kotlin/com/tencent/shadow/core/transform/specific/ContentProviderTransform.kt#L76-L81
另外,有个相关的类ResolverHook应该是没用了,应该删掉。 https://github.com/Tencent/Shadow/blob/aa7dcf4b834fccb3d024f2c87b8a7485a2366545/projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ResolverHook.java#L30
我调用的是这个public open fun call(method: kotlin.String, arg: kotlin.String?, extras: android.os.Bundle?): android.os.Bundle,因为是第三方的,所以看不到源码。如果extras为空时会不会报错?
Bundle
我怎么没在android.content.ContentResolver 上找到你这个3个参数的call方法呢?
如果你说的这个call方法不是系统API,那不是这个问题的直接原因的。我们只关心对系统API的调用。
extra本来是允许为空的,但是Shadow要对这个call特殊处理,所以即便extra为null,也会为它new一个出来,以便添加shadow自己需要的参数。由于可能是你的这个call调用没有被transform处理到,所以传过去的extra为null报错了。
我在你们的demo里看到的call也是这三个参数,
不知道为什么会出现这种情况?
我用demo试的话,extras是有值的,能看出是什么原因导致的吗
为什么你们的demo中ContentProvider有走这个方法,而我的项目没有,这是什么原因导致的?
你得看一下你的代码中对ContentResolver的call方法调用调的是不是我前面说的新增的那个方法。
好的 我确认一下 谢谢
调用的是ContentProviderClient.call(String method, String arg, Bundle extras),是不是就是您说的那个新增方法?如果是的话,能不能帮忙做一下支持? @shifujun
不是ContentProviderClient,是ContentResolver。
如果因为这个新增方法的问题,前面已经指出来原本那个call方法支持的地方了。着急的话你就先自己写一下支持的代码。我这边得找时间写。
大佬你好,我确认了一下,我这边调用的不是ContentResolver的call方法,而是直接获取contentResolver里的client然后调用call,这样方式能支持吗? @shifujun
大佬你好,我确认了一下,我这边调用的不是ContentResolver的call方法,而是直接获取contentResolver里的client然后调用call,这样方式能支持吗? @shifujun
应该是能支持的。你可以看一下现在call方法的支持原理,就是把插件中的authority放到参数里映射一下。
你好,我做了这样的调整还是不能解决这个问题,请问这个有什么办法解决吗? @shifujun
请问ContentResolver的acquireUnstableContentProviderClient方法和ContentProviderClient的call方法有支持吗?
你还是得理解一下这里redirectMethod的原理和作用。看一看Transform前后业务代码的变化。你截图中只修改了原方法的签名,但是没有修改目标方法的签名,就是那个newCallMethod,还是uriClass作为第2个参数。
ContentResolver的其他方法可能是没有支持的,都可以按照这个原理添加支持。我们开源出来的实现只是满足我们业务需求的代码,所以很多API没有用过也没有支持。如果盲目补全支持,没有自动化测试的情况下很容易出错,所以是现在这个样子。
我这边有时间也会尽量支持的,但是无法提供服务性的承诺。
好的,非常感谢解答
目前我已经对ContentResolver的acquireUnstableContentProviderClient方法做了支持,请问如果要对ContentProviderClient的call方法做支持要怎么处理,大概的思路能不能讲解一下。 @shifujun
ContentProviderClient跟ContentResolver的call方法不是一样吗?最后都是转发到ContentProvider的call方法上。