Android Webview 在三星和 Android 11 上崩溃
Posted
技术标签:
【中文标题】Android Webview 在三星和 Android 11 上崩溃【英文标题】:Android Webview crashes on Samsung & 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 您能找到问题的根源或解决方法吗? 【参考方案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 建议的文档?我不清楚为什么有必要这样做。以上是关于Android Webview 在三星和 Android 11 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Android--(三星手机)webview嵌套H5,点击H5按钮跳转手机拍照,横屏拍照导致失败或崩溃问题
Android--(三星手机)webview嵌套H5,点击H5按钮跳转手机拍照,横屏拍照导致失败或崩溃问题
Android--(三星手机)webview嵌套H5,点击H5按钮跳转手机拍照,横屏拍照导致失败或崩溃问题