Android webveiw 出现栈错误解决办法
发布时间 - 2026-01-11 02:56:53 点击率:次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写入文件的几种方法分享
# 抛出
# 是一个
# 就会
# 如有
# 果不其然
# 之旅
# 希望能
# 很可能
# 做一个
# 看一下
# 谢谢大家
# 解决办法
# 肆无忌惮
# 大开
# 就可以
# 为什么会有
# 有一个
# 共同进步
# 错误提示
# 疑问请
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
使用豆包 AI 辅助进行简单网页 HTML 结构设计
C语言设计一个闪闪的圣诞树
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
如何在不使用负向后查找的情况下匹配特定条件前的换行符
php json中文编码为null的解决办法
如何生成腾讯云建站专用兑换码?
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
如何撰写建站申请书?关键要点有哪些?
PHP正则匹配日期和时间(时间戳转换)的实例代码
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
5种Android数据存储方式汇总
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
如何自定义建站之星模板颜色并下载新样式?
如何在IIS7上新建站点并设置安全权限?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel如何使用Gate和Policy进行授权?(权限控制)
如何快速搭建高效香港服务器网站?
Laravel如何创建自定义Artisan命令?(代码示例)
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
js实现获取鼠标当前的位置
JavaScript如何实现错误处理_try...catch如何捕获异常?
Swift开发中switch语句值绑定模式
微信小程序 wx.uploadFile无法上传解决办法
济南网站建设制作公司,室内设计网站一般都有哪些功能?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
微信小程序 require机制详解及实例代码
zabbix利用python脚本发送报警邮件的方法
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
如何选择可靠的免备案建站服务器?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
如何为不同团队 ID 动态生成多个“认领值班”按钮
如何挑选最适合建站的高性能VPS主机?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
Java垃圾回收器的方法和原理总结
Laravel如何处理表单验证?(Requests代码示例)

