致命异常:java.lang.RuntimeException:不支持同时使用多个进程中的 WebView 和同一数据目录

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

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(本机方法)
    在 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");
    }
}

但是有些Android手机也会因为同样的原因崩溃,而且我不使用多进程的webview,然后我尝试在Fragment 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 中得到了一些相同的崩溃报告...并且我无法在本地重新出现此崩溃。

这次崩溃还有其他原因吗?

android webview process
4个回答
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 可以获取进程名称。 [https://developer.android.com/reference/android/app/Application.html#getProcessName()][1]

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

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

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


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:Using WebView from more one process...”异常将会消失


0
投票

下面的代码有助于解决这个问题。我在前缀目录名称中添加进程ID

  private fun setupWebView() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
      getAppProcessName()?.let {
        WebView.setDataDirectorySuffix(it)
      }
    }
  }

  private fun getAppProcessName(): String? {
    val pid = Process.myPid()
    val manager = getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager
    return manager?.runningAppProcesses?.filterNotNull()?.firstOrNull { it.pid == pid }?.processName + pid
  }

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