Android Webview 在三星和 Android 11 上崩溃

问题描述 投票:0回答:3

这是我们在 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 的三星设备上。我们的应用程序也是单进程应用程序,因此它不应该运行多个进程。 我已经在 chromium 问题跟踪器中发布了,但似乎三星操作系统的错误比 webview 本身更多,所以我想我也应该在这里发布。

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

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

android webview crash samsung-mobile
3个回答
2
投票

在初始化任何与 WebView 相关的内容(例如 AdMob)之前,尝试将其添加到应用程序类的

onCreate

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            String processName = getProcessName();
            if (!getPackageName().equals(processName)) {
                WebView.setDataDirectorySuffix(processName);
            }
        }

//AdMob 创建一个新进程。


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()。在我们的例子中,需要在返回屏幕时始终更新内容。


0
投票

不记得确切的堆栈跟踪,但在某些设备上返回应用程序时,我遇到了类似的 WebView 崩溃应用程序问题。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.