在 OnePlus 6 上显示广告时应用程序崩溃

Posted

技术标签:

【中文标题】在 OnePlus 6 上显示广告时应用程序崩溃【英文标题】:App crashes when displaying an advertisement on OnePlus 6 【发布时间】:2018-11-17 02:55:37 【问题描述】:

我们在 Google Play 商店中发布了一个应用程序,它可以显示来自 Google DFP 的广告。

在某些广告上,应用程序在 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

有谁知道如何修复或捕获此崩溃?它现在正在影响一个非常大的用户群。

【问题讨论】:

如果没有堆栈跟踪,你怎么知道广告是罪魁祸首? @TimCastelijns 我们自己拥有一部 OnePlus 6 手机,并注意到应用程序在显示广告时崩溃了,很容易重现 你在复制它时得到堆栈跟踪吗? @TimCastelijns 不是 stracktrace,但我们得到了类似的东西:gist.github.com/Sammekl/66fc018f81a04d21717440924a206bdb @Sammekl 如果我找到什么我会告诉你的 【参考方案1】:

我发现了问题。这是由于在前一个应用程序之上安装此应用程序造成的。之前的应用在 Web 视图中使用了某种形式的 GPU 缓存,这会干扰新应用。

GPU 缓存位于应用的内部存储位置:

data/data/com.sammekl.myapp/app_webview/GPUCache

我通过在新应用首次启动期间使用名为 deleteRecursively() 的 Kotlin File 扩展函数递归删除此目录中的所有文件解决了此问题。

val gpuCache = File("$context.filesDir.parent/app_webview/GPUCache")
gpuCache.deleteRecursively()

【讨论】:

作为新应用,app_webview不应该是空的吗? @更好的是 app_webview 目录是在显示 webview 时创建的,它包含本地存储、cookie 和其他一些缓存内容。我们的应用具有旧应用中的 app_webview 内容。这以某种方式破坏了功能

以上是关于在 OnePlus 6 上显示广告时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

我的应用在显示Admob广告时崩溃(非页内广告)

Flutter 应用程序在 Android 模拟器上运行,但不在物理设备上(OnePlus 7T)

MKMapView 在 iOS 6 上显示用户位置时崩溃

加载原生广告时 Facebook Audience Network 广告应用程序崩溃

尝试加载插页式广告时 Flutter 应用程序崩溃

Google Admob Ad 在加载插页式广告时崩溃应用