微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

上次更新Android System Webview后,代理设置停止工作

Android System Webview的最后一次更新(2018年5月30日)之后,代理设置停止了为我工作,代理不再适用于webview.在其他具有代理的浏览器中,它具有相同的效果,代理不设置,阻止的网站无法打开,ip不会更改.返回的错误是主机无解析器或连接失败.
我的设备是Nexus 5X,Android 8.1.0.其他人是否面临同样的问题?

我用它来设置代理:

private static boolean setProxyKKPlus(WebView webView, String host, int port, String applicationClassName) {
        Log.d(LOG_TAG, "Setting proxy with >= 4.4 API.");

        Context appContext = webView.getContext().getApplicationContext();
        System.setProperty("http.proxyHost", host);
        System.setProperty("http.proxyPort", port + "");
        System.setProperty("https.proxyHost", host);
        System.setProperty("https.proxyPort", port + "");
        try {
            Class applictionCls = Class.forName(applicationClassName);
            Field loadedApkField = applictionCls.getField("mloadedApk");
            loadedApkField.setAccessible(true);
            Object loadedApk = loadedApkField.get(appContext);
            Class loadedApkCls = Class.forName("android.app.LoadedApk");
            Field receiversField = loadedApkCls.getDeclaredField("mReceivers");
            receiversField.setAccessible(true);
            ArrayMap receivers = (ArrayMap) receiversField.get(loadedApk);
            for (Object receiverMap : receivers.values()) {
                for (Object rec : ((ArrayMap) receiverMap).keySet()) {
                    Class clazz = rec.getClass();
                    if (clazz.getName().contains("Proxychangelistener")) {
                        Method onReceiveMethod = clazz.getDeclaredMethod("onReceive", Context.class, Intent.class);
                        Intent intent = new Intent("android.intent.action.PROXY_CHANGE");

                        onReceiveMethod.invoke(rec, appContext, intent);
                    }
                }
            }

            Log.d(LOG_TAG, "Setting proxy with >= 4.4 API successful!");
            return true;
        } catch (Exception e) {
            StringWriter sw = new StringWriter();
            e.printstacktrace(new PrintWriter(sw));
            String exceptionAsstring = sw.toString();
            Log.v(LOG_TAG, e.getMessage());
            Log.v(LOG_TAG, exceptionAsstring);
        } 
        return false;
    }

解决方法:

代码适用于我的环境(Chrome 67 Android 7.0)

for (Object receiverMap : receivers.values()) {
    for (Object rec : ((ArrayMap) receiverMap).keySet()) {
        Class clazz = rec.getClass();

        boolean targetReceiverFound = false;
        if (clazz.getName().contains("Proxychangelistener")) {
            targetReceiverFound = true;
        } else {
            final Field[] obfuscatedFields = clazz.getDeclaredFields();
            for (Field f : obfuscatedFields) {
                if (f.getType().getName().contains("Proxychangelistener")) {
                    targetReceiverFound = true;
                    break;
                }
            }
        }

        if (targetReceiverFound) {
            // invoke onReceive() here
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐