droidplugin webview加载 assert的问题

在DroidPlugin框架中,当插件使用WebView加载Asserts文件时会出现失败的情况,尽管DroidPlugin本应处理资源问题。WebViewFactoryProviderHook类似乎能解决此问题,但其工作原理不明确。作者通过分析代码提出了一种新的解决方案,即通过动态代理WebViewProvider来实现对插件WebView的修复,并提醒注意360的解决方案可能存在的宿主进程问题,应判断是否为插件后再执行修正操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

droidplugin中如果插件中用webview loadurl是asserts文件会读取失败,按道理droidplugin 算是默认处理资源问题,因为创建的context apk路径默认指向插件的apk所在的问题,但webview是不行的,但我看droidplugin代码时候有一个WebViewFactoryProviderHook 这类,貌似是解决assert的问题的,然后像别的类,installhook 之后插件webview就可以读取了(默认没有任何调用),但我不知道为什么那么写就可以,我顺着loadurl 这个方法看代码,无法推出解决方法由来,估计360是分析整个webview加载的顺序推出来的。

    我分析代码得出另外的解决webview的办法,同时可以增加webview操作,通过动态代理webviewProvider,然后对应的处理就可以做到了,直接贴简单的代码。

 protected void afterInvoke(Object receiver, Method method, Object[] args, final Object invokeResult) throws Throwable {
            if (mWebView != null) {


                Class clazz = invokeResult.getClass();
                List<Class<?>> interfaces = Utils.getAllInterfaces(clazz);
                Class[] ifs = interfaces != null && interfaces.size() > 0 ? interfaces.toArray(new Class[interfaces.size()]) : new Class[0];
                //fixWebViewAsset(mWebView.getContext());
                final Object newObj = MyProxy.newProxyInstance(clazz.getClassLoader(), ifs, new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        android.util.Log.d(TAG, "invoke: " + method);
                        if(method.getName().contains("loadUrl")){
                            String url = (String)args[0];
                            if(url.contains("file:")){
                                args[0] = "http://m.360.com/";
                            }
                        }
                        Object invoke = method.invoke(invokeResult, args);
                        //fixWebViewAsset(mWebView.getContext());
                        return invoke;
                    }
                });

               // final Object newObj = MyProxy.newProxyInstance(clazz.getClassLoader(), ifs, new WebViewProviderHook(null));
                setFakedResult(newObj);
            }


360那种解决办法,没有对自己的宿主进程做过滤,如果宿主也用webview会导致问题,建议判断是否插件,如果插件才进行修正


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值