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

Wen*_* Mo 21 android process webview

1.当我在 Android 9 上的 Fragment onCreateView 方法 inflater.inflate(webview_layout, container, false) 中时,可能会因吹气日志而崩溃:

    致命异常:java.lang.RuntimeException:不支持从多个进程同时使用具有相同数据目录的 WebView。https://crbug.com/558377
    在 jO.b(PG:102)
    在 jQ.run(PG:3)
    在 android.os.Handler.handleCallback(Handler.java:873)
    在 android.os.Handler.dispatchMessage(Handler.java:99)
    在 android.os.Looper.loop(Looper.java:226)
    在 android.app.ActivityThread.main(ActivityThread.java:7210)
    在 java.lang.reflect.Method.invoke(Native Method)
    在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:499)
    在 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是一些Android手机也因为同样的原因崩溃,我不使用多进程的webview,然后我尝试在inflater.inflate(webview_layout,container,false)之前在Fragment onCreateView中添加这段代码

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    String processName = getProcessName();
    try {
        WebView.setDataDirectorySuffix(processName);
    } catch (Throwable e) {
        // ignore
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我也在 PCAM10\PCEM00\PCAT10... 中得到了一些相同的崩溃报告,我无法在本地重新出现这个崩溃。

这次崩溃是否还有其他原因?

Had*_*adi 12

在初始化 Admob 之前在 Application 类中使用此代码解决了我的问题:

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

MobileAds.initialize(this)
Run Code Online (Sandbox Code Playgroud)


Poo*_*iya 2

从 API 28 开始,有一个新的有效 API 可以获取进程名称。[https://developer.android.com/reference/android/app/Application.html#getProcessName()][1]

正如google文档中提到的,从API 28开始,很明显,在多进程中运行的WebView不能共享相同的数据目录。

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

另外,请检查您是否正在初始化 Application 类中的任何进程。参考链接: Android Pie (9.0) 多进程中的WebView