ОбъяснениеОпубликовано: 4 мин чтения

Почему меняется порт отладки по Wi-Fi и как с этим жить

Почему порт «Отладки по Wi-Fi» новый при каждом включении и после перезагрузки, как найти его через adb mdns services и стоит ли закреплять порт 5555.

Порт «Отладки по Wi-Fi» меняется потому, что Android каждый раз выбирает случайный свободный порт, когда вы включаете отладку: после перезагрузки, после смены сети, после ручного выключения и включения. Закрепить его штатными средствами нельзя. Вместо этого телефон объявляет свой текущий порт в локальной сети через mDNS, и adb или приложение могут найти его сами. Если нужен именно постоянный порт, есть обходной путь через adb tcpip 5555, но у него заметные минусы.

Два порта, и оба временные

На экране «Отладка по Wi-Fi» вы видите два разных порта:

ПортГде показанДля чегоСколько живёт
Порт подключенияВверху экрана, «IP-адрес и порт»adb connectПока отладка включена
Порт сопряженияВ окне «Подключить устройство с помощью кода подключения»adb pairПока открыто окно с кодом

Сопряжение нужно один раз, поэтому порт сопряжения обычно никого не волнует. Неудобства доставляет порт подключения: вчерашняя команда adb connect 192.168.1.20:41237 сегодня выдаёт Connection refused.

Зачем Android так делает

Фиксированный известный порт удобен не только вам. Случайный порт, шифрование TLS и сопряжение по коду вместе делают «Отладку по Wi-Fi» заметно безопаснее старого режима adb tcpip, который годами висел на порту 5555. К тому же случайный порт не конфликтует с другими программами. Найти же телефон помогает mDNS: adbd объявляет в сети службу _adb-tls-connect._tcp с текущим портом, а пока открыто окно с кодом, ещё и _adb-tls-pairing._tcp. Так Android Studio находит телефоны без ввода адреса.

Когда именно порт меняется

СобытиеПорт подключенияНужно ли новое сопряжение
Отладку выключили и включилиНовыйНет
Перезагрузка телефонаНовый (и отладку нужно включить заново)Нет
Переход в другую сеть Wi-FiНовый (отладка выключается)Нет
Экран погас, телефон уснулПрежний, если отладка не выключиласьНет
Отозвали авторизации adbНе важноДа

Видно, что сопряжение переживает почти всё, а порт почти ничего. Поэтому любые скрипты и ярлыки с зашитым портом ломаются уже на следующий день, а способы, которые ищут телефон через mDNS, продолжают работать.

Как узнать текущий порт с компьютера

Проще всего посмотреть его на экране «Отладка по Wi-Fi». Если телефон далеко, спросите сеть:

adb mdns check
adb mdns services

Вывод выглядит примерно так:

List of discovered mdns services
adb-R58M123ABC-AbCdEf	_adb-tls-connect._tcp	192.168.1.20:41237

Подключитесь по найденному адресу:

adb connect 192.168.1.20:41237

Свежие версии adb обычно подключаются к уже сопряжённому телефону сами, как только видят его службу в сети, и adb devices показывает его без ручного adb connect. Если adb mdns services ничего не находит, обновите platform-tools и проверьте, что телефон и ПК в одной сети без изоляции клиентов. Некоторые роутеры и корпоративные сети блокируют multicast, и тогда mDNS не работает вовсе.

Можно ли закрепить порт: adb tcpip 5555

Когда телефон уже подключён по Wi-Fi, можно переключить adbd в классический сетевой режим на постоянном порту. Кабель для этого не нужен:

adb -s 192.168.1.20:41237 tcpip 5555
adb connect 192.168.1.20:5555

Телефон может показать запрос «Разрешить отладку?» для нового подключения, примите его. Минусы такого режима:

  • Нет шифрования. Трафик adb tcpip идёт открытым текстом, в отличие от «Отладки по Wi-Fi».
  • Порт 5555 открыт всей сети. Подключиться может любой, чей ключ вы однажды разрешили, и любой, кто уговорит вас нажать «Разрешить».
  • Работает до перезагрузки. После неё режим сбрасывается, и всё начинается заново.
  • IP-адрес тоже может смениться. Если роутер выдаёт адреса динамически, закрепите адрес телефона в настройках DHCP роутера.

В общественных сетях этот режим лучше не использовать. Подробное сравнение в статье adb tcpip или отладка по Wi-Fi.

Отдельно стоит сказать про адрес: даже со случайным портом удобно, когда IP телефона не меняется. Резервирование адреса в роутере решает половину проблемы для любого способа.

Без ПК порт вообще не нужно знать: ADB Kit

ADB Kit подключается к adb самого телефона через «Отладку по Wi-Fi» и номера портов не спрашивает:

  1. При первом сопряжении (вкладка «Главная», «Начать сопряжение») приложение само находит службу сопряжения через mDNS, вам остаётся ввести 6-значный код в уведомлении.
  2. Когда вы снова включаете «Отладку по Wi-Fi», ADB Kit ищет службу подключения в сети и подключается к её новому порту. Ни вводить, ни запоминать его не нужно.
  3. То же самое работает для другого телефона, добавленного через «Добавить телефон»: если его порт сменился, приложение находит телефон заново по имени службы.

Ручной ввод адреса остаётся запасным вариантом («Ввести адрес вручную»), если mDNS в вашей сети заблокирован.

Частые вопросы

Порт поменялся, нужно ли заново сопрягаться? Нет. Сопряжение привязано к ключу устройства, а не к порту. Нужен только новый adb connect.

Можно ли задать свой порт для «Отладки по Wi-Fi»? Штатно нет. Без root остаётся adb tcpip с его минусами.

Почему adb connect по старому порту иногда всё-таки работает? Если вы не выключали отладку и не перезагружали телефон, порт прежний. Он меняется только при новом включении отладки.

Порт на экране один, а adb mdns services показывает другой. Обновите экран «Отладка по Wi-Fi»: вероятно, отладку успели выключить и включить. Верьте свежему значению.