webview在android8.0,解决Android8.0系统应用打开webView报错
由于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.0安装旧版模块报错
有喜欢尝鲜的网友开始玩8.0了,可是版本还没发布,社区的很多特别好的模块还没有升级到8,所以经常碰到模块无法安装的问题. No module name osv 网友提出将模块的 from osv im ...
dotfuscator 在混淆.Net Framework 4.0以上版本的时候报错的解决方法
dotfuscator 在混淆.Net Framework 4.0以上版本的时候报错的解决方法 在混淆的时候报错了,错误描述大致如下: Could not find a compatible vers ...
使用自编译的Emacs26.0.50build10版本,helm报错(已解决)
使用自编译的Emacs26.0.50build10版本,helm报错(已解决) */--> code {color: #FF0000} pre.src {background-color: #0 ...
如何解决vue2.0 打包之后 打开index.html出现空白页
如何解决vue2.0 打包之后 打开index.html出现空白页 1.打包之前修改三个文件 1.1.第一步,找到build文件,在webpack.prod.conf.js 第25行左右 ...
打开eclipse报错:发现了以元素 &#39;d:skin&#39; 开头的无效内容。此处不应含有子元素。
[错误] 打开eclipse报错:发现了以元素 ‘d:skin’ 开头的无效内容.此处不应含有子元素. [具体报错信息] Error parsing D:\Android-sdks\system-im ...
【WPF】弹窗定位、弹窗关闭后再打开的报错
需求:点击按钮,打开一个弹窗. // 获得窗体实例 Window window = openDesignViewModel.View as Window; // 这是使用了WAF框架 //Window ...
随机推荐
gcd 最小公约数
int gcd(int a, int b) { ? a : gcd(b, a % b); }
slice,substr和substring的区别
首先,他们都接收两个参数,slice和substring接收的是起始位置和结束位置(不包括结束位置),而substr接收的则是起始位置和所要返回的字符串长度.直接看下面例子: var test = ' ...
es6箭头函数中this
普通函数: $scope.$on('$stateChangeSuccess',function(){this.list = this.getList();}); 箭头函数: $scope.$on('$ ...
UITableViewCell动态AutoLayout布局
相关链接: 使用Autolayout实现UITableView的Cell动态布局和高度动态改变 IOS tableView cell动态高度 (autoLayout) AutoLayoutClub 使 ...
职责链模式(Chain of Responsibility)的Java实现
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 ...
An entry point cannot be marked with the &#39;async&#39; modifier
I copied below code from this link.But when I am compiling this code I am getting an entry point can ...
python包与模块导入
一 .module 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc&quo ...
Swift和Objective-C混编的注意啦
文/仁伯安(授权) 原文链接:http://www.jianshu.com/p/2ed48b954612 前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更 ...
git报错:src refspec master does not match any
问题出现:git推送本地内容到远程仓库时,报错src refspec master does not match any. 1.我的流程: mkdir project_k命令,新建本地仓库. cd p ...
COGS 08-备用交换机 题解——S.B.S.
8. 备用交换机 ★★ 输入文件:gd.in 输出文件:gd.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] n个城市之间有通讯网络,每个城市都有通讯交换机,直 ...
webview在android8.0,解决Android8.0系统应用打开webView报错相关推荐
- mysql for python 64_解决windows64位系统上安装mysql-python报错
一. 背景 python项目中需要操作mysql,于是运行: pip install MySQL-python 报一连串的错误,前面的错误根据提示都好解决,但被下面的错误一直卡住,好一翻折腾才解决,所 ...
- 解决Vmware下虚拟机下打开gazebo报错:VMware: vmw_ioctl_command error Invalid argument
引言 在使用虚拟机Vmware打开gazebo仿真环境的时候,刚打开就闪退,并报错以下错误:VMware: vmw_ioctl_command error Invalid argument,大概意思是 ...
- 运行报Invalid property 'specParamList[0][specName]' of bean class [com.model.Produ... 报错的解决办法
运行报Invalid property 'specParamList[0][specName]' of bean class [com.model.Produ... 报错的解决办法 前端需要进行JSO ...
- 使用前台方式启动Redis时,出现Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already in use报错
问题描述:使用前台启动方式启动Redis时,出现Creating Server TCP listening socket 127.0.0.1:6379: bind: Address already i ...
- FAQ_全志平台Tina3.0.7 RXXX cowbell方案启动时cpufreq报错且无法生成cpufreq节点
FAQ_全志平台Tina3.0.7 RXXX cowbell方案启动时cpufreq报错且无法生成cpufreq节点 [软件版本]Tina 3.0.7 cowbell方案 [现象] 启动时报错: [ ...
- 关于Cause: java.lang.ClassNotFoundException: Cannot find class: 0(提示找不到类)报错
关于Cause: java.lang.ClassNotFoundException: Cannot find class: 0(提示找不到类)报错 搭建mybatis架构过程中idea包出这么一个莫名 ...
- 关于 CentOS系统编译Qt项目报错:error: cannot find -lGL 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/129633859 红胖子(红模仿)的博文大全:开发技术集 ...
- python安装过程中出现文件或目录损坏且无法读取_解决安装python库时windows error5 报错的问题...
python安装库时,有时候会报错windows error 5,可以尝试关闭所有使用python的编辑器.文件等,然后重新pip安装,如果还是不行,可以将报错最下层文件删除即可(如果不放心可以将该文 ...
- python安装失败找不到指定路径_解决安装python库时windows error5 报错的问题
python安装库时,有时候会报错windows error 5,可以尝试关闭所有使用python的编辑器.文件等,然后重新pip安装,如果还是不行,可以将报错最下层文件删除即可(如果不放心可以将该文 ...
最新文章
- java 对象怎么序列化,java对象序列化总结
- dlp型3d打印机_【论文新萃】光聚合成型3D打印技术复制印章研究
- python—gc.collect()清楚内存
- 关于exe应用程序做成Windows服务爬过的坑
- mappedBy的具体使用及其含义
- 2021厦门湖滨中学高考成绩查询,厦门各高中本科上线率2020
- 请你预想一下量子计算机未来,直播,研究量子计算机的我被曝光了
- 汇编指令:使用汇编指令计算2的8次方
- Open3d读写pcd点云文件
- NinePatch图片
- 2018年电子设计大赛主要元器件、模块资料汇总
- 圆形百分比进度条效果
- 红米2a支持html,红米2A支持4G吗?红米2A支持4G网络吗?
- 如何正确接触天使投资人?
- Python之父抛弃Python!现在学Python还有用吗?
- BatchOutput DOC for Mac(虚拟PDF打印机)
- Baumer工业相机堡盟相机如何通过BGAPI SDK联合OpenCVSharp进行图像简单拼接并显示固定数量保存和持续保存(C#)
- [系统安全] Windbg Preview调试记录
- 【Python】写一个程序,判断给定年份是否为闰年。
- 版本控制系统GIT文档