2

我有一个在 Google Play 上发布的 Android 应用程序,它在很大程度上是在 RenderScript 中实现的(本机,不使用支持库 API)。该应用程序有时似乎在 libCB.so 中崩溃。Google Play 管理中心报告的崩溃率为 1.40%。

崩溃似乎发生在从 6.0 到 8.1(API 级别 23-27)的所有 Android 版本中。即使应用程序的 minSdkVersion 为 18(Android 4.3),我也没有收到旧版本的报告。各种制造商的各种设备似乎都受到了影响,无论是廉价的杂牌产品,还是高端设备。

该应用程序使用 Camera 1 API 从实时预览视频 ( setPreviewCallbackWithBuffer ) 中捕获帧。PreviewCallback通过一系列处理该输入的 RenderScripts 发送帧数据。在两个阶段,处理后的数据也被发送到两个不同的TextureViews。如有必要,我可以提供更多详细信息。

我不确定是什么导致了这个问题,因为我无法在我自己的任何测试设备上本地重现它。

有谁知道这个问题的原因可能是什么,或者是否有任何解决方法?

这是一个典型的回溯:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Xiaomi/land/land:6.0.1/MMB29M/V9.2.2.0.MALMIEK:user/release-keys'
Revision: '0'
ABI: 'arm'
pid: 17840, tid: 17862, name: JNISurfaceTextu >>> com.app.my <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x38
r0 00000000 r1 00000000 r2 00000002 r3 00000000
r4 00000000 r5 ef8e0a38 r6 00000002 r7 00000000
r8 ab06e808 r9 00000000 sl 00000000 fp ef8e0c30
ip e044d8f8 sp ef8e09f8 lr e03ac9b3 pc e03ac89c cpsr 800f0030

backtrace:
#00 pc 0003189c /system/vendor/lib/libCB.so (cl_mem_non_local_event_cache_state_transition+15)
#01 pc 000319af /system/vendor/lib/libCB.so (cl_mem_grant_access_to_device_internal+58)
#02 pc 00031ae5 /system/vendor/lib/libCB.so (cb_grant_access_to_device+84)
#03 pc 0000eb61 /system/vendor/lib/librs_adreno.so
#04 pc 0000683b /system/vendor/lib/librs_adreno.so
#05 pc 000068a1 /system/vendor/lib/librs_adreno.so
#06 pc 00007f33 /system/vendor/lib/librs_adreno.so
#07 pc 00009707 /system/vendor/lib/librs_adreno.so
#08 pc 00009ee5 /system/vendor/lib/librs_adreno.so
#09 pc 000088f5 /system/vendor/lib/librs_adreno.so (rsdVendorScriptInvokeForEach3+236)
#10 pc 00019bf9 /system/vendor/lib/libRSDriver_adreno.so (_Z29rsdVendorInvokeForEachWrapperPKN7android12renderscript7ContextEPNS0_6ScriptEjPPKNS0_10AllocationEjPS6_PKvjPK12RsScriptCall+84)
#11 pc 00019cfb /system/vendor/lib/libRSDriver_adreno.so (_Z27rsdScriptInvokeForEachMultiPKN7android12renderscript7ContextEPNS0_6ScriptEjPPKNS0_10AllocationEjPS6_PKvjPK12RsScriptCall+38)
#12 pc 0002ebf3 /system/lib/libRS.so (_ZN7android12renderscript7ScriptC10runForEachEPNS0_7ContextEjPPKNS0_10AllocationEjPS4_PKvjPK12RsScriptCall+294)
#13 pc 00033e41 /system/lib/libRS.so (_ZN7android12renderscript22rsp_ScriptForEachMultiEPNS0_7ContextEPKvj+48)
#14 pc 000311ff /system/lib/libRS.so (_ZN7android12renderscript8ThreadIO16playCoreCommandsEPNS0_7ContextEi+338)
#15 pc 00023d27 /system/lib/libRS.so (_ZN7android12renderscript7Context10threadProcEPv+646)
#16 pc 0004185b /system/lib/libc.so (_ZL15__pthread_startPv+30)
#17 pc 000192a5 /system/lib/libc.so (__start_thread+6)
4

2 回答 2

1

崩溃主要与 libCB.so 相关吗?如果是这样,则可能是 Qualcomm RenderScript 驱动程序中的错误。我怀疑它只会影响某些 SOC。

请在https://buganizer.corp.google.com/issues?q=componentid:192772中提交错误,并附上重现此错误的潜在步骤。

于 2018-04-13T02:03:10.663 回答
1

好吧,我们在为 Android 编译的 opencv c++ 代码中遇到了类似的问题。

我们的错误是设置了调用 jni 函数的计时器,然后忘记了它们要清除。最终垃圾收集器无法跟踪导致内存泄漏的引用。所以我们的应用程序过去常常崩溃,除非它被用户杀死,可能是一整天。

您是否在代码中的任何位置设置计时器?

或者您是否正在跟踪调用 jni 函数的线程(如果它们中的任何一个存在)?

如果您有兴趣,您可能想检查一下:Timer::purge()

于 2018-04-12T12:40:20.343 回答