【问题标题】:Android Webview crashes on Samsung & Android 11Android Webview 在三星和 Android 11 上崩溃
【发布时间】:2021-08-18 22:19:04
【问题描述】:

这是我们在 Firebase 上看到的堆栈跟踪:

Fatal Exception: java.lang.RuntimeException
Using WebView from more than one process at once with the same data directory is not supported. https://crbug.com/558377 : Current process [Our package] (pid 28562), lock owner [Our package] (pid 13324)
org.chromium.android_webview.AwDataDirLock.b (AwDataDirLock.java:27)
as0.i (as0.java:30)
as0.b (as0.java:17)
as0.k (as0.java:2)
com.android.webview.chromium.WebViewChromiumFactoryProvider.g (WebViewChromiumFactoryProvider.java:2)
com.android.webview.chromium.WebViewChromium.init (WebViewChromium.java:14)
android.webkit.WebView.<init> (WebView.java:435)
android.webkit.WebView.<init> (WebView.java:355)
android.webkit.WebView.<init> (WebView.java:337)
android.webkit.WebView.<init> (WebView.java:324)
android.webkit.WebView.<init> (WebView.java:314)
[Our code initializing the webview]
android.os.Handler.handleCallback (Handler.java:938)
android.os.Handler.dispatchMessage (Handler.java:99)
android.os.Looper.loop (Looper.java:246)
android.app.ActivityThread.main (ActivityThread.java:8506)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)

我们无法重现这一点,但我们在 Firebase 上遇到了数百/数千次此类崩溃。奇怪的是,99% 的崩溃都发生在运行 Android 11 的三星设备上。我们的应用程序也是单进程应用程序,因此它不应该运行多个进程。我已经在铬问题跟踪器中发布了,但似乎三星操作系统的错误更多,而不是 webview 本身,所以我想我也会在这里发布。

似乎有些用户有一个我们的应用程序运行几个小时的进程,持有这个 Webview 锁。但是,当他们尝试打开我们的应用时,它会启动一个新进程而不是现有进程,并导致崩溃。

我正在尝试获取更多信息:有没有人知道为什么这会在三星 Android 11 上特别发生?我们的应用程序或我们的用户可以做些什么来缓解这个问题吗?有没有其他人遇到过这个问题并找到了解决方法?

【问题讨论】:

  • 您是否尝试过将三星切换到 DeX 模式或从 DeX 模式切换?这是我可以看到三星在流程方面做一些奇怪的事情的一种情况。此外,您是否看到这些相同用户的其他崩溃?我想知道您的旧进程是否以没有清理他们正在使用的锁定文件(?)的方式终止。
  • @CommonsWare 我们确实在 Firebase 上跟踪用户 ID,至少对于我现在和过去查找过的少数用户而言,这是他们在 Firebase 上报告的唯一一次崩溃过去 90 天。我不知道是否有可能是内存泄漏之类的原因,但仍然很奇怪,它是三星特有的。不过我从来没有听说过 DeX 模式,我们会调查一下,看看我们是否可以用它重现任何东西,谢谢!
  • 我可能错了,但您是否使用this Localization 库(或类似的东西)this bug in it 在我们的应用程序上创建了十几个崩溃,其中一个具有与您相同的堆栈跟踪我提供了
  • 我没有使用那个本地化库,无论如何看起来他们已经解决了这个特定问题。但是感谢您的评论,Amin... 我可以试试some of the changes they made to fix that library。 (不过,尚不清楚为什么这些崩溃集中在运行 Android 11 的三星设备上。)
  • @RapunzelVanWinkle 您能找到问题的根源或解决方法吗?

标签: android webview crash samsung-mobile


【解决方案1】:

不记得确切的堆栈跟踪,但在某些设备上返回应用程序时,WebView 崩溃应用程序有类似的问题。在没有解决方案起作用后,我尝试从 XML 中删除 WebView 定义并将 WebView 初始化移动到 Activity (Kotlin) 中并在 onStop() 方法中手动销毁。没有找到有关问题的信息,但解决了我的问题。

   override fun onResume() {
        webView = WebView(activity)
        //... init webview
        webViewLayout.addView(webView)
   }
   override fun onStop() {
        webViewLayout.removeView(webView)
        webView?.destroy()
        webView = null
    }

编辑:感谢金士顿指出我的错误。在代码中误读了 webview 的创建,这在 onCreate() 中与销毁 onStop 无关。

如果您在返回屏幕时不需要刷新布局以节省资源,您可以将创建移至 onCreate() 并将销毁移至 onDestroy()。在我们的例子中,需要在返回屏幕时始终更新内容。

【讨论】:

  • 你不应该在 onStart 中创建 WebView 还是在 onDestroy 中销毁它?就像你做的那样,你会以一个被破坏的 WebView 结束,以防你停止活动,然后在它被破坏之前重新启动它
  • 感谢您指出(编辑)。在我们的例子中,需要筛选始终是实际的,这就是它在 onResume() 中的原因。我从一个文件创建并从另一个文件销毁而没有注意到。
  • mmm 如果您在 onResume 中有创建,那么您需要在 onPause 中删除,否则您将以 WebView 的多个实例结束,以防您显示然后关闭对话框:将调用 onPause 并且 onResume再次调用 onStop
  • 我所指的屏幕没有使用任何应用程序对话框或其他部分覆盖来触发 onPause(),而不会离开导致 onStop() 的 Activity。只是为了确保我尝试了一些带有屏幕(抽屉......)的操作并且没有检测到问题,但是如果你用对话框覆盖屏幕,则会调用 onPause。在常规屏幕中,我们使用 onCreate 和 onDestroy 方法。
  • 您能否提供任何支持您添加/删除 WebView 建议的文档?我不清楚为什么有必要这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-18
  • 2015-04-05
  • 1970-01-01
  • 2019-10-05
  • 2019-06-04
  • 2021-02-14
  • 2013-08-10
相关资源
最近更新 更多