WebView is not allowed in privileged processes

devtools/2024/9/29 7:56:56/

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/devtools/118595.html

相关文章

智能感知,主动防御:移动云态势感知为政企安全护航

数字化时代&#xff0c;网络安全已成为企业持续运营和发展的重要基石。随着业务扩展&#xff0c;企业资产的数量急剧增加&#xff0c;且分布日益分散&#xff0c;如何全面、准确地掌握和管理资产成为众多政企单位的难题。同时&#xff0c;传统安全手段又难以有效应对新型、隐蔽…

DNF Decouple and Feedback Network for Seeing in the Dark

DNF: Decouple and Feedback Network for Seeing in the Dark 在深度学习领域&#xff0c;尤其是在低光照图像增强的应用中&#xff0c;RAW数据的独特属性展现出了巨大的潜力。然而&#xff0c;现有架构在单阶段和多阶段方法中都存在性能瓶颈。单阶段方法由于域歧义&#xff0c…

html怎么让字体变颜色

在 HTML 中&#xff0c;可以通过多种方式改变字体的颜色&#xff0c;最常用的方法是使用 CSS&#xff08;层叠样式表&#xff09;来定义字体颜色。以下是几种常见的方法&#xff1a; 使用内联样式 (Inline CSS) 直接在 HTML 标签中使用 style 属性来改变字体颜色。 <p sty…

关于视频监控介入的部分内容,使用的是海康H5web播放的模式

这是原发直接能在系统中使用。里面的样式自己修改&#xff0c;主要是在引入时出现黑色的框就是引入成功&#xff0c;需要在public文件夹中引入h5player.min.js文件就可以。 <template><div class"Shiping"><el-container><el-header><di…

ECMAScript与JavaScript的区别:深入解析

在现代网页开发中&#xff0c;JavaScript 和 ECMAScript 是两个频繁提及的术语。尽管许多人将这两个概念视为同义词&#xff0c;但它们实际上有着重要的区别。本文将深入探讨这两者的定义、关系及其在编程中的应用。 1. 定义与背景 JavaScript JavaScript 是一种高层次的、解…

Java_集合_双列集合_Map

第一章Map集合 Map是双列集合顶级接口 什么叫做双列集合:一个元素有两部分构成:key和value -> 键值对 1.1.HashMap 常用方法: V put(K key, V value) -> 添加元素,返回的是被替换的value值 V remove(Object key) ->根据key删除键值对,返回的是被删除的value…

从0开始实现es6 promise类

主要由基础实现和静态类的实现两部分组成。 1 基础实现&#xff08;不含静态类&#xff09; 1.1 使用类实现完成构造函数 实现代码如下&#xff0c;构造函数传入一个回调函数&#xff0c;定义resolve和reject函数&#xff0c;将两个函数作为参数执行回调函数。 // 1. 使用类实…

Docker数据卷有哪些常见的驱动类型?

Docker数据卷有多种驱动类型&#xff0c;以满足不同的使用场景和需求。以下是一些常见的Docker数据卷驱动类型&#xff1a; 1. Local&#xff08;本地&#xff09;驱动 这是默认的数据卷驱动&#xff0c;它将数据卷存储在Docker主机的文件系统上。这种驱动适用于大多数场景。…