Как сделать ADB через «wifi» (фактически на том же ПК) для эмулируемого устройства

Я пытаюсь использовать adb через «wifi» для своего эмулируемого устройства. Я эмулирую устройство на своем компьютере и хотел использовать Android Studio для отправки на него APK, но через сетевые сокеты, а не через эмулированный USB. Я знаю, что в Android Studio все работает из коробки, но мне нужно, чтобы это было так

Я следую этому руководству: https://developer.android.com/studio/command-line/adb.html#wireless

я начинаю с

~/Android/Sdk/emulator$ ./emulator -avd Pixel_XL_API_27

Потом вижу, что отладка по USB включена. тогда я делаю

./adb tcpip 5555
restarting in TCP mode port: 5555

Обратите внимание, что . /adb tcpip 5555является произвольным. Я даже не указал, какое устройство должно перезагружаться и подключаться на 5555. Что, если бы у меня было запущено 2 эмулятора?

Сейчас я должен отключить обычное USB-устройство, но затем я перехожу к параметрам разработчика в своем эмулируемом телефоне и отключаю отладку по USB.

Я также вижу, что IP-адрес в настройках системы эмулируемого телефона192.168.232.2

то я получаю:

./adb connect 192.168.232.2
unable to connect to 192.168.232.2:5555: Connection timed out

Я также сделал это:

./adb devices 
List of devices attached
emulator-5554   device

./adb connect 192.168.232.2:5554
unable to connect to 192.168.232.2:5554: Connection timed out

ОБНОВИТЬ:

Согласно Android Tutorial on ADB , мой компьютер поддерживает работу сервера на порту 5037. Устройство Android (в данном случае мой эмулятор) запускает демон, а мой сценарий adb в Sdk/platform-tools является клиентом. Если я хочу запустить клиент внутри своей виртуальной машины, на ней должен быть запущен сервер. Но вместо этого я могу просто перенаправить TCP-порт 5037 с виртуальной машины на TCP-порт 5037 хост-машины. Я сделал это с помощью tcptunnel , выполнив следующие действия:

./tcptunnel --local-port=5037 --remote-host=192.168.122.1 --remote-port=5037 --stay-alive

затем, если я запущу adb на своей виртуальной машине, он подключится к демону adb на моем хост-компьютере, который будет взаимодействовать с сервером adb моего эмулятора. Когда я запускаю adb devicesвиртуальную машину без пересылки tcp, она пытается запустить новый сервер. Если я убью этот сервер, открою tcpforwarded и сделаю это снова, он не будет пытаться создать новый сервер. Это хороший сигнал. Однако tcptunnel дает мне это:

build_tunnel: connect(): Connection refused

Что-то блокирует соединение

ОБНОВЛЕНИЕ 2:

Оказывается, tcptunnel не нужен, потому что adbу него есть Hопция, которая позволяет мне указать IP-адрес, на котором работает сервер. Однако я не знаю, возможно ли это указать в Android Studio. В любом случае:

./adb -H 192.168.122.1 devices
List of devices attached
* cannot start server on remote host
error: cannot connect to daemon at tcp:192.168.122.1:5037: Connection refused
Не могли бы вы сказать мне, имеете ли вы дело с физическим устройством или с эмулятором внутри вашей ОС?
@AbdelhafidMadoui это эмулятор в той же ОС
Так что не так, например, с командой adb -s emulator-5554 shell? Почему Wi-Fi?
@AbdelhafidMadoui Мне нужно программировать внутри виртуальной машины. Однако я не могу запустить новый эмулятор внутри этой виртуальной машины. Вместо этого я хочу запустить эмулятор параллельно с виртуальной машиной и передать приложение через TCP.
@GuerlandoOCs: Итак, эмулятор запускается из основной ОС, и вы хотите получить к нему доступ с виртуальной машины? Правильный? Какое программное обеспечение ВМ вы используете?
@AbdelhafidMadoui Я использую virt-manager, он использует kvm со SPICE

Ответы (1)

Я забыл, что демон adb привязан к localhost, и я пытался получить доступ из 192.168.122.x.

Благодаря socatэтому я смог перенаправить клиента ADB с моей виртуальной машины на демон ADB на моем хост-компьютере, который установил соединение с сервером ADB (мой эмулируемый телефон).

Мой хост-компьютер был доступен 192.168.122.1с виртуальной машины, но adb daemonбыл привязан к 127.0.0.1или localhost. Я только что сделал:

#on host machine:
socat tcp-listen:5037,bind=192.168.122.1,reuseaddr,fork tcp:localhost:5037

#on virtual machine:
socat tcp-listen:5037,bind=localhost,reuseaddr,fork tcp:192.168.122.1:5037

Убедитесь, что вы убили сервер adb на виртуальной машине, выполняющей /path/to/android/sdk/platform-tools/adb kill-server. Сервер ADB всегда пытается подключиться, 5037если там ничего нет, поэтому, если socat уже работает с обеих сторон, а adb serverна hostмашине работает, когда вы запускаете студию Android на виртуальной машине, она автоматически подключается к внешнему серверу adb, который подключится к вашему эмулируемому телефону.

Вам не нужна Android Studio на виртуальной машине для тестирования. Вы можете просто сделать это /path/to/android/sdk/platform-tools/adb devicesна виртуальной машине, чтобы увидеть, перенаправит ли socat его демону adb на хосте, который отобразит список эмулируемых телефонов.