美文网首页
For security reasons, WebView is

For security reasons, WebView is

作者: 程序猿老王 | 来源:发表于2024-07-18 15:11 被阅读0次

原因

在具有系统级权限的应用中使用 WebView 时,可能会遇到 java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes 错误。这是因为出于安全考虑,Android 不允许在拥有系统权限的应用中使用 WebView。

解决方案

在setContentView之前调用以下hookWebView方法即可

const val TAG = "hookWebView"
private fun hookWebView() {
            val sdkInt = Build.VERSION.SDK_INT
            try {
                val factoryClass = Class.forName("android.webkit.WebViewFactory")
                val field = factoryClass.getDeclaredField("sProviderInstance")
                field.isAccessible = true
                var sProviderInstance = field[null]
                if (sProviderInstance != null) {
                    Log.i(TAG, "sProviderInstance isn't null")
                    return
                }
                val getProviderClassMethod = if (sdkInt > 22) {
                    factoryClass.getDeclaredMethod("getProviderClass")
                } else if (sdkInt == 22) {
                    factoryClass.getDeclaredMethod("getFactoryClass")
                } else {
                    Log.i(TAG, "Don't need to Hook WebView")
                    return
                }
                getProviderClassMethod.isAccessible = true
                val factoryProviderClass = getProviderClassMethod.invoke(factoryClass) as Class<*>
                val delegateClass = Class.forName("android.webkit.WebViewDelegate")
                val delegateConstructor = delegateClass.getDeclaredConstructor()
                delegateConstructor.isAccessible = true
                if (sdkInt < 26) { //低于Android O版本
                    val providerConstructor = factoryProviderClass.getConstructor(delegateClass)
                    if (providerConstructor != null) {
                        providerConstructor.isAccessible = true
                        sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance())
                    }
                } else {
                    val chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD")
                    chromiumMethodName.isAccessible = true
                    var chromiumMethodNameStr = chromiumMethodName[null] as String
                    if (chromiumMethodNameStr == null) {
                        chromiumMethodNameStr = "create"
                    }
                    val staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass)
                    if (staticFactory != null) {
                        sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance())
                    }
                }

                if (sProviderInstance != null) {
                    field["sProviderInstance"] = sProviderInstance
                    Log.i(TAG, "Hook success!")
                } else {
                    Log.i(TAG, "Hook failed!")
                }
            } catch (e: Throwable) {
                Log.w(TAG, e)
            }
        }

相关文章

网友评论

      本文标题:For security reasons, WebView is

      本文链接:https://www.haomeiwen.com/subject/qiirhjtx.html