Shadow icon indicating copy to clipboard operation
Shadow copied to clipboard

PluginContainerContentProvider中call方法的参数extras为空,请问这是什么问题导致的?

Open BBNO opened this issue 2 years ago • 19 comments

 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)

BBNO avatar Mar 03 '22 06:03 BBNO

也看不到你代码,我猜是因为你调了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

shifujun avatar Mar 03 '22 07:03 shifujun

我调用的是这个public open fun call(method: kotlin.String, arg: kotlin.String?, extras: android.os.Bundle?): android.os.Bundle,因为是第三方的,所以看不到源码。如果extras为空时会不会报错?

BBNO avatar Mar 03 '22 07:03 BBNO

Bundle

我怎么没在android.content.ContentResolver 上找到你这个3个参数的call方法呢?

如果你说的这个call方法不是系统API,那不是这个问题的直接原因的。我们只关心对系统API的调用。

extra本来是允许为空的,但是Shadow要对这个call特殊处理,所以即便extra为null,也会为它new一个出来,以便添加shadow自己需要的参数。由于可能是你的这个call调用没有被transform处理到,所以传过去的extra为null报错了。

shifujun avatar Mar 03 '22 07:03 shifujun

我在你们的demo里看到的call也是这三个参数, image

image

BBNO avatar Mar 03 '22 07:03 BBNO

不知道为什么会出现这种情况? image

BBNO avatar Mar 03 '22 09:03 BBNO

我用demo试的话,extras是有值的,能看出是什么原因导致的吗 image

BBNO avatar Mar 03 '22 09:03 BBNO

为什么你们的demo中ContentProvider有走这个方法,而我的项目没有,这是什么原因导致的? image

BBNO avatar Mar 03 '22 09:03 BBNO

你得看一下你的代码中对ContentResolver的call方法调用调的是不是我前面说的新增的那个方法。

shifujun avatar Mar 03 '22 10:03 shifujun

好的 我确认一下 谢谢

BBNO avatar Mar 03 '22 10:03 BBNO

调用的是ContentProviderClient.call(String method, String arg, Bundle extras),是不是就是您说的那个新增方法?如果是的话,能不能帮忙做一下支持? @shifujun

BBNO avatar Mar 03 '22 10:03 BBNO

不是ContentProviderClient,是ContentResolver。

如果因为这个新增方法的问题,前面已经指出来原本那个call方法支持的地方了。着急的话你就先自己写一下支持的代码。我这边得找时间写。

shifujun avatar Mar 03 '22 10:03 shifujun

大佬你好,我确认了一下,我这边调用的不是ContentResolver的call方法,而是直接获取contentResolver里的client然后调用call,这样方式能支持吗? @shifujun

BBNO avatar Mar 04 '22 01:03 BBNO

大佬你好,我确认了一下,我这边调用的不是ContentResolver的call方法,而是直接获取contentResolver里的client然后调用call,这样方式能支持吗? @shifujun

应该是能支持的。你可以看一下现在call方法的支持原理,就是把插件中的authority放到参数里映射一下。

shifujun avatar Mar 04 '22 06:03 shifujun

你好,我做了这样的调整还是不能解决这个问题,请问这个有什么办法解决吗? @shifujun image

BBNO avatar Mar 08 '22 06:03 BBNO

请问ContentResolver的acquireUnstableContentProviderClient方法和ContentProviderClient的call方法有支持吗?

BBNO avatar Mar 08 '22 07:03 BBNO

你还是得理解一下这里redirectMethod的原理和作用。看一看Transform前后业务代码的变化。你截图中只修改了原方法的签名,但是没有修改目标方法的签名,就是那个newCallMethod,还是uriClass作为第2个参数。

ContentResolver的其他方法可能是没有支持的,都可以按照这个原理添加支持。我们开源出来的实现只是满足我们业务需求的代码,所以很多API没有用过也没有支持。如果盲目补全支持,没有自动化测试的情况下很容易出错,所以是现在这个样子。

我这边有时间也会尽量支持的,但是无法提供服务性的承诺。

shifujun avatar Mar 08 '22 08:03 shifujun

好的,非常感谢解答

BBNO avatar Mar 08 '22 08:03 BBNO

目前我已经对ContentResolver的acquireUnstableContentProviderClient方法做了支持,请问如果要对ContentProviderClient的call方法做支持要怎么处理,大概的思路能不能讲解一下。 @shifujun

BBNO avatar Mar 09 '22 02:03 BBNO

ContentProviderClient跟ContentResolver的call方法不是一样吗?最后都是转发到ContentProvider的call方法上。

shifujun avatar Mar 09 '22 06:03 shifujun