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,而且都设置了同一个路径,这样就会出现问题。
在问题处理上,首先还是要找到引用的包开发者,做一个兼容处理,设置不同路径。如果无法找到开发者,就只能自己想办法绕过去了,处理如下:进程启动的时候,在第三方包设置之前自己做个设置,这样第三方包里的设置就会失败,从而可以控制不同进程设置的路径不一样。
参考文档:设置数据目录后缀
public static void setDataDirectorySuffix (String suffix)
定义用于存储当前进程的 WebView 数据的目录。构建数据和缓存目录路径时将使用提供的后缀。如果不调用此 API,则不使用后缀。每个目录只能由应用程序中的一个进程使用。如果一个应用程序中有多个进程希望使用 WebView,则只有一个进程可以使用默认目录,其他进程必须调用此 API 来定义唯一的后缀。
这意味着同一应用程序中的不同进程不能直接共享与 WebView 相关的数据,因为数据目录必须不同。使用此 API 的应用程序可能必须在进程之间显式传递数据。例如,CookieManager
如果两个进程的 WebView 都打算登录,则可能必须将登录 cookie 从一个进程的 cookie jar 复制到另一个进程。
大多数应用程序应该简单地确保依赖于 WebView 的应用程序的所有组件都在同一个进程中,以避免需要多个数据目录。在这种情况下,可以使用该disableWebView()
方法确保其他进程不会意外使用 WebView。
此 API 必须在此进程中创建任何 WebView 实例之前以及此进程调用 android.webkit 包中的任何其他方法之前调用。
参数 | |
---|---|
suffix | String : 用于当前进程的目录名后缀。不得包含路径分隔符。该值不能为null 。 |