在 OnePlus 6 上显示广告时应用程序崩溃
App crashes when displaying an advertisement on OnePlus 6
我们在 Google Play 商店中发布了一个应用程序,它可以显示来自 Google DoubleClick for Publishers 的广告。
在某些广告中,应用程序在 OnePlus 6 上崩溃。我们在崩溃报告中没有得到堆栈跟踪,但在 Google Play 控制台中收到错误日志,如下所示。我们确定它是由广告引起的,因为它只出现在有广告的版本上。此外,崩溃出现在广告呈现期间。
Google Play 中的回溯显示每次崩溃的以下日志:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.myapp.app <<<
backtrace:
#00 pc 000000000076eb50 /vendor/lib/libllvm-glnext.so (ShaderObjects::loadProgramBinary(CompilerContext*, void*, unsigned int, QGLC_LINKPROGRAM_RESULT*)+855)
#01 pc 00000000006ddba5 /vendor/lib/libllvm-glnext.so (CompilerContext::loadProgramBinary(void*, unsigned int, QGLC_LINKPROGRAM_RESULT*)+108)
#02 pc 000000000077fb73 /vendor/lib/libllvm-glnext.so (QGLCLoadProgramBinary(void*, void*, unsigned int, QGLC_LINKPROGRAM_RESULT*)+54)
#03 pc 00000000001612b1 /vendor/lib/egl/libGLESv2_adreno.so (EsxShaderCompiler::LoadProgramBinaryBlob(EsxContext*, EsxProgram*, void const*, unsigned int, EsxInfoLog*)+164)
#04 pc 0000000000140191 /vendor/lib/egl/libGLESv2_adreno.so (EsxProgram::LoadProgramBinary(EsxContext*, unsigned int, void const*, int)+186)
#05 pc 00000000000aff67 /vendor/lib/egl/libGLESv2_adreno.so (EsxContext::GlProgramBinary(unsigned int, unsigned int, void const*, int)+230)
#06 pc 00000000000991d9 /vendor/lib/egl/libGLESv2_adreno.so (glProgramBinary+40)
#07 pc 0000000001748bff /data/app/com.android.chrome-2SPtcpkG5Ik-UldbIaNfyw==/base.apk
我们在本地成功地重现了这一点并得到了以下痕迹:
https://gist.github.com/Sammekl/66fc018f81a04d21717440924a206bdb
有谁知道如何修复或捕获此崩溃?它现在正在影响一个非常大的用户群。
我发现了问题。这是由于在以前的应用程序之上安装此应用程序引起的。之前的应用程序在 webviews 中使用了某种形式的 GPU 缓存,这会干扰新的应用程序。
GPU 缓存位于应用程序的内部存储位置:
data/data/com.sammekl.myapp/app_webview/GPUCache
我通过在新应用程序首次启动期间使用名为 deleteRecursively()
的 Kotlin File
扩展函数递归删除此目录中的所有文件来解决此问题。
val gpuCache = File("${context.filesDir.parent}/app_webview/GPUCache")
gpuCache.deleteRecursively()
我们在 Google Play 商店中发布了一个应用程序,它可以显示来自 Google DoubleClick for Publishers 的广告。
在某些广告中,应用程序在 OnePlus 6 上崩溃。我们在崩溃报告中没有得到堆栈跟踪,但在 Google Play 控制台中收到错误日志,如下所示。我们确定它是由广告引起的,因为它只出现在有广告的版本上。此外,崩溃出现在广告呈现期间。
Google Play 中的回溯显示每次崩溃的以下日志:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.myapp.app <<<
backtrace:
#00 pc 000000000076eb50 /vendor/lib/libllvm-glnext.so (ShaderObjects::loadProgramBinary(CompilerContext*, void*, unsigned int, QGLC_LINKPROGRAM_RESULT*)+855)
#01 pc 00000000006ddba5 /vendor/lib/libllvm-glnext.so (CompilerContext::loadProgramBinary(void*, unsigned int, QGLC_LINKPROGRAM_RESULT*)+108)
#02 pc 000000000077fb73 /vendor/lib/libllvm-glnext.so (QGLCLoadProgramBinary(void*, void*, unsigned int, QGLC_LINKPROGRAM_RESULT*)+54)
#03 pc 00000000001612b1 /vendor/lib/egl/libGLESv2_adreno.so (EsxShaderCompiler::LoadProgramBinaryBlob(EsxContext*, EsxProgram*, void const*, unsigned int, EsxInfoLog*)+164)
#04 pc 0000000000140191 /vendor/lib/egl/libGLESv2_adreno.so (EsxProgram::LoadProgramBinary(EsxContext*, unsigned int, void const*, int)+186)
#05 pc 00000000000aff67 /vendor/lib/egl/libGLESv2_adreno.so (EsxContext::GlProgramBinary(unsigned int, unsigned int, void const*, int)+230)
#06 pc 00000000000991d9 /vendor/lib/egl/libGLESv2_adreno.so (glProgramBinary+40)
#07 pc 0000000001748bff /data/app/com.android.chrome-2SPtcpkG5Ik-UldbIaNfyw==/base.apk
我们在本地成功地重现了这一点并得到了以下痕迹: https://gist.github.com/Sammekl/66fc018f81a04d21717440924a206bdb
有谁知道如何修复或捕获此崩溃?它现在正在影响一个非常大的用户群。
我发现了问题。这是由于在以前的应用程序之上安装此应用程序引起的。之前的应用程序在 webviews 中使用了某种形式的 GPU 缓存,这会干扰新的应用程序。
GPU 缓存位于应用程序的内部存储位置:
data/data/com.sammekl.myapp/app_webview/GPUCache
我通过在新应用程序首次启动期间使用名为 deleteRecursively()
的 Kotlin File
扩展函数递归删除此目录中的所有文件来解决此问题。
val gpuCache = File("${context.filesDir.parent}/app_webview/GPUCache")
gpuCache.deleteRecursively()