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 中得到了一些相同的崩溃报告...并且我无法在本地重新出现此崩溃。
这次崩溃还有其他原因吗?
在初始化 Admob 之前在 Application 类中使用此代码解决了我的问题:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val process = getProcessName()
if (packageName != process) WebView.setDataDirectorySuffix(process)
}
MobileAds.initialize(this)
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
如果您的应用程序和服务有两个或多个不同的进程,那么您可以在不打算使用 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...”异常将会消失
下面的代码有助于解决这个问题。我在前缀目录名称中添加进程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
}