WebView在Android4.4之前使用的Webkit内核,在Android4.4以后切换到了Chromium内核。本文的内容主要不是讲解Chromium内核上WebView的特性。关键是要讲解webview切换到Chromium内核后我遇到的一个坑(
实际上可能叫做坑不合适,因为这是安卓为了安全着想才这么做的
),
并提出解决这个坑的一个方法。
这个问题的情形是这样的,当时需要在一个系统应用中使用webview,系统应用因为需要使用一些特殊的系统权限,所有配置了
android:sharedUserId="android.uid.system" ,那么当你运行webview的时候,就会发现程序crash并抛出以下异常:
Caused by: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes
at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:155)
at android.webkit.CookieManager.getInstance(CookieManager.java:42)
接下来我们来跟踪源码看下这个异常是怎么抛出来的根据crash信息,我们来看WebViewFactory中的getProvider方法,在这里提一下,在切换WebView的内核之前,Google就已经修改了WebView的代码架构,使用了工厂模式来决定WebView的具体实现,目的就是为了日后可以方便的切换WebView内核。在这里以Android-22的源码为例,每个Android版本的
WebViewFactory
源码都有所出入,不过本文的关键是描述解决这个问题的思路。
static WebViewFactoryProvider getProvider() {
synchronized (sProviderLock) {
// For now the main purpose of this function (and the factory abstraction) is to keep
// us honest and minimize usage of WebView internals when binding the proxy.
if (sProviderInstance != null) return sProviderInstance;
final int uid = android.os.Process.myUid();
if (uid =&