由于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 ...

随机推荐

gcd 最小公约数

int gcd(int a, int b) { ? a : gcd(b, a % b); }

slice&comma;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 &&num;39&semi;async&&num;39&semi; 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&period;B&period;S&period;

8. 备用交换机 ★★   输入文件:gd.in   输出文件:gd.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] n个城市之间有通讯网络,每个城市都有通讯交换机,直 ...

webview在android8.0,解决Android8.0系统应用打开webView报错相关推荐

  1. mysql for python 64_解决windows64位系统上安装mysql-python报错

    一. 背景 python项目中需要操作mysql,于是运行: pip install MySQL-python 报一连串的错误,前面的错误根据提示都好解决,但被下面的错误一直卡住,好一翻折腾才解决,所 ...

  2. 解决Vmware下虚拟机下打开gazebo报错:VMware: vmw_ioctl_command error Invalid argument

    引言 在使用虚拟机Vmware打开gazebo仿真环境的时候,刚打开就闪退,并报错以下错误:VMware: vmw_ioctl_command error Invalid argument,大概意思是 ...

  3. 运行报Invalid property 'specParamList[0][specName]' of bean class [com.model.Produ... 报错的解决办法

    运行报Invalid property 'specParamList[0][specName]' of bean class [com.model.Produ... 报错的解决办法 前端需要进行JSO ...

  4. 使用前台方式启动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 ...

  5. FAQ_全志平台Tina3.0.7 RXXX cowbell方案启动时cpufreq报错且无法生成cpufreq节点

    FAQ_全志平台Tina3.0.7 RXXX cowbell方案启动时cpufreq报错且无法生成cpufreq节点 [软件版本]Tina 3.0.7 cowbell方案 [现象] 启动时报错: [ ...

  6. 关于Cause: java.lang.ClassNotFoundException: Cannot find class: 0(提示找不到类)报错

    关于Cause: java.lang.ClassNotFoundException: Cannot find class: 0(提示找不到类)报错 搭建mybatis架构过程中idea包出这么一个莫名 ...

  7. 关于 CentOS系统编译Qt项目报错:error: cannot find -lGL 的解决方法

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/129633859 红胖子(红模仿)的博文大全:开发技术集 ...

  8. python安装过程中出现文件或目录损坏且无法读取_解决安装python库时windows error5 报错的问题...

    python安装库时,有时候会报错windows error 5,可以尝试关闭所有使用python的编辑器.文件等,然后重新pip安装,如果还是不行,可以将报错最下层文件删除即可(如果不放心可以将该文 ...

  9. python安装失败找不到指定路径_解决安装python库时windows error5 报错的问题

    python安装库时,有时候会报错windows error 5,可以尝试关闭所有使用python的编辑器.文件等,然后重新pip安装,如果还是不行,可以将报错最下层文件删除即可(如果不放心可以将该文 ...

最新文章

  1. java 对象怎么序列化,java对象序列化总结
  2. dlp型3d打印机_【论文新萃】光聚合成型3D打印技术复制印章研究
  3. python—gc.collect()清楚内存
  4. 关于exe应用程序做成Windows服务爬过的坑
  5. mappedBy的具体使用及其含义
  6. 2021厦门湖滨中学高考成绩查询,厦门各高中本科上线率2020
  7. 请你预想一下量子计算机未来,直播,研究量子计算机的我被曝光了
  8. 汇编指令:使用汇编指令计算2的8次方
  9. Open3d读写pcd点云文件
  10. NinePatch图片
  11. 2018年电子设计大赛主要元器件、模块资料汇总
  12. 圆形百分比进度条效果
  13. 红米2a支持html,红米2A支持4G吗?红米2A支持4G网络吗?
  14. 如何正确接触天使投资人?
  15. Python之父抛弃Python!现在学Python还有用吗?
  16. BatchOutput DOC for Mac(虚拟PDF打印机)
  17. Baumer工业相机堡盟相机如何通过BGAPI SDK联合OpenCVSharp进行图像简单拼接并显示固定数量保存和持续保存(C#)
  18. [系统安全] Windbg Preview调试记录
  19. 【Python】写一个程序,判断给定年份是否为闰年。
  20. 版本控制系统GIT文档

热门文章

  1. python画八卦图
  2. 【光学】基于Matlab实现二维光子晶体的能带图和场
  3. Ovftool安装导出vsphere虚拟机
  4. 推荐上百本优质大数据书籍,附必读清单(大数据宝藏)
  5. 第2课计算机的发展教学反思,信息技术课教学反思2
  6. 7.3 数字化的资产管理
  7. U大师U盘启动盘克隆制作工具
  8. POI事件模式读取Excel 2003文件
  9. Forsage系统源码分析
  10. SATA电源线和数据线接口定义