Android webveiw 出现栈错误解决办法

前言:
最近做一个项目,项目调试基础库的一个调试工具展示设备信息页面使用WebView。有一个应用集成调试基础库展示内容时出现
java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes
因为应用是系统级别的,在AndroidManifest.xml中添加了android:sharedUserId="android.uid.system"
根据exception提示出于安全原因,所以初步断定很可能跟应用为系统应用有很大关系,于是开始了查找代码寻源之旅
首先我们看一下具体的错误堆栈
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5257) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750) aused by: android.view.InflateException: Binary XML file line #17: Error inflating class android.webkit.WebView at android.view.LayoutInflater.createView(LayoutInflater.java:633) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741) at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) at android.view.LayoutInflater.inflate(LayoutInflater.java:504) at android.view.LayoutInflater.inflate(LayoutInflater.java:414) at android.view.LayoutInflater.inflate(LayoutInflater.java:365) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:379) at android.app.Activity.setContentView(Activity.java:2145) at com.mipt.store.activity.InfoActivity.onCreate(Unknown Source) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) ... 10 more aused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:288) at android.view.LayoutInflater.createView(LayoutInflater.java:607) ... 23 more aused by: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:96) at android.webkit.WebView.getFactory(WebView.java:2194) at android.webkit.WebView.ensureProviderCreated(WebView.java:2189) at android.webkit.WebView.setOverScrollMode(WebView.java:2248) at android.view.View.<init>(View.java:3588) at android.view.View.<init>(View.java:3682) at android.view.ViewGroup.<init>(ViewGroup.java:497) at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:55) at android.webkit.WebView.<init>(WebView.java:544) at android.webkit.WebView.<init>(WebView.java:489) at android.webkit.WebView.<init>(WebView.java:472) at android.webkit.WebView.<init>(WebView.java:459) ... 26 more
错误提示显示为“Caused by: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes”
security reasons即安全原因。为了查明原因直接查看android源码。经过一番查找,发现抛出Exception的在
frameworks/base/master/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;
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 {
Class<WebViewFactoryProvider> providerClass = getProviderClass();
Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "providerClass.newInstance()");
try {
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);
}
}
}
WebView在初始化的时候会检查初始化进程的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");
}
如果进程ID是root或者system,就会抛出UnsupportedOperationException。为什么会有这种安全机制呢?因为webview允许运行js,如果用户通过js注入安全代码,那么js就可以肆无忌惮的使用系统权限,这无疑是一个漏洞,可谓门户大开。
果不其然就是android:sharedUserId="android.uid.system"的问题,因为是系统应用所以只能修改基础调试库的展示控件,把展示调试信息的webview改为textview。
感谢阅读,希望能通过本文帮助到大家,谢谢大家对本站的支持,如有疑问请留言或者到本站社区交流讨论,大家共同进步!
# Android
# webveiw
# 栈错误解决办法
# java使double保留两位小数的多方法 java保留两位小数
# javascript:;与javascript:void(0)使用介绍
# javascript 手机号码正则表达式验证函数
# java.net.SocketException: Connection reset 解决方法
# java写入文件的几种方法分享
# 抛出
# 是一个
# 就会
# 如有
# 果不其然
# 之旅
# 希望能
# 很可能
# 做一个
# 看一下
# 谢谢大家
# 解决办法
# 肆无忌惮
# 大开
# 就可以
# 为什么会有
# 有一个
# 共同进步
# 错误提示
# 疑问请
相关文章:
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
php json中文编码为null的解决办法
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
制作门户网站的参考文献在哪,小说网站怎么建立?
长沙做网站要多少钱,长沙国安网络怎么样?
b2c电商网站制作流程,b2c水平综合的电商平台?
网站制作说明怎么写,简述网页设计的流程并说明原因?
如何安全更换建站之星模板并保留数据?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
模具网站制作流程,如何找模具客户?
常州自助建站费用包含哪些项目?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
网站微信制作软件,如何制作微信链接?
实现虚拟支付需哪些建站技术支撑?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
如何通过二级域名建站提升品牌影响力?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何撰写建站申请书?关键要点有哪些?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
青浦网站制作公司有哪些,苹果官网发货地是哪里?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
音响网站制作视频教程,隆霸音响官方网站?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
建站之星如何优化SEO以实现高效排名?
郑州企业网站制作公司,郑州招聘网站有哪些?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
如何在云主机上快速搭建多站点网站?
家具网站制作软件,家具厂怎么跑业务?
如何通过西部数码建站助手快速创建专业网站?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
如何通过虚拟机搭建网站?详细步骤解析
建站之星安装后如何配置SEO及设计样式?
公司门户网站制作流程,华为官网怎么做?
建站主机如何选?高性价比方案全解析
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
建站之星安装失败:服务器环境不兼容?
Android滚轮选择时间控件使用详解
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
建站之星后台密码遗忘?如何快速找回?
如何在自有机房高效搭建专业网站?
如何通过网站建站时间优化SEO与用户体验?
seo网站制作优化,网站SEO优化步骤有哪些?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
如何做静态网页,sublimetext3.0制作静态网页?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
移民网站制作流程,怎么看加拿大移民官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。