美文网首页
系统权限下使用WebView

系统权限下使用WebView

作者: 默风 | 来源:发表于2022-04-18 13:51 被阅读0次

    报错

    For security reasons, WebView is not allowed in privileged processes
    

    解决

    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 {
                    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);
            }
        }
    

    相关文章

      网友评论

          本文标题:系统权限下使用WebView

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