Почему глобальные настройки прокси очищаются после перезагрузки телефона?

Я создал приложение, которое когда-то устанавливается, когда владелец устройства поворачивается и устанавливает глобальные настройки прокси-сервера с помощью функции 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 (), он возвращает URL-адрес прокси-сервера, который приложение установило ранее, но даже в этом случае сетевой трафик не передается.

Интересно, что если я захожу в "Настройки" -> "Google" -> "Безопасность" -> "Проверить приложения", отключаю "Сканирование устройства на наличие угроз безопасности", перезагружаю устройство, очищаю глобальные настройки прокси и затем сбрасываю глобальные настройки прокси, они будут работать, пока я не -Включить "Сканировать устройство на наличие угроз безопасности" и перезапустить его. Это не имеет смысла для меня, поскольку в нем четко указано, что я буду уведомлен, если будут обнаружены какие-либо угрозы безопасности, и я наверняка еще не видел никаких уведомлений.

Несколько вещей, которые стоит упомянуть:

  1. Я тестировал на разных устройствах и могу воспроизвести проблему на всех них.

  2. Правильная подпись apk, а затем его установка не решают проблему.

  3. После того, как глобальные настройки прокси-сервера были нарушены, я должен сначала очистить, а затем сбросить их, прежде чем они снова будут работать должным образом.

Любые предложения или возможные идеи относительно того, что я делаю неправильно, будут очень приветствоваться!

2 ответа

Решение

Краткий ответ

Используйте buildDirectProxy(строковое имя хоста, int порт)

Длинный ответ

Если вы используете buildDirectProxy(string hostname, int port), глобальный прокси не ломается и не прекращает работу случайным образом - это надежно.

Но если вы вернетесь к URL-адресу прокси-сервера PAC, он сломается.

Причина нестабильного глобального URL-адреса прокси-сервера PAC заключается в том, что для порта прокси установлено значение -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 появился способ установки порта при установке глобального URL-адреса pac, поэтому вполне вероятно, что эта проблема будет решена в будущих выпусках.

Я не совсем уверен, что является основной причиной проблемы, но, кажется, это работает, если я перезагружаю прокси-сервер всякий раз, когда изменяется сетевое подключение.

Я сделал подкласс BroadcastReceiver называется ProxyUpdater с onReceive метод, который устанавливает прокси null а потом к тому, что я хочу, чтобы это было. Тогда я зарегистрировал его context.registerReceiver(new ProxyUpdater(), new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

Вам нужно установить прокси в ноль, и вернуться к тому, что вы хотите, чтобы это было. Просто установив его на то же значение, которое уже было, ничего не происходит.

Другие вопросы по тегам