WebView is not allowed in privileged processes

embedded/2024/9/29 11:15:21/

1、现象

		最近客户提出一个问题,应用使用webview加载网页时,提示“For security reasons, WebView is not allowed in privileged processes”,然后网页无法加载。

2、分析

	通过该提示,在源码中找到了报出该提示的所在之处。出于安全考虑,谷歌在Android8开始,不允许在拥有系统权限的应用中使用 WebView。路径:***\SC200E_AP/QCM2290_Android12.0_R02_r004/QSSI12/frameworks/base/core/java/android/webkit/WebViewFactory.java如下图:
@UnsupportedAppUsagestatic 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;sTimestamps.mWebViewLoadStart = SystemClock.uptimeMillis();final int uid = android.os.Process.myUid();if (uid == android.os.Process.ROOT_UID /* || uid == android.os.Process.SYSTEM_UID */|| uid == android.os.Process.PHONE_UID || uid == android.os.Process.NFC_UID|| uid == android.os.Process.BLUETOOTH_UID) {throw new UnsupportedOperationException("For security reasons, WebView is not allowed in privileged processes");}if (!isWebViewSupported()) {// Device doesn't support WebView; don't try to load it, just throw.throw new UnsupportedOperationException();}

在安全检查时,客户应用里面添加了android:sharedUserId=“android.uid.system”,导致报出了该异常。

3、解决

	因为客户应用要预装为系统应用,所以android:sharedUserId="android.uid.system"不能删去。故直接在源码中,注释掉了|| uid == android.os.Process.SYSTEM_UID该判断。其他方法:可以在使用webview的activity中,添加以下代码:
@SuppressLint("SoonBlockedPrivateApi")public static void hookWebView(){int sdkInt = Build.VERSION.SDK_INT;try {Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");Field field = factoryClass.getDeclaredField("sProviderInstance");field.setAccessible(true);Object sProviderInstance = field.get(null);if (sProviderInstance != null) {Log.i(TAG,"sProviderInstance isn't null");return;}Method getProviderClassMethod;if (sdkInt > 22) {getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");} else if (sdkInt == 22) {getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");} else {Log.i(TAG,"Don't need to Hook WebView");return;}getProviderClassMethod.setAccessible(true);Class<?> factoryProviderClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");Constructor<?> delegateConstructor = delegateClass.getDeclaredConstructor();delegateConstructor.setAccessible(true);if(sdkInt < 26){//低于Android O版本Constructor<?> providerConstructor = factoryProviderClass.getConstructor(delegateClass);if (providerConstructor != null) {providerConstructor.setAccessible(true);sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance());}} else {@SuppressLint("SoonBlockedPrivateApi") Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD");chromiumMethodName.setAccessible(true);String chromiumMethodNameStr = (String)chromiumMethodName.get(null);if (chromiumMethodNameStr == null) {chromiumMethodNameStr = "create";}Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass);if (staticFactory!=null){sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance());}}if (sProviderInstance != null){field.set("sProviderInstance", sProviderInstance);Log.i(TAG,"Hook success!");} else {Log.i(TAG,"Hook failed!");}} catch (Throwable e) {Log.w(TAG,e);}}

注意:hookWebView();方法要放在setContentView前面。

因为时间的关系,在源码中修改时,我是直接注释掉了判断,有点一刀切。应该会有其他方法,比如根据包名跳过该检查等。


http://www.ppmy.cn/embedded/119314.html

相关文章

pytorch ----【输入张量.data.size()/输入张量.size()】的使用

import torch test_data torch.randn(1, 12, 32, 32) batchsize, num_channels, height, width test_data.data.size() 在提供的代码中&#xff0c;test_data 是一个形状为 (1, 12, 32, 32) 的随机张量&#xff0c;表示一个批次&#xff08;batch&#xff09;中有 1 张图像&…

Reis数据库及key的操作命令汇总

管理命令 命令含义BGREWRITEAOF异步执行一个 AOF&#xff08;AppendOnly File&#xff09; 文件重写操作BGSAVE在后台异步保存当前数据库的数据到磁盘CLIENT关闭客户端连接CLIENT LIST获取连接到服务器的客户端连接列表CLIENT GETNAME获取连接的名称CLIENT PAUSE在指定时间内终…

npm 源切换以及添加 使用工具 nrm 使用方法

nrm (npm Registry Manager) 是一个用于管理和切换 npm 源的命令行工具&#xff0c;可以帮助开发者更方便地在不同的 npm 源之间切换&#xff0c;特别是对于需要频繁切换源的用户来说非常有用。以下是 nrm 的基本使用方法&#xff1a; 1. 安装 nrm 首先&#xff0c;你需要全局…

【Qt】Qt中的窗口坐标 信号与槽

Qt中的窗口坐标 && 信号与槽 1. Qt中的窗口坐标2. 信号与槽的概述3. 信号和槽的使用3.1 connect函数的使用3.2 查看内置信号和槽3.2 connect的参数类型不匹配问题 4. 自定义信号 && 自定义槽4.1 自定义槽4.2 自定义信号 5. 带参数的信号和槽6. 信号与槽的关联方…

教师工作量|基于springBoot的教师工作量管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff…

记录linux环境下搭建本地MQTT服务器实现mqtt的ssl加密通讯

1、ubuntu安装mosquitto sudo apt-get update//安装服务端 sudo apt-get install mosquitto//安装客户端 sudo apt-get install mosquitto-clients 2、安装openssl 3、mqtts/tls加密传输 mosquitto原生支持了TLS加密&#xff0c;TLS&#xff08;传输层安全&#xff09;是SSL&…

基于python+spark的外卖餐饮数据分析系统设计与实现(含论文)-Spark毕业设计选题推荐

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Word样式的同步与重置

有时候我们需要修改Word中的样式&#xff0c;实现排版的个性化。 如何同步样式到其他电脑上&#xff1f; Word中的样式是由Normal.dotm文件控制的&#xff0c;对样式所有的设置和修改&#xff0c;都会保存到这个问题件中&#xff0c;所以我们只需要在设置好样式以后&#xff…