我已经构建了一个应用程序,一旦设置为设备所有者,并使用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 - >安全 - >验证应用程序,禁用“扫描设备以查找安全威胁”,重新启动设备,清除全局代理设置,然后重置它们将工作的全局代理设置,直到我重新启用“扫描设备以获取安全威胁”并重新启动它。这对我没有意义,因为它清楚地表明,如果发现任何安全风险,我会收到通知,我确定还没有看到任何通知。
值得一提的一些事情:
我已经在各种设备上进行了测试,可以在所有设备上重现这个问题。
正确签署apk然后安装它并不能解决问题。
一旦全局代理设置中断,我必须首先清除然后重新设置它们才能再次正常工作。
对于我做错的任何建议或可能的想法都会受到欢迎!
答案 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 所以这个问题很可能会在未来的版本中得到解决。