WebView运行在系统进程的问题

在Android4.4后,WebView切换到Chromium内核,若系统应用使用特殊权限并设置android:sharedUserId="android.uid.system",会导致程序崩溃。本文详细介绍了这一问题的原因,并提供了解决方案,涉及反射和Hook技术来避免Chromium内核初始化时的异常。
摘要由CSDN通过智能技术生成
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 =&
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值