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代码示例)