为什么在重新启动 phone 后全局代理设置被清除?

Why are global proxy settings cleared after restarting the phone?

我构建了一个应用程序,一旦设置为设备所有者转身并使用 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());

}

一切正常,直到我重新启动 phone,然后全局代理设置消失了。如果我通过 ConnectivityManager.getDefaultProxy() 检查全局代理设置,它 returns 应用程序之前设置的代理 pac url 但即使如此,也没有网络流量被代理。

有趣的是,如果我转到设置 -> Google -> 安全 -> 验证应用程序,禁用 "Scan device for security threats",重启设备,清除全局代理设置,然后重置全局代理设置它们将工作,直到我重新启用 "Scan device for security threats" 并重新启动它。这对我来说毫无意义,因为它清楚地表明,如果发现任何安全风险,我将收到通知,但我肯定还没有看到任何通知。

有几点值得一提:

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

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

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

非常欢迎任何关于我做错的建议或可能的想法!

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

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

注册了它

您需要将代理设置为空,然后恢复到您想要的状态。只是将它设置为与它已经相同的值并没有做任何事情。

简答

使用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 所以这个问题很可能会在未来的版本中得到解决。