Android webveiw 出现栈错误解决办法

 更新时间:2017年08月24日 14:14:38   投稿:lqh  
这篇文章主要介绍了Android webveiw 出现栈错误解决办法的相关资料,出现java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes,这里提供解决办法,需要的朋友可以参考下

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数据持久化之读写SD卡中内容的方法详解

    Android数据持久化之读写SD卡中内容的方法详解

    这篇文章主要介绍了Android数据持久化之读写SD卡中内容的方法,结合具体实例形式分析了Android持久化操作中针对SD卡进行读写操作的相关实现技巧与注意事项,需要的朋友可以参考下
    2017-05-05
  • Android如何通过scheme跳转界面

    Android如何通过scheme跳转界面

    Android如何通过scheme跳转界面,这篇文章就为大家介绍了Android通过scheme跳转界面的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Android SQLite数据库的增 删 查找操作

    Android SQLite数据库的增 删 查找操作

    这篇文章主要介绍了Android SQLite数据库的增 删 查找操作,需要的朋友可以参考下
    2017-02-02
  • Android编程实现Home键的屏蔽,捕获与修改方法

    Android编程实现Home键的屏蔽,捕获与修改方法

    这篇文章主要介绍了Android编程实现Home键的屏蔽,捕获与修改方法,实例分析了使用onAttachedToWindow捕获Home键的相关技巧,需要的朋友可以参考下
    2016-06-06
  • Android开发控制ScrollView滑动速度的方法

    Android开发控制ScrollView滑动速度的方法

    这篇文章主要介绍了Android开发控制ScrollView滑动速度的方法,结合实例形式分析了Android编程中ScrollView滑动事件相关操作技巧,需要的朋友可以参考下
    2017-02-02
  • Android开发之利用Activity实现Dialog对话框

    Android开发之利用Activity实现Dialog对话框

    这篇文章主要给大家介绍了Android开发之如何利用Activity实现Dialog对话框效果,文中给出了详细的示例代码,相信对大家的理解及学习具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
    2016-12-12
  • Android6.0 消息机制原理解析

    Android6.0 消息机制原理解析

    这篇文章主要为大家详细介绍了Android6.0 消息机制原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android简单实现无限滚动自动滚动的ViewPager

    Android简单实现无限滚动自动滚动的ViewPager

    这篇文章主要介绍了Android简单实现无限滚动自动滚动的ViewPager,百度谷歌上面也有很多关于这方面的教程,但是感觉都略显麻烦,而且封装的都不是很彻底。所以试着封装一个比较好用的ViewPager,实现思路一起通过本文学习吧
    2016-12-12
  • RecyclerView实现仿支付宝应用管理

    RecyclerView实现仿支付宝应用管理

    这篇文章主要为大家详细介绍了RecyclerView实现仿支付宝应用管理的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • android判断一个Activity是否处于栈顶的实例

    android判断一个Activity是否处于栈顶的实例

    下面小编就为大家分享一篇android判断一个Activity是否处于栈顶的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03

最新评论