2009-11-18 5 views
73

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

ответ

56

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

+1

работает как шарм, даже с моей машины Windows 7 с пересылкой портов SSH шлюза. Спасибо. – gsbabil

+0

@gsbabil Какова была команда для Putty SSH? –

+1

@JimMcKeeth: На основании конфигурации сети выше, откройте Putty, перейдите в Connection> SSH> Tunnels. Теперь добавьте запись с Source-port: 5556 и Destination: localhost: 5554. Повторите то же самое с Source-port: 5557 и Destination: localhost: 5555. Ура! – gsbabil

0

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

2

Телефон разработчика дешевле, чем дополнительный компьютер и может быть удален отлажен. У этого есть дополнительное преимущество наличия всех дополнительных датчиков, которые эмулятор не представляет по умолчанию.

Я настоятельно рекомендую приобрести телефон разработчика для тестирования.

18

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

Проблема была в том, что АБР, а также эмулятор просто слушал 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: Connection -> SSH -> Туннели

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

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

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

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

  7. Я перезапустил АБР на машине разработки (adb kill-server, затем adb start-server).

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

+0

Работал отлично! Спасибо за детали. –

+1

Приятно, но я хотел бы уточнить: после шага 4 вам нужно закрыть замазку, затем на шаге 5 снова открыть ее, настроить туннели и снова подключиться. Шаги 6-8: первый эмулятор запуска, затем запустите adb (в хост-машине). Шаг 9: вы можете перезапустить adb на клиентской машине и ввести устройства adb, чтобы убедиться, что все в порядке. Также должны работать регулярные средства DDMS и eclipse. –

+0

@MisterSmith Очень действительные баллы, почему вы не отправляете изменения? :) –

15

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

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

Так вот Senario:

  • System-A: система Windows7 с андроид эмулятор работает
  • System-B: сервер Ubuntu с SDK установлен

Проблема, как описано ранее, что эмулятор на System-A привязывается к localhost, а не к внешнему интерфейсу ethernet, поэтому adb на System-B не может получить доступ к эмулятору на System-A. Все, что вам нужно сделать, это настроить удаленное перенаправление портов в PuTTY для вашего SSH-подключения к System-B. Хитрость заключается в проверке переключателя «Удаленный» при создании двух туннелей, чтобы направление туннеля было отменено (туннелирование с сервера, на который вы входите, на клиента, с которого вы входите).

tunnel screenshot

Наконец, соединиться с ADB на "локальный" на 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 
+0

Есть ли способ сделать это, не установив sdk android на System-A? (Windows-машина?) –

+0

Нет, поскольку для связи с устройством должны быть запущены драйверы сервера adb и usb на System-A. –

+0

Я тоже это сделал с настройкой вроде: Windows 7 (работает эмулятор) -> Linux (требуется хоп, из-за сети ...) -> OS X работает Eclipse. Я могу видеть устройства с помощью «adb devices» и использовать эмулятор от Eclipse. Проблема в том, что он не распознает цель Android эмулятора, поэтому я должен выбрать цель при каждом запуске вручную. – Frank

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 туннельный сервер.

Эти две команды создают два полумоста, которые прослушивают порты 10001 и 10001 и перенаправляют ввод/вывод этих портов на локальные порты 5554 и 5555, которые являются портами, используемыми эмулятором (на самом деле, первый эмулятор - если вы несколько из них, они будут использовать более высокие номера портов, как показано в других ответах на этой странице).

  • На 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

Мое решение для 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> 
0

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

Смежные вопросы