Удаленная отладка с эмулятором Android
Можно ли написать код/компилировать приложение Android на одном компьютере и отлаживать его удаленно на эмуляторе, запущенном на другом компьютере? Я устал от эмулятора, постоянно ем половину моего ноутбука.
Ответы
Ответ 1
Я ранее не пробовал (или даже не замечал) команду adb connect
, упомянутую выше cmb, но могу подтвердить, что переадресация портов TCP самостоятельно и— таких как SSH — отлично работает.
Эмулятор прослушивает два порта TCP для каждого экземпляра: 5554 для интерфейса telnet и 5555 для управления связью с такими инструментами, как DDMS. Таким образом, вы, вероятно, могли бы уйти только с переадресацией порта 5555 (хотя я только пробовал его до сих пор с обоими). Каждый последующий эмулятор принимает следующий доступный кортеж с четным + нечетным номером порта (думаю, примерно до 5580).
Для справки, я сделал следующие шаги на моей локальной машине:
-
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 [email protected]
-
killall adb; adb devices
Я считаю, что эмулятор пытается оповестить локальный сервер adb при запуске; следовательно, необходимо перезапустить adb, чтобы он мог исследовать локальные порты 5554+.
Обратите внимание, что localhost
в команде ssh ссылается на локальный интерфейс удаленной машины.
adb devices
появился новый эмулятор -— emulator-5554
— и я мог бы использовать его, как если бы он работал на моей локальной машине.
Ответ 2
Вот как я решил это в Windows. Я в значительной степени следовал примеру Кристофера, но я не могу редактировать, поэтому новый ответ должен будет сделать.
Проблема была в том, что ADB, а также эмулятор просто слушал 127.0.0.1, а не 0.0.0.0, для меня. В противном случае я бы использовал TCPMon. Я предполагаю, что это либо отличается от Windows, либо изменилось с последними версиями SDK. (Вы можете проверить с помощью netstat -ban
.)
-
Я установил WinSSHD на компьютере, на котором запущен эмулятор. (Я считаю, что он должен работать и с freeSSHd, но я не мог получить там вход в систему.)
-
Я открыл порт 22 (TCP) в брандмауэре Windows. (WinSSHD может это сделать для вас.)
-
Я создал виртуальную учетную запись в графическом интерфейсе WinSSHD.
-
Я создал новое соединение PuTTY с машины разработки на машину эмулятора и убедился, что могу подключиться.
-
Затем я настроил туннелирование в PuTTY: Connection → SSH → Tunnels
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(Подключите и удерживайте PuTTY открытым, чтобы поддерживать туннель.)
-
Теперь я активировал эмулятор на удаленном компьютере и убедился, что ADB там не работает.
-
Я перезапустил ADB на машине разработки (adb kill-server
, затем adb start-server
).
-
adb devices
, а удаленный эмулятор появился как emulator-5554 device
. Теперь я мог развертывать и запускать свое приложение прямо из Eclipse/ADT, где эмулятор появился под виртуальными устройствами, как если бы это был локальный эмулятор.
Ответ 3
Я понимаю, что этот вопрос действительно старый, но я решил проблему немного по-другому, и мне потребовалось некоторое время, чтобы выяснить это тривиальное решение.
Обычно я использую ПК или ноутбук Windows7 (в зависимости от того, где я работаю) как мой интерфейс, потому что мне нравится графический интерфейс, однако я предпочитаю делать все свое редактирование/компиляцию/отладку на безголовом сервере Ubuntu, всей предоставляемой им командной строки. Моя цель - сделать каждую систему Windows максимально возможной для тонкого клиента без каких-либо дополнительных сервисов (например, sshd) или отверстий брандмауэра.
Итак, вот сенарио:
- Система-A: система Windows7 с эмулятором Android.
- System-B: сервер Ubuntu с установленным SDK
Проблема, описанная ранее, заключается в том, что эмулятор в System-A привязывается к localhost, а не к внешнему интерфейсу ethernet, поэтому adb на System-B не может получить доступ к эмулятору в System-A. Все, что вам нужно сделать, это настроить удаленное перенаправление портов в PuTTY для вашего SSH-соединения с System-B. Фокус в том, чтобы проверить переключатель "Remote" при создании двух туннелей, чтобы направление туннеля было отменено (туннелирование с сервера, на который вы входите, на клиента, с которого вы входите).
![tunnel screenshot]()
Наконец, подключитесь с adb к "localhost" в System-B после установления соединения SSH:
System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555 device
Теперь вы можете загружать изображения/отладки как обычно, и тривиально переходить на другую систему Windows, если вы хотите вытащить свой ноутбук и получить кофе.
Кроме того, путем туннелирования порта 5037 таким же образом вы можете перенаправить ваше соединение с сервером adb, чтобы вы могли подключить реальное устройство Android через USB на System-A и загрузить изображения из системы-B. Чтобы это работало, вам необходимо убедиться, что сервер adb работает в System-A и не запускается в System-B перед началом сеанса SSH:
Сначала запустите сервер adb в System-A (командная строка)
C:\> adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
C:\> adb devices
List of devices attached
3435F6E6035B00EC device
Затем уничтожьте сервер adb на System-B
System-B$ adb kill-server
Наконец, перезапустите сеанс ssh в System-B и проверьте
System-B$ adb devices
List of devices attached
3435F6E6035B00EC device
Ответ 4
Я нашел простой способ сделать это, если ваши две машины находятся в одной и той же частной сети и поэтому не нужно использовать SSH-шифрование (что является обычным делом). Это может помочь, поскольку туннель SSH может быть довольно длинным и сложным в установке. Например, установка демона SSH под Cygwin/Windows в первый раз может привести к сдаче (ну, я сдался).
В Windows, для чего требуется, чтобы Cygwin установил пакет httptunnel. Это также должно работать под Linux/httptunnel, но я не пытался.
-
Запустите эмулятор на одной из машин (пусть его имя хоста - HostEmulator)
-
Запустите Eclipse на другом компьютере (позвоните ему HostEclipse)
-
Откройте терминал Cygwin на каждом компьютере, а затем
-
В HostEmulator введите следующие команды cygwin:
hts -F localhost:5554 10000
hts -F localhost:5555 10001
hts означает Http Tunnel Server.
Эти две команды создают два полумоста, которые прослушивают порты 10001 и 10001 и перенаправляют ввод/вывод этих портов на локальные порты 5554 и 5555, которые являются портами, используемыми эмулятором (фактически, первый lauched emulator - если вы используете несколько из них, они будут использовать более высокие номера портов, как видно из других ответов этой страницы).
htc означает клиент Http Tunnel.
Эти команды создают недостающие полумосты. Они слушают локальные порты 5554 и 5555 и перенаправляют ввод/вывод этих портов на полумосты, которые мы создали на HostEmulator как раз перед этим.
-
Затем, еще в HostEclipse, введите эти три команды:
adb kill-server
adb start-server
adb devices
Это перезапускает adb, поскольку в противном случае он не обнаруживает удаленный эмулятор. При запуске он должен выполнять сканирование. И затем он перечисляет устройства (доступные эмуляторы) только для проверки.
Вы можете работать с вашим удаленным эмулятором, как если бы он был локальным.
Вы должны держать терминалы Cygwin открытыми на обеих машинах, иначе вы бы убили половинные мосты, которые вы создали.
Я использовал порты 10000 и 10001 для обмена машиной/машиной здесь, но, конечно, вы можете использовать другие порты, если они еще не используются.
Ответ 5
Телефон разработчика дешевле, чем дополнительный компьютер, и может быть удален извне. У этого есть дополнительное преимущество наличия всех дополнительных датчиков, которые эмулятор не показывает по умолчанию.
Я настоятельно рекомендую приобрести телефон разработчика для тестирования.
Ответ 6
Мое решение для Windows + AndroVM (для которого требуется адаптер только для хоста), когда моя служба ssh не запускалась. поэтому он не требует дополнительного программного обеспечения.
adb connect <Andro VM IP>
adp tcpip 555
В командной строке cmd запускается как admin:
netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>
открыть TCP-порт 5555 в брандмауэре Windows.
Затем со второго запуска ПК:
adb connect <host ip>
Ответ 7
Ни один из предлагаемых решений не работал у меня.
Я начал с решения Emirikol и уточнил его, так как в новом Android API > 21 эмулятор появился в автономном режиме, и мне пришлось перейти в настройки Genymotion и оставить путь Android SDK пустым.
И из командной строки:
netsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>
netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>
источник: http://www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/
Отказ от ответственности, я автор.
Ответ 8
У меня нет второй машины с SDK, но я замечаю, что порты прослушивания эмулятора (по умолчанию 5554, 5555) прослушиваются на 0.0.0.0
, т.е. доступны с удаленных компьютеров и что adb --help
показывает a connect <host>:<port>
. Я предполагаю, что он будет отображаться в adb devices
, поэтому на нем будут работать команды adb
. Для Eclipse попробуйте "Run/Run Configurations..." и установите Target to Manual. Это дает вам "выбор устройства", который, как я предполагаю, будет включать в себя удаленный эмулятор, если к нему подключен adb. Стоит попробовать.
Ответ 9
Когда вы запускаете adb, он запускает серверную копию, если она еще не запущена. Вы можете запустить это копирование на машине вместе с устройством, и, начиная с SDK 4.3, вы можете дать ему опцию -a, чтобы указать серверу прослушивать удаленные машины. Сделайте это с помощью следующей команды, которая не завершается:
сервер adb -a -P 5037 nodaemon
На машине, с которой вы хотите использовать устройство, задайте для ADB_SERVER_SOCKET значение tcp: xxxx: 5037 в переменной среды (или присвойте одинаковое значение каждому вызову adb с опцией -L), где xxxx - это IP-адрес или имя хоста машина с устройствами, а 5037 соответствует порту, который вы указали в приведенной выше команде.
Мы используем это для предоставления доступа к примерно 100 эмуляторам, распределенным по 3 машинам, к машине, выполняющей сквозные тесты параллельно, и к разработчикам, желающим обмениваться реальными устройствами удаленно.
Вы можете перенаправлять порты в эмулятор и обратно с помощью adb forward и adb reverse, и они будут отображаться на машине с устройствами (а не на машине, с которой вы запускаете adb forward).