1

我已经构建了一个应用程序,该应用程序曾经设置为设备所有者转身并使用 setRecommendedGlobalProxy() 函数设置全局代理设置,如下所示:

String pacUrl = "http://my-proxy-server.com:65011/proxy.pac?a=ZGtyZWl89xyy1qAZW15";
Uri pacUrl = Uri.parse(proxyPacUrl);
ProxyInfo newProxy = ProxyInfo.buildPacProxy(pacUrl);

try {

    Log.i("ADMIN", "Setting global proxy to " + newProxy.toString());
    mDPM.setRecommendedGlobalProxy(adminComponent, newProxy);


} catch (Exception e) {

    Log.w("ADMIN", "Caught exception while setting global proxy: " + e.toString());

}

在我重新启动手机然后全局代理设置消失之前,这一切都很好。如果我通过ConnectivityManager.getDefaultProxy()检查全局代理设置,它会返回应用程序之前设置的代理 pac url,但即便如此,也没有网络流量被代理。

有趣的是,如果我转到设置 -> Google -> 安全 -> 验证应用程序,禁用“扫描设备以查找安全威胁”,重新启动设备,清除全局代理设置,然后重置全局代理设置,它们将一直有效,直到我重新-启用“扫描设备以查找安全威胁”并重新启动它。这对我来说毫无意义,因为它明确指出,如果发现任何安全风险,我会收到通知,而且我肯定还没有看到任何通知。

有几点值得一提:

  1. 我已经在各种设备上进行了测试,并且可以在所有设备上重现该问题。

  2. 正确签署 apk 然后安装它并不能解决问题。

  3. 一旦全局代理设置被破坏,我必须先清除然后重置它们,然后它们才能再次正常工作。

任何关于我做错了什么的建议或可能的想法都将受到欢迎!

4

2 回答 2

1

我不完全确定问题的根本原因是什么,但如果我在网络连接发生变化时重置代理,它似乎可以工作。

我使用一个方法创建了一个BroadcastReceiver调用的子类,该方法将代理设置为然后设置为我想要的。然后我注册了ProxyUpdateronReceivenullcontext.registerReceiver(new ProxyUpdater(), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

您需要将代理设置为空,然后恢复为您想要的。只需将其设置为与它已经相同的值不会做任何事情。

于 2018-03-22T23:10:15.187 回答
0

简答

使用buildDirectProxy(string hostname, int port)

长答案

如果您使用buildDirectProxy(string hostname, int port)全局代理不会中断或随机退出工作 - 它坚如磐石。

但是,如果您恢复到代理 PAC URL,它就会中断。

全局代理 PAC URL 不稳定的原因是因为代理端口设置为 -1,最终导致崩溃。这是日志摘录。

02-12 16:20:57.723  2018  3270 E AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
02-12 16:20:57.723  2018  3270 E AndroidRuntime: Process: com.mydeviceowner.package, PID: 2019
02-12 16:20:57.723  2018  3270 E AndroidRuntime: java.lang.IllegalArgumentException: port out of range:-1

Android 11引入了一种在设置全局 pac URL 时设置端口的方法,因此这个问题很可能会在未来的版本中得到解决。

于 2021-02-16T21:26:21.057 回答