Android webveiw 出现栈错误解决办法

Android webveiw 出现栈错误解决办法,第1张

概述Androidwebveiw出现栈错误解决办法前言:最近做一个项目,项目调试基础库的一个调试工具展示设备信息页面使用WebView。有一个应用集成调试基础库展示内容时出现

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.access0(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 出现栈错误解决办法全部内容,希望文章能够帮你解决Android webveiw 出现栈错误解决办法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1144686.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存