Удаленная отладка с эмулятором 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 - если вы используете несколько из них, они будут использовать более высокие номера портов, как видно из других ответов этой страницы).

  • В HostEclipse введите эти:

    htc -F 5554 HostEmulator:10000
    htc -F 5555 HostEmulator:10001
    

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).