为什么重启手机后全局代理设置被清除?

时间:2017-07-25 15:17:48

标签: android http-proxy device-owner

我已经构建了一个应用程序,一旦设置为设备所有者,并使用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 个答案:

答案 0 :(得分:1)

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

我创建了一个名为BroadcastReceiver ProxyUpdater的子类,其onReceive方法将代理设置为null,然后设置为我想要的。然后我用context.registerReceiver(new ProxyUpdater(), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

注册了它

您需要将代理设置为null,并返回到您想要的状态。只需将其设置为相同的值,它就不会做任何事情。

答案 1 :(得分: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 introduced a way to set the port when setting a global pac URL 所以这个问题很可能会在未来的版本中得到解决。