致命异常:java.lang.RuntimeException:在具有相同数据目录的多个进程中同时使用WebView是不支持的。

29

1.当我在Fragment的onCreateView方法中使用inflater.inflate(webview_layout, container, false)时,在Android 9上可能会崩溃,并显示以下日志:

    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
    at jO.b(PG:102)
    at jQ.run(PG:3)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:226)
    at android.app.ActivityThread.main(ActivityThread.java:7210)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:499)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:961)

2.我尝试将以下代码添加到Application onCreate方法中

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    String processName = getProcessName();
    if (!MAIN_PROCESS.equals(processName)) {
        WebView.setDataDirectorySuffix(getProcessName() + ".webview");
    }
}
但是一些安卓手机也因相同的原因崩溃,而我没有使用多进程的 webview。然后在片段 onCreateView 方法中,在 inflater.inflate(webview_layout, container, false) 前加入了这段代码。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    String processName = getProcessName();
    try {
        WebView.setDataDirectorySuffix(processName);
    } catch (Throwable e) {
        // ignore
    }
}

但我在PCAM10\PCEM00\PCAT10等地方也收到了相同的崩溃报告,但我无法在本地重现这个崩溃。

还有什么其它原因会导致这个问题出现吗?


在一些设备上出现相同的错误。 - Bhavesh Jabuvani
这个案子有任何更新吗? - Nanda Z
3个回答

12

在初始化 Admob 之前,在 Application 类中使用以下代码可以解决我的问题:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        val process = getProcessName()
        if (packageName != process) WebView.setDataDirectorySuffix(process)
    }

MobileAds.initialize(this)

2

从API 28开始,有一种新的有效API可以获取进程名称。

如Google文档中所述,从API 28开始,明确指出在多进程中运行的WebView不能共享相同的数据目录。

这意味着同一应用程序中的不同进程不能直接共享与WebView相关的数据,因为数据目录必须是不同的。

另外,请检查是否在应用程序类中初始化了任何进程。 参考链接: Android Pie (9.0) WebView in multi-process

1
如果您的应用程序和服务有两个或更多不同的进程,则可以在不打算使用WebView的进程中禁用WebView使用WebView.disableWebView()
public void onCreate() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        WebView.disableWebView();
    }
    ...
}

在这种情况下,如果创建了WebView或使用android.webkit包中的任何其他方法,则会抛出异常。但是,“java.lang.RuntimeException:从多个进程中使用WebView....”异常将不再存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接