adb создавался для USB-кабеля, а позже для локальной сети. Через интернет он тоже работает, и многие команды на это полагаются: CI-раннер в одном регионе общается с телефонами в другом, разработчик из дома дотягивается до офисной стойки, набор тестов управляет облачными телефонами. Но настройки по умолчанию рассчитаны на доверенную сеть. Ошибитесь в настройке, и отладочный мост станет удалённой оболочкой для любого, кто его найдёт.
В этом гайде разберём, как общается adb, четыре безопасных способа протянуть его через интернет с точными командами и чек-лист, который держит его закрытым.
Как общается adb
Участвуют три компонента. Клиент adb — это команда, которую вы вводите. Сервер adb — фоновый процесс на той же машине, который слушает 127.0.0.1:5037 и следит за устройствами. adbd — демон на телефоне. Сервер подключается к adbd по USB, по обычному TCP после adb tcpip или по TLS через беспроводную отладку на Android 11 и новее.
Работать удалённо значит протянуть одно из этих звеньев через интернет: от клиента к серверу или от сервера к adbd. Какое звено вы растягиваете, такой и способ.
Картину безопасности определяют два факта. adbd один раз просит пользователя подтвердить RSA-ключ каждого компьютера, и это не пускает чужих, которых телефон никогда не видел. Но классический режим TCP ничего не шифрует: вывод shell, logcat и каждый файл, который вы отправляете, идут открытым текстом.
Чего не делать никогда
Не пробрасывайте порты 5555 и 5037 в интернет на роутере и не открывайте их в облачном файрволе. В 2018 году червь, известный как ADB.Miner, распространялся по Android-устройствам с открытым adb на порту 5555, в основном по ТВ-приставкам, и превращал их в майнеры криптовалюты. Сканеры постоянно ищут открытые порты adb.
Не запускайте сервер adb с ключом -a: так он слушает все интерфейсы. Любой, кто доберётся до этого порта, управляет всеми устройствами на хосте, и никакого диалога подтверждения ключа не будет.
Способ 1: SSH-туннель к удалённому серверу adb
Подходит, когда телефоны подключены по USB к хосту, на который у вас есть SSH: офисная стойка, лабораторная машина, CI-сервер. Пробросьте локальный порт на adb-сервер хоста и направьте на него клиента:
ssh -N -L 15037:127.0.0.1:5037 user@lab-host adb -P 15037 devices ADB_SERVER_SOCKET=tcp:127.0.0.1:15037 adb -s SERIAL logcat -d
Берите локальный порт, отличный от 5037, чтобы ваш собственный adb-сервер не конфликтовал с туннелем. Установка, push, shell и logcat работают, потому что клиент гонит всё через своё подключение к серверу.
Один сюрприз: adb forward теперь открывает порт на лабораторном хосте, а не на вашем ноутбуке. Чтобы достать проброшенный порт со своей машины, добавьте для него второй -L в команду SSH.
SSH даёт ключи и шифрование, которым вы уже доверяете, а один туннель покрывает целую полку. Цена — хост, который нужно держать, и учётная запись на нём, причём любой с этой учётной записью управляет всеми подключёнными телефонами.
Способ 2: SSH-туннель к adbd
Подходит, когда телефон находится в сети, куда можно попасть через jump-хост, а USB-доступа ни к одной машине там нет. Один раз переведите телефон в режим TCP по USB или через беспроводную отладку, затем пробросьте туннель:
adb tcpip 5555 ssh -N -L 15555:192.168.1.50:5555 user@jump-host adb connect 127.0.0.1:15555
Выбирайте локальный порт вне диапазона от 5555 до 5585, потому что adb-сервер считает локальные порты из этого диапазона эмуляторами. Телефон должен оставаться в режиме TCP, а большинство сборок сбрасывают его после перезагрузки, и при первом подключении на телефоне всё равно появится диалог ключа, так что кому-то придётся один раз его подтвердить.
Способ 3: беспроводная отладка через VPN
В Android 11 появилась беспроводная отладка: сопряжение по коду, затем соединение по TLS. Она рассчитана на локальную сеть, но работает и через VPN вроде WireGuard или Tailscale, если ноутбук и телефон видят приватные адреса друг друга. Включите «Отладку по Wi-Fi» в параметрах разработчика, выберите сопряжение по коду и выполните:
adb pair 100.64.0.12:37099 adb connect 100.64.0.12:41235
adb pair попросит шестизначный код. Порт сопряжения и порт подключения разные, и оба меняются, когда беспроводную отладку выключают и включают. Обнаружение через mDNS через большинство VPN не проходит, поэтому вводите адрес, который показывает телефон. Кроме того, настройка выключается сама, когда телефон уходит из своей сети Wi-Fi, так что для работы без присмотра она подходит плохо.
Способ 4: реле облака устройств
Облака устройств ставят перед adbd реле и дают каждому телефону свой адрес. Детали зависят от провайдера. Вот как реле устроено в Clousd по документации по ADB:
- ADB по умолчанию выключен. Вы включаете его для каждого телефона со списком разрешённых адресов: до 20 IP или диапазонов.
- Доступ истекает сам: по умолчанию через 24 часа, максимум через 7 дней. Неактивные сессии закрываются через 30 минут.
- Вход выполняется по одноразовому коду, который показывается один раз. Неверные коды закрывают сессию, а повторные ошибки выключают реле.
- Root, remount, reverse, reboot и похожие команды всегда отклоняются, а каждая сессия записывается в журнал.
adb connect HOST:PORT adb -s HOST:PORT shell clousd-login CODE adb -s HOST:PORT install app-debug.apk adb -s HOST:PORT logcat -d
Ничего не нужно держать у себя и ничего не нужно открывать в своей сети. Цена в том, что несколько команд недоступны. Сценариям, которые полагаются на adb reverse, например приложению на React Native, которое ходит к серверу Metro на вашем ноутбуке, нужен другой путь, скажем, dev-сервер, до которого телефон дотягивается по URL. Если у вас вообще нет железа, к которому нужно подключаться, удалённый Android-телефон в облаке сразу идёт с реле перед ним.
Четыре способа в сравнении
| SSH к серверу adb | SSH к adbd | Беспроводная отладка через VPN | Реле облака устройств | |
|---|---|---|---|---|
| Где телефон | по USB на хосте, который вы контролируете | в сети за jump-хостом | в сети, куда достаёт ваш VPN | в дата-центре провайдера |
| Что вы обслуживаете | хост и доступ по SSH | jump-хост и режим TCP | VPN и телефон в Wi-Fi | ничего |
| Контроль доступа | SSH-ключи | SSH-ключи плюс ключ adb | VPN плюс сопряжение | список адресов, срок действия, одноразовый код |
| Переживает перезагрузку телефона | да | обычно нет | нет | да |
adb reverse | да | да | да | часто отклоняется |
| Подходит для | офисных стоек, CI-хостов | разового доступа в лабораторию | личного телефона | команд и CI без железа |
Задержка и пропускная способность
adb болтлив, но к расстоянию терпим. Интерактивным adb shell можно пользоваться при задержке 200 мс туда и обратно, а logcat передаётся без проблем. Установка и push упираются в скорость вашей отдачи, поэтому APK на 150 МБ по медленному домашнему каналу заливается минутами.
Больше всего страдают инструментальные тесты, потому что каждое действие в интерфейсе ждёт ответа. Поднимите таймауты и замените фиксированные sleep на ожидание условия, а не удлиняйте sleep. Для зеркалирования экрана через scrcpy в SSH-туннеле снизьте битрейт и размер командой scrcpy --video-bit-rate=2M --max-size=1024. У облачного телефона эту работу обычно делает экран в браузере.
Удалённое тестирование на Android-устройствах в CI
Задача CI, которая тестирует на удалённых телефонах, состоит из четырёх шагов: подключиться, дождаться устройства, прогнать тесты, отключиться. Добавьте шаг входа, если он есть у вашего реле.
adb connect "$DEVICE" adb -s "$DEVICE" wait-for-device adb -s "$DEVICE" install -r app-debug.apk adb -s "$DEVICE" install -r app-debug-androidTest.apk adb -s "$DEVICE" shell am instrument -w com.example.app.test/androidx.test.runner.AndroidJUnitRunner adb disconnect "$DEVICE"
Храните адреса устройств и коды входа в секретах CI, а не в репозитории. Как тот же прогон выглядит через REST API, показано на странице о тестировании приложений, а smoke-проход и команды logcat подробно разобраны в гайде о тестировании Android-приложения онлайн. Если вы решаете, держать ли собственную стойку вообще, загляните в статью о ферме Android-устройств.
Чек-лист безопасности
- Никогда не открывайте порты 5037 и 5555 в интернет.
- Относитесь к
~/.android/adbkeyкак к учётным данным. Это ваша личность для каждого телефона, который ему доверился, так что не копируйте его на общие машины. - На лабораторных телефонах время от времени отзывайте авторизации USB-отладки в параметрах разработчика.
- Выбирайте доступ, который истекает сам и ограничен известными адресами.
- Закончив, отключайтесь и останавливайте сервер командами
adb disconnectиadb kill-server, а беспроводную отладку выключайте. - Ведите учёт, кто, когда и к какому телефону подключался.


