android webview 报错,解决Android8.0系统应用打开webView报错

沈国安
2023-12-01

由于webView存在安全漏洞,谷歌从5.1开始全面禁止系统应用使用webview,使用会导致应用崩溃错误提示:Caused by: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes 异常信息可以看出 是在 WebViewFactory.java 的getProvider 方法 抛出的。源码路径为 frameworks/base/core/java/android/webkit/WebViewFactory.java

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; //如果sProviderInstance不为空直接返回

//1,判断,如果是系统id ,则抛出异常。

final int uid = android.os.Process.myUid();

if (uid == android.os.Process.ROOT_UID || uid == android.os.Process.SYSTEM_UID) {

throw new UnsupportedOperationException(

"For security reasons, WebView is not allowed in privileged processes");

}

StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();

Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.getProvider()");

try {

//2

Class providerClass = getProviderClass();

Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "providerClass.newInstance()");

try {

//3 给 sProviderInstance 赋值

sProviderInstance = providerClass.getConstructor(WebViewDelegate.class)

.newInstance(new WebViewDelegate());

if (DEBUG) Log.v(LOGTAG, "Loaded provider: " + sProviderInstance);

return sProviderInstance;

} catch (Exception e) {

Log.e(LOGTAG, "error instantiating provider", e);

throw new AndroidRuntimeException(e);

} finally {

Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);

}

} finally {

Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW);

StrictMode.setThreadPolicy(oldPolicy);

}

}

}

如果是系统id,就抛出异常! 可以通过反射在调用webview 之前,给sProviderInstance 赋值,这样就可以了 在Application调用方法,兼容8.0

public static void hookWebView(){

int sdkInt = Build.VERSION.SDK_INT;

try {

Class> factoryClass = Class.forName("android.webkit.WebViewFactory");

Field field = factoryClass.getDeclaredField("sProviderInstance");

field.setAccessible(true);

Object sProviderInstance = field.get(null);

if (sProviderInstance != null) {

Log.i(TAG,"sProviderInstance isn't null");

return;

}

Method getProviderClassMethod;

if (sdkInt > 22) {

getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");

} else if (sdkInt == 22) {

getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");

} else {

Log.i(TAG,"Don't need to Hook WebView");

return;

}

getProviderClassMethod.setAccessible(true);

Class> factoryProviderClass = (Class>) getProviderClassMethod.invoke(factoryClass);

Class> delegateClass = Class.forName("android.webkit.WebViewDelegate");

Constructor> delegateConstructor = delegateClass.getDeclaredConstructor();

delegateConstructor.setAccessible(true);

if(sdkInt < 26){//低于Android O版本

Constructor> providerConstructor = factoryProviderClass.getConstructor(delegateClass);

if (providerConstructor != null) {

providerConstructor.setAccessible(true);

sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance());

}

} else {

Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD");

chromiumMethodName.setAccessible(true);

String chromiumMethodNameStr = (String)chromiumMethodName.get(null);

if (chromiumMethodNameStr == null) {

chromiumMethodNameStr = "create";

}

Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass);

if (staticFactory!=null){

sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance());

}

}

if (sProviderInstance != null){

field.set("sProviderInstance", sProviderInstance);

Log.i(TAG,"Hook success!");

} else {

Log.i(TAG,"Hook failed!");

}

} catch (Throwable e) {

Log.w(TAG,e);

}

}

解决windows64位系统上安装mysql-python报错

解决windows64位系统上安装mysql-python报错 2018年03月12日 13:08:24 一个CD包 阅读数:1231    版权声明:本文为博主原创文章,未经博主允许不得转载. ht ...

一招解决OpenERP8&period;0安装旧版模块报错

有喜欢尝鲜的网友开始玩8.0了,可是版本还没发布,社区的很多特别好的模块还没有升级到8,所以经常碰到模块无法安装的问题. No module name osv 网友提出将模块的 from osv im ...

dotfuscator 在混淆&period;Net Framework 4&period;0以上版本的时候报错的解决方法

dotfuscator 在混淆.Net Framework 4.0以上版本的时候报错的解决方法 在混淆的时候报错了,错误描述大致如下: Could not find a compatible vers ...

使用自编译的Emacs26&period;0&period;50build10版本,helm报错(已解决)

使用自编译的Emacs26.0.50build10版本,helm报错(已解决) */--> code {color: #FF0000} pre.src {background-color: #0 ...

如何解决vue2&period;0 打包之后 打开index&period;html出现空白页

如何解决vue2.0 打包之后 打开index.html出现空白页 1.打包之前修改三个文件       1.1.第一步,找到build文件,在webpack.prod.conf.js 第25行左右 ...

打开eclipse报错:发现了以元素 &&num;39&semi;d&colon;skin&&num;39&semi; 开头的无效内容。此处不应含有子元素。

[错误] 打开eclipse报错:发现了以元素 ‘d:skin’ 开头的无效内容.此处不应含有子元素. [具体报错信息] Error parsing D:\Android-sdks\system-im ...

【WPF】弹窗定位、弹窗关闭后再打开的报错

需求:点击按钮,打开一个弹窗. // 获得窗体实例 Window window = openDesignViewModel.View as Window; // 这是使用了WAF框架 //Window ...

随机推荐

zabbix 3&period;0&period;3 &lpar;nginx&rpar;安装过程中的问题排错记录

特殊注明:安装zabbix 2.4.8和2.4.6遇到2个问题,如下:找了很多解决办法,实在无解,只能换版本,尝试换(2.2.2正常 | 3.0.3正常)都正常,最后决定换3.0.3 1.Error ...

TSQL Merge On子句和When not matched 语义理解

Merge 的On子句指定Match condition,When子句指定过滤条件,如果Source Table和Targe Table匹配的上,很好理解:如果匹配不上,必须深入理解不匹配的条件,否则 ...

linux服务器分析优化

转:http://jiekeyang.blog.51cto.com/11144634/1774473 一.系统性能分析 1.系统的性能是指操作系统完成任务的有效性.稳定性和响应速度.操作系统完成任务与 ...

poj 1328 Radar Installation【贪心区间选点】

Radar Installation Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) ...

ASP&period;NET MVC开发必看系列

一.关于HTTP协议的那些事 这可以说我们开发WEB程序的空气,推荐不断温故知新! HTTP协议 (一) HTTP协议详解 HTTP协议 (二) 基本认证 HTTP协议 (三) 压缩 HTTP协议 ( ...

return和break的区别

/* Name:return和break的区别 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月25日 02:13:22 Description:以下代码 ...

openFace 人脸识别框架测试

openface  人脸识别框架  但个人感觉精度还是很一般 openface的githup文档地址:http://cmusatyalab.github.io/openface/ openface的安 ...

Webservice接口的调用

一.开发webservice接口的方式 1.jdk开发. 2.使用第三方工具开发,如cxf.shiro等等. 我这边介绍jdk方式webservice接口调用. 二.使用jdk调用webservice ...

Zookeeper-相关流程

选主流程: 当Zk进入恢复模式时,需要重新选举出一个新的leader,让所有的Server都恢复到一个正确的状态.Zk的选举算法有两种:一种是基于basic paxos实现的,一种是基于fast pa ...

node学习笔记&lowbar;02 API详解

一.知识点:url.parse方法 方法说明: 讲一个URL字符串转换成对象并返回. 语法:url.parse(urlStr, [parseQueryString], [slashesDenoteHo ...

 类似资料: