Удаленная отладка с помощью эмулятора Android - PullRequest
85 голосов
/ 18 ноября 2009

Можно ли написать код / ​​скомпилировать приложение Android на одной машине и удаленно отладить его на эмуляторе, запущенном на другой? Я устал от того, что эмулятор постоянно съедает половину процессора моего ноутбука.

Ответы [ 8 ]

66 голосов
/ 19 декабря 2009

Ранее я не пробовал (или даже не заметил) команду adb connect, о которой упоминал cmb, но я могу подтвердить, что переадресация TCP-портов выполняется самостоятельно & mdash; например, через SSH & mdash; отлично работает.

Эмулятор прослушивает два TCP-порта на экземпляр: 5554 для интерфейса telnet и 5555 для управления связью с такими инструментами, как DDMS. Таким образом, вы, вероятно, могли бы обойтись только с портом 5555 переадресации (хотя я до сих пор пробовал только с обоими). Каждый последующий эмулятор принимает следующий доступный чётный + нечетный номер порта (примерно до 5580, я думаю).

Для справки я выполнил следующие действия на своем локальном компьютере:

  • ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
  • killall adb; adb devices

Я полагаю, что эмулятор пытается уведомить локальный сервер ADB при запуске; отсюда необходимость перезапустить adb для того, чтобы он проверял локальные порты 5554+.

Обратите внимание, что localhost в команде ssh относится к локальному интерфейсу удаленного компьютера.

adb devices показал новый эмулятор & mdash; emulator-5554 & mdash; и я мог бы использовать его так, как если бы он работал на моей локальной машине.

20 голосов
/ 08 мая 2010

Вот как я решил это на Windows. Я в значительной степени последовал примеру Кристофера, но я не могу редактировать, поэтому придётся новый ответ.

Проблема, с которой я столкнулся, заключалась в том, что ADB и эмулятор просто слушали 127.0.0.1, а не 0.0.0.0, для меня. В противном случае я бы использовал TCPMon . Я думаю, что это либо отличается от Windows, либо изменилось с последними версиями SDK. (Вы можете проверить с помощью netstat -ban.)

  1. Я установил WinSSHD на машине, на которой запущен эмулятор. (Я полагаю, что это должно работать и с freeSSHd, но я не могу заставить логин работать там.)

  2. Я открыл порт 22 (TCP) в брандмауэре Windows. (WinSSHD может сделать это за вас.)

  3. Я создал виртуальную учетную запись в графическом интерфейсе WinSSHD.

  4. Я создал новое соединение PuTTY от машины разработчика до машины эмулятора и убедился, что могу подключиться.

  5. Затем я установил туннелирование в PuTTY: Соединение -> SSH -> Туннели

    Source port: 5554
    Destination: localhost:5554
    Type: Local/Auto

    Source port: 5555
    Destination: localhost:5555
    Type: Local/Auto

    (Подключите и оставьте PuTTY открытым, чтобы поддерживать туннель.)

  6. Теперь я запустил эмулятор на удаленном компьютере и убедился, что ADB там не работает.

  7. Я перезапустил ADB на компьютере разработчика (adb kill-server, затем adb start-server).

  8. adb devices и удаленный эмулятор отображался как emulator-5554 device. Теперь я мог развернуть и запустить свое приложение прямо из Eclipse / ADT, где эмулятор отображался под виртуальными устройствами, как если бы это был локальный эмулятор.

18 голосов
/ 08 апреля 2011

Я понимаю, что этот вопрос действительно старый, но я решил проблему немного по-другому, и мне потребовалось некоторое время, чтобы найти это тривиальное решение.

Обычно я использую ПК или ноутбук с Windows7 (в зависимости от того, где я работаю) в качестве внешнего интерфейса, потому что мне нравится графический интерфейс, однако я предпочитаю выполнять все мои правки / компиляции / отладки на сервере без Ubuntu, так как всей командной строки, которую он обеспечивает. Моя цель - сделать каждую систему Windows максимально тонким клиентом без каких-либо дополнительных служб (таких как sshd) или дыр в брандмауэре.

Так вот сенарио:

  • Система A: система Windows7 с запущенным эмулятором Android
  • System-B: сервер Ubuntu с установленным SDK

Проблема, как описано ранее, заключается в том, что эмулятор в System-A привязывается к локальному узлу, а не к внешнему интерфейсу 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 и загружать на него изображения из System-B. Чтобы это работало, перед началом сеанса SSH необходимо убедиться, что сервер adb работает в System-A, а не в System-B:

Сначала запустите сервер 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
5 голосов
/ 25 августа 2011

Я нашел простой способ сделать это, если ваши две машины находятся в одной частной сети и поэтому не нуждаются в шифровании 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 Client .

Эти команды создают недостающие полумосты. Они прослушивают локальные порты 5554 и 5555 и перенаправляют ввод / вывод этих портов на полумосты, которые мы создали на HostEmulator непосредственно перед этим.

  • Затем, все еще на HostEclipse , введите эти три команды :

    adb kill-server
    adb start-server
    adb devices
    

Это перезапускает adb, так как в противном случае он не обнаруживает удаленный эмулятор. Он должен делать некоторые проверки при запуске. А затем он перечисляет устройства (доступные эмуляторы) только для проверки.

  • И вот, пожалуйста.

Вы можете работать с удаленным эмулятором, как если бы он был локальным. Вы должны держать терминалы Cygwin открытыми на обеих машинах, иначе вы убьете созданные вами полумосты.

Я использовал порты 10000 и 10001 для обмена машинами / машинами здесь, но, конечно, вы можете использовать другие порты, если они еще не используются.

2 голосов
/ 05 июня 2013

Мое решение для Windows + AndroVM (для которого требуется адаптер только для хоста), когда моя служба ssh не запустилась. поэтому не требует никакого дополнительного программного обеспечения.

adb connect <Andro VM IP>
adp tcpip 555

В командной строке cmd запускается от имени администратора:

netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>

открыть TCP-порт 5555 в брандмауэре Windows.

Затем со второго компьютера запустите:

adb connect <host ip>
1 голос
/ 21 июня 2018

Когда вы запускаете 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).

1 голос
/ 02 октября 2016

Ни одно из предложенных решений не сработало для меня. Я начал с решения 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/ Отказ от ответственности, я автор.

0 голосов
/ 18 ноября 2009

У меня нет второй машины с SDK под рукой, но я отмечаю, что порты прослушивания эмулятора (по умолчанию 5554, 5555) прослушивают на 0.0.0.0, то есть достижимы с удаленных машин, и что adb --help показывает connect <host>:<port> команда. Я предполагаю, что это заставило бы его появиться в adb devices, так что adb команды работают над ним. Для Eclipse попробуйте «Run / Run Configurations ...» и установите Target на Manual. Это дает вам «устройство выбора», которое, я предполагаю, будет включать удаленный эмулятор, если к нему подключен adb. Стоит попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...