Как настроить прокси на Android: поля в параметрах Wi-Fi, приложения-клиенты, эмулятор и adb
- Что понадобится
- Прокси в параметрах сети Wi-Fi поле за полем
- Что охватывает системная запись Wi-Fi и где проходит её граница
- Почему у передачи данных по сотовой сети своего поля для посредника нет
- Приложения-клиенты и что они дают сверх системной записи
- Эмулятор Android на компьютере и передача адреса через параметры запуска
- Отладка через adb и проброс настроек на устройство
- Приложения, которые ходят в обход системной настройки
- Проверка после настройки
- Разбор ошибок
Прокси на Android это адрес и порт посредника, которые операционная система хранит в свойствах конкретного сетевого подключения и раздаёт приложениям через объект настроек сети. Страница показывает, где эти поля лежат в оболочках разных производителей, что реально охватывает системная запись, как передать адрес эмулятору при запуске и командами adb, и как убедиться, что запросы приложения ушли через указанный порт.
Задачи, ради которых я это делаю, повторяются от проекта к проекту. Посмотреть, что мой собственный сервис отдаёт клиенту при заходе снаружи офисной сети. Проверить вёрстку мобильной веб-версии с внешнего адреса, когда локальный кэш и внутренние маршруты сбивают картину. Прогнать отладочную сборку приложения на эмуляторе так, чтобы все её запросы уходили через один известный порт и попадали в журнал.
1. Что понадобится
Поле для посредника в свойствах беспроводной сети есть во всех сборках начиная с Android 4.x, и с тех пор оно почти не менялось: адрес, порт, список исключений, отдельный пункт для файла автонастройки. Различаются только названия разделов в оболочках. Стандартный Android и Pixel называют раздел «Сеть и интернет», Samsung One UI пишет «Подключения», Xiaomi HyperOS и MIUI прячут пункт под «Wi-Fi» и «Дополнительные настройки», Huawei EMUI использует «Беспроводные сети». Сам экран правки сети везде одинаковый.
Нужна строка подключения. Поставщики отдают её двумя видами: IP:PORT и IP:PORT:LOGIN:PASS. Первый вид означает авторизацию по привязанному внешнему адресу вашего канала, второй по паре логина и пароля. Разница здесь важнее, чем на настольной системе: системные поля Wi-Fi принимают только адрес с портом, места под логин и пароль в них нет вовсе. Значит для системной записи берётся привязка по адресу, а пара логина с паролем понадобится в приложении-клиенте либо в эмуляторе.
Все примеры я пишу на адресе 198.51.100.23, порт 8888 для HTTP и порт 1080 для SOCKS5. Подставляйте свои значения, структуру строк при этом менять не нужно.
Мой рабочий пул отдаёт список ссылкой сразу в обоих форматах, поэтому строку я вставляю в поля копированием и разбираю руками только двоеточия. Под телефон и планшет я держу адреса IPv4 с выгрузкой списка ссылкой: в пакет входят две привязки, менять их в кабинете можно свободно, включение пакета занимает около 5 минут, трафик безлимитный на всех сроках доступа.
Для раздела про эмулятор и adb понадобится Android SDK Platform Tools на компьютере. Проверьте, что каталог с adb и emulator попал в переменную PATH, иначе команды придётся вызывать полным путём.
2. Прокси в параметрах сети Wi-Fi поле за полем
Откройте «Настройки», раздел «Сеть и интернет», пункт «Интернет». В списке сетей нажмите значок шестерёнки справа от активной сети. Откроется карточка сети с кнопкой карандаша либо пунктом «Изменить» в меню из трёх точек. Разверните блок «Дополнительно» или «Расширенные настройки»: там и лежит выпадающий список «Прокси-сервер».
Список даёт три значения: «Нет», «Вручную», «Прокси-авто-конфигурация». Выберите «Вручную», и под списком развернутся три поля.
| Поле экрана | Что вносить | Что ломается при ошибке |
|---|---|---|
| «Имя хоста прокси-сервера» | Только адрес или имя хоста: 198.51.100.23 | Схема http:// в этом поле даёт отказ на первом же запросе |
| «Порт» | Число: 8888 | Порт скопирован вместе с двоеточием, поле принимает лишь цифры |
| «Не использовать прокси-сервер для» | Хосты через запятую, звёздочка допустима слева | Записи разделены пробелами, весь список читается как один хост |
| «URL-адрес PAC» при выборе автоконфигурации | Полный адрес файла со схемой | Указан путь к файлу на диске, система его не читает |
| Кнопка «Сохранить» | Нажимается обязательно | Поля заполнены, экран закрыт кнопкой «Назад», запись потеряна |
Синтаксис исключений отличается от настольных систем. Разделителем служит запятая без пробела, маски вида 192.168.0.0/16 экран не понимает, звёздочка ставится только в начале имени.
localhost,127.0.0.1,*.internal.lan,10.0.2.2,staging.example.org
Кнопка «Сохранить» применяет запись мгновенно и без перезагрузки. Chrome и другие браузеры подхватят её на следующем запросе, приложения на своих сетевых клиентах после перезапуска процесса.
Три момента, которые я проверяю каждый раз. Первый: запись живёт внутри профиля сети, поэтому кнопка «Удалить эту сеть» стирает её вместе с паролем от Wi-Fi. Второй: на сетях с порталом авторизации экран правки открывается только после успешного входа, до этого поля серые. Третий: часть оболочек показывает выпадающий список посредника лишь при подключённой сети, поэтому сохранённая, но неактивная сеть правке не поддаётся.
Отдельно про режим автоконфигурации. Значение «Прокси-авто-конфигурация» принимает адрес файла с функцией FindProxyForURL, система скачивает его при подключении к сети и кэширует. Работает он у меня стабильно в стандартном Android и капризничает в сторонних оболочках: часть прошивок читает файл один раз и держит устаревшую копию до переподключения к сети. Ручной ввод предсказуемее, поэтому на телефонах я обычно оставляю «Вручную».
3. Что охватывает системная запись Wi-Fi и где проходит её граница
Здесь начинается главное ограничение, ради которого пишется половина этой страницы. Системная запись даёт меньше, чем ожидает большинство пришедших к ней людей, и знать её границы стоит до того, как вы начнёте искать причину странного поведения приложения.
Ограничение состоит из двух частей. Первая: настройка привязана к профилю конкретной беспроводной сети. Телефон ушёл в другую сеть, и посредника у него уже нет. Заполнять поля придётся отдельно для домашней сети, отдельно для офисной, отдельно для точки доступа с ноутбука. Ушли из зоны Wi-Fi на прогулку, телефон переключился на сотовую сеть, и все проверки с этой минуты идут с обычного адреса.
Вторая часть тоньше. Система кладёт адрес и порт в объект сети, читают этот объект далеко не все приложения. Подчиняются те, кто ходит наружу через стандартные механизмы платформы: WebView, классы java.net, надстройки над ними. Приложение со своим сетевым кодом на голых сокетах записи не видит вовсе, и трафик у него идёт напрямую при полностью заполненных полях. Подробный разбор с перечнем библиотек я вынес ниже, после раздела про adb, потому что глобальная запись из моста подчиняется тем же правилам.
Порт для системной записи подбирается по одному признаку: он обязан принимать и обычные запросы, и метод CONNECT, которым браузер строит туннель к сайтам по HTTPS. Без второго режима откроются простые страницы, а всё с замком в адресной строке начнёт отдавать отказ. Я держу под мобильные проверки приватные прокси на собственном оборудовании, где оба режима на порту разрешены и строка выдаётся в готовом виде.
4. Почему у передачи данных по сотовой сети своего поля для посредника нет
Открываете настройки при выключенном Wi-Fi и не находите знакомого выпадающего списка. Это ожидаемое поведение, и причина в устройстве платформы.
Android описывает каждое подключение объектом сети со своим набором свойств. Беспроводная сеть создаётся вашими руками: вы вводите пароль, правите профиль, наполняете его свойства значениями. Подключение по сотовой сети создаётся по профилю точки доступа, который приходит от оператора связи и обслуживается системой автоматически. Свойства такого подключения заполняет оператор, экрана правки посредника платформа для него не рисует.
Формально поля есть внутри самой точки доступа: экран «Мобильная сеть», пункт «Точки доступа APN», карточка профиля, строки «Прокси-сервер» и «Порт». Три обстоятельства делают этот путь бесполезным для наших задач. Профили от крупных операторов часто помечены как защищённые от правки, и поля в них серые. На аппаратах с прошивкой оператора экран APN может быть скрыт целиком. И даже когда правка проходит, значение попадает в шлюз оператора и переживает первое же обновление профиля.
Работающий путь на сотовой сети ровно один: приложение-клиент, которое поднимает на телефоне виртуальный сетевой интерфейс и уводит трафик в него. Такой интерфейс перекрывает маршрут по умолчанию и не зависит от того, через что телефон вышел наружу. Тот же приём закрывает и вторую половину ограничения: клиент забирает соединения приложений, которые системную запись игнорируют.
5. Приложения-клиенты и что они дают сверх системной записи
Клиент регистрируется в системе как поставщик виртуальной частной сети через VpnService, получает от платформы туннельный интерфейс и таблицу маршрутов, разбирает пакеты и пересылает содержимое TCP-соединений на ваш порт SOCKS5 или HTTP. Права суперпользователя для этого не нужны, разрешение выдаётся один раз системным окном, дальше в строке состояния висит значок ключа.
| Что даёт клиент | Как выглядит в интерфейсе |
|---|---|
| Пара логина и пароля | Отдельные поля рядом с адресом и портом |
| Работа на сотовой сети и при смене Wi-Fi | Маршрут перекрывается на уровне устройства, профиль сети роли не играет |
| Захват приложений со своим сетевым кодом | Пакеты забираются с туннельного интерфейса до сокетов приложения |
| Разделение по приложениям | Список установленных программ с галочками, режим «только выбранные» |
| Свои имена и обход по спискам | Поле адреса сервера имён и текстовое поле правил |
| Несколько сохранённых портов | Именованный список профилей с переключателем |
Схему SOCKS5 клиенты держат как основную, и на телефоне у неё есть заметное преимущество: она принимает любой TCP и передаёт имя хоста на сторону посредника, поэтому запросы к службе имён остаются внутри туннеля. Под приложения-клиенты я беру порт SOCKS5 с удалённым разрешением имён и в самом клиенте оставляю поле собственного сервера имён пустым.
Ограничение у клиента одно: система отдаёт слот виртуальной сети единовременно только одной программе. Второй клиент при запуске покажет системное окно и перехватит слот у первого. При отладке я держу на устройстве один клиент и переключаю профили внутри него.
Разделение по приложениям заслуживает отдельного слова, потому что именно оно превращает клиент в отладочный инструмент. Включаете режим «только выбранные», отмечаете галочкой одну свою сборку и получаете картину, где через порт идёт ровно она. Остальной телефон продолжает жить в обычной сети. Обновления магазина и почта в журнал порта уже не попадают, и каждая строка там соответствует действию в приложении.
6. Эмулятор Android на компьютере и передача адреса через параметры запуска
Виртуальное устройство из Android Studio получает параметры посредника на уровне самого эмулятора, до операционной системы внутри. Это удобнее, чем поля Wi-Fi внутри гостя: перехватывается весь трафик виртуальной машины, включая запросы приложений со своим сетевым кодом.
Ключ называется -http-proxy и принимает строку со схемой, при необходимости вместе с парой логина и пароля.
emulator -list-avds
emulator -avd Pixel_6_API_34 -http-proxy http://198.51.100.23:8888
emulator -avd Pixel_6_API_34 -http-proxy http://login:parol@198.51.100.23:8888
emulator -avd Pixel_6_API_34 -http-proxy http://198.51.100.23:8888 -dns-server 1.1.1.1 -no-snapshot-load
Разберу ключи по порядку. Команда emulator -list-avds печатает имена созданных устройств, их же показывает диспетчер устройств в Android Studio. Ключ -avd выбирает устройство по имени. Ключ -http-proxy задаёт посредника для сетевого слоя виртуальной машины. Ключ -dns-server пригождается, когда гость не разрешает имена: эмулятор берёт службу имён у хоста, и в корпоративной сети она отвечает не тем, что ожидает гость. Ключ -no-snapshot-load поднимает устройство с начального состояния, иначе восстановление снимка возвращает и старые сетевые параметры.
Пароль в командной строке видно в списке процессов, поэтому на общей машине я задаю параметры вторым путём. Нажмите три точки справа от окна эмулятора, откройте «Extended controls», раздел «Settings», вкладку «Proxy». Снимите галочку «Use Android Studio HTTP proxy settings», отметьте «Manual proxy configuration», заполните «Host name», «Port name», при необходимости «Proxy authentication» с парой логина и пароля. Нажмите «Apply». Строка состояния прямо под полями напишет «Proxy status: Success» либо назовёт причину отказа.
Внутри гостя работает особый адрес 10.0.2.2, за которым стоит петлевой интерфейс хост-машины. Он выручает, когда посредник или отладочный сервер подняты прямо на компьютере: в поля гостя вносится 10.0.2.2 с нужным портом, и трафик уходит на хост. Адрес 10.0.2.3 указывает на службу имён хоста, 10.0.2.15 это адрес самого гостя внутри виртуальной сети. Эти три записи я держу в памяти, они экономят время при каждом разборе.
Есть тонкость с сертификатами. Когда порт разворачивает HTTPS для просмотра содержимого запросов, гостю нужен сертификат в системном хранилище, и с Android 7 пользовательские сертификаты приложениям недоступны без правки конфигурации сетевой безопасности. Для отладочной сборки достаточно добавить в манифест ссылку на network_security_config с разрешением пользовательских сертификатов. Для образов без Google Play доступен запуск с ключом -writable-system и запись сертификата в системный раздел.
7. Отладка через adb и проброс настроек на устройство
Мост отладки даёт то, чего нет в графических экранах: глобальную запись посредника, которая переживает смену сети и действует до явной отмены. Пишется она в таблицу системных настроек и требует разрешения WRITE_SECURE_SETTINGS, которое как раз и выдаётся оболочке adb.
adb devices -l
adb shell settings put global http_proxy 198.51.100.23:8888
adb shell settings get global http_proxy
adb shell settings put global http_proxy :0
adb shell settings delete global http_proxy
Первая команда печатает подключённые устройства вместе с моделью: физический телефон виден по серийному номеру, виртуальное устройство под именем вида emulator-5554. Вторая записывает адрес с портом. Схема в этой строке не пишется, только адрес и порт через двоеточие. Третья читает записанное значение обратно, ею я всегда сверяю результат. Четвёртая снимает посредника специальным пустым значением :0, и это надёжнее удаления ключа: часть прошивок кэширует старое значение до перезагрузки. Пятая удаляет запись насовсем.
Когда устройств больше одного, адресуйте нужное ключом -s. Полезны и остальные команды ниже.
adb -s emulator-5554 shell settings put global http_proxy 10.0.2.2:8888
adb connect 192.168.1.42:5555
adb reverse tcp:8888 tcp:8888
adb shell settings list global
adb shell dumpsys connectivity
adb shell am start -a android.settings.WIFI_SETTINGS
adb logcat -s OkHttp:V
Команда adb connect подключает телефон по сети без кабеля, порт 5555 открывается пунктом «Отладка по Wi-Fi» в настройках разработчика. Команда adb reverse пробрасывает порт компьютера на устройство через канал отладки: телефон обращается к 127.0.0.1:8888 и попадает на порт хост-машины. Приём выручает на физическом устройстве, когда посредник поднят локально и наружу не смотрит. Команда settings list global печатает всю таблицу, я фильтрую её поиском по подстроке proxy. Вывод dumpsys connectivity показывает объект сети со свойствами, включая действующего посредника и исключения. Последняя команда открывает экран Wi-Fi одним нажатием, удобно при работе через удалённый экран.
Порядок применения между двумя записями стоит запомнить: глобальная запись из adb перекрывает поля профиля Wi-Fi. Заполненные поля на экране сети при этом никуда не деваются и вводят в заблуждение при разборе. Столкнувшись с расхождением, я первым делом читаю settings get global http_proxy и только затем смотрю на экран.
8. Приложения, которые ходят в обход системной настройки
Теперь обещанный перечень. Он одинаково относится и к полям профиля Wi-Fi, и к глобальной записи из adb: обе кладут параметры в один объект сети, и разница только в том, на скольких подключениях этот объект действует.
| Что делает запрос | Читает системную настройку | Замечание |
|---|---|---|
| WebView внутри приложения | Да | Обновление приходит широковещательным событием, окно перезапускать не нужно |
| Chrome и браузеры на движке Chromium | Да | Собственный сетевой стек берёт параметры у платформы |
HttpURLConnection и классы java.net | Да | Читаются системные свойства http.proxyHost и http.proxyPort |
| OkHttp и Retrofit со значениями по умолчанию | Да | Работают через ProxySelector.getDefault() |
| React Native на Android | Да | Сетевой слой построен поверх того же OkHttp |
| Cronet и встроенные библиотеки Google | Частично | Часть сборок настраивается собственным объектом конфигурации |
| Клиент на Dart внутри Flutter | Нет | HttpClient.findProxy подключается разработчиком вручную |
| Игровые движки и сетевой код на сокетах | Нет | Соединение открывается напрямую, минуя платформенные классы |
| gRPC поверх своего канала | Нет | Канал создаётся с адресом узла и списком посредников не пользуется |
| Push-канал и служебные сервисы | Нет | Держат постоянное соединение своим путём |
| Трафик поверх UDP, включая QUIC | Нет | HTTP-посредник обслуживает TCP |
| Пинг и трассировка | Нет | ICMP через порт не проходит по устройству протокола |
Отсюда простое следствие для отладки: приложение, которое вы проверяете, обязано быть собрано на стандартных сетевых классах платформы либо принимать параметры посредника через свои настройки. Когда ни того ни другого нет, системная запись остаётся без действия, и в работу идут два пути из разделов выше. Приложение-клиент с виртуальным интерфейсом забирает пакеты до сокетов программы, поэтому её сетевой код обойти маршрут уже не может. Эмулятор с ключом -http-proxy перехватывает трафик на уровне виртуальной машины, ещё до гостевой системы.
Признак, по которому я быстро отличаю один случай от другого, такой. Браузер телефона показывает внешний адрес порта, экран вашего приложения показывает домашний адрес. Значит настройка внесена верно и дело в сетевом коде программы. Оба экрана показывают домашний адрес, значит ошибка в самих полях, и разбор начинается с команды settings get global http_proxy.
9. Проверка после настройки
Первый шаг это сверка внешнего адреса. Откройте в браузере телефона страницу определения адреса, запомните значение, затем переключите посредника в «Нет» и обновите страницу. Значения обязаны различаться. Совпали, значит запрос ушёл мимо посредника, и причину я ищу в порядке из следующих шагов.
Второй шаг: прочитать, что реально записано в системе.
adb shell settings get global http_proxy
adb shell dumpsys connectivity
curl -x http://198.51.100.23:8888 https://api.ipify.org
curl -x socks5h://198.51.100.23:1080 https://api.ipify.org
Две команды curl с компьютера повторяют оба порта вне телефона. Совпадение их вывода с тем, что показала вкладка браузера, подтверждает конфигурацию окончательно. Отказ у curl при рабочем браузере на телефоне означает, что привязка внешнего адреса сделана на канал телефона, а компьютер сидит на другом канале.
Третий шаг самый важный: убедиться, что через посредник идут запросы именно вашего приложения. Браузер подчиняется настройке почти всегда, приложение далеко не всегда, и радоваться правильному адресу в браузере рано.
Я делаю это тремя способами, по возрастанию точности. Способ первый: журнал на стороне порта. Откройте один экран приложения, который обращается к вашему интерфейсу программирования, и найдите в журнале строку с этим доменом и временем нажатия. Способ второй: сравнение ответов. Приложение получает от вашего сервиса разный вывод при заходе изнутри и снаружи, и достаточно посмотреть на экран. Способ третий: журнал самого приложения. Отладочная сборка с включённым перехватчиком OkHttp печатает адрес и заголовки каждого запроса, вывод читается командой adb logcat с фильтром по тегу.
Четвёртый шаг: проверка заголовков, которые видит сервер. Страницы проверки печатают присланные заголовки списком. Записи Via и X-Forwarded-For говорят, что порт сообщает серверу о посреднике и о вашем исходном адресе. Для проверок мобильной веб-версии я подставляю анонимные адреса для мобильных проверок и повторяю вывод той же страницы, чтобы список заголовков стал коротким.
Пятый шаг для сомнительных случаев: снять картину без телефона вовсе. Виртуальное устройство с ключом -http-proxy даёт повторяемый прогон, где посредник перехватывает всё, включая запросы приложений со своим сетевым кодом. Расхождение между эмулятором и физическим аппаратом почти всегда указывает на приложение, которое читает настройки платформы избирательно.
Постоянство порта на всех этих шагах экономит время: адрес и порт вносятся в поля один раз и остаются рабочими весь прогон. У меня под мобильные проверки стоят серверные прокси с постоянным портом, а свежая выгрузка списка забирается ссылкой в любой момент. Когда я меняю привязку в кабинете, поля телефона править не приходится, прокси IPv4 под настройку на телефоне продолжают отвечать на том же порту.
10. Разбор ошибок
| Сообщение или признак | Причина | Что делать |
|---|---|---|
ERR_PROXY_CONNECTION_FAILED в Chrome | Порт закрыт, адрес с опечаткой либо привязка внешнего адреса слетела | Повторить запрос командой curl -x с компьютера, сверить привязку в кабинете |
ERR_TUNNEL_CONNECTION_FAILED на сайтах с замком | Порт принимает обычные запросы и отклоняет метод CONNECT | Взять порт с разрешённым HTTPS, проверить вкладкой с замком |
| Кнопка «Сохранить» серая | Порт пустой либо в имени хоста осталась схема http:// | Оставить в поле хоста только адрес, порт вписать цифрами |
| Настройка исчезла после переподключения | Сеть была удалена кнопкой «Удалить эту сеть» | Ввести пароль от Wi-Fi заново и заполнить поля посредника |
| Браузер идёт через порт, приложение напрямую | Приложение собрано на своих сокетах и запись платформы не читает | Поднять приложение-клиент с виртуальным интерфейсом либо прогнать на эмуляторе |
| Экран правки сети не открывается | Сеть сохранена, но неактивна, либо на ней висит портал авторизации | Подключиться к сети, пройти портал, затем править профиль |
| Выпадающего списка посредника нет вовсе | Открыт экран сотовой сети, поля посредника там нет | Настроить беспроводную сеть либо перейти к клиенту с туннелем |
| Поля в карточке APN серые | Профиль оператора помечен защищённым от правки | Перейти к клиенту с туннелем, правка APN этой задачи не закрывает |
| Значение из adb перекрывает поля экрана | Записана глобальная настройка, она приоритетнее профиля сети | Снять её командой settings put global http_proxy :0 |
adb: no devices/emulators found | Отладка по USB выключена либо не подтверждён отпечаток компьютера | Включить отладку в меню разработчика, подтвердить окно на экране телефона |
| Эмулятор поднялся со старыми параметрами | Загрузился сохранённый снимок состояния | Добавить ключ -no-snapshot-load либо стереть данные устройства |
Proxy status в Extended controls показывает отказ | Пара логина и пароля не подошла к порту | Сверить третью и четвёртую части строки IP:PORT:LOGIN:PASS |
| Имена сайтов не разрешаются в эмуляторе | Гость взял службу имён у хоста, и она отвечает по-своему | Запустить с ключом -dns-server и публичным адресом службы имён |
| Приложение отдаёт ошибку сертификата | Порт разворачивает HTTPS, а сертификат лежит в пользовательском хранилище | Прописать network_security_config в отладочной сборке |
| Часть трафика идёт мимо при работающем клиенте | Включён режим выбора приложений, нужная программа без галочки | Отметить программу в списке либо перейти в режим захвата всех |
| Пинг проходит без посредника | ICMP через HTTP-порт не идёт по устройству протокола | Проверять доступность запросом по HTTP, не пингом |
Остальные части справочника разбирают ту же задачу на других устройствах: параметры на уровне операционной системы собраны в статье про системные настройки прокси в Windows 11, собственный сетевой стек браузера с профилями описан в материале про параметры соединения в Firefox, правила переключения по доменам разобраны в инструкции про профили расширения SwitchyOmega. Когда с телефона нужно перейти к нескольким изолированным окружениям на компьютере, смотрите разбор настройки прокси в BitBrowser.