多进程情况下webview设置相同缓存路径导致的崩溃问题解决。

585 阅读2分钟

crash日志: java.lang.RuntimeException: Using WebView from more than one process at once with the same data directory is not supported.

以上问题的原因是:谷歌为了信息安全,在webview的路径设置上做了限制,不允许多个进程共用同一个路径。

1、一般情况下解决方案,通过以下方法修改webview的缓存路径使其不一致即可。

Public static void setDataDirectorySuffix (String suffix)

2、但是有些情况比较复杂,比如在application初始化的时候,因为多进程,导致引用的第三方的包里多次调用setDataDirectorySuffix,而且都设置了同一个路径,这样就会出现问题。

在问题处理上,首先还是要找到引用的包开发者,做一个兼容处理,设置不同路径。如果无法找到开发者,就只能自己想办法绕过去了,处理如下:进程启动的时候,在第三方包设置之前自己做个设置,这样第三方包里的设置就会失败,从而可以控制不同进程设置的路径不一样。

参考文档:设置数据目录后缀

API 级别 28中添加

public static void setDataDirectorySuffix (String suffix)

定义用于存储当前进程的 WebView 数据的目录。构建数据和缓存目录路径时将使用提供的后缀。如果不调用此 API,则不使用后缀。每个目录只能由应用程序中的一个进程使用。如果一个应用程序中有多个进程希望使用 WebView,则只有一个进程可以使用默认目录,其他进程必须调用此 API 来定义唯一的后缀。

这意味着同一应用程序中的不同进程不能直接共享与 WebView 相关的数据,因为数据目录必须不同。使用此 API 的应用程序可能必须在进程之间显式传递数据。例如,CookieManager如果两个进程的 WebView 都打算登录,则可能必须将登录 cookie 从一个进程的 cookie jar 复制到另一个进程。

大多数应用程序应该简单地确保依赖于 WebView 的应用程序的所有组件都在同一个进程中,以避免需要多个数据目录。在这种情况下,可以使用该disableWebView()方法确保其他进程不会意外使用 WebView。

此 API 必须在此进程中创建任何 WebView 实例之前以及此进程调用 android.webkit 包中的任何其他方法之前调用。

参数
suffixString: 用于当前进程的目录名后缀。不得包含路径分隔符。该值不能为null