Удаленная отладка с помощью эмулятора Android

94

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

заковыря
источник

Ответы:

72

Я ранее не пробовал (и даже не замечал) adb connectкоманду, упомянутую в cmb, но могу подтвердить, что перенаправление TCP-портов самостоятельно - например, через SSH - работает нормально.

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

Кристофер Орр
источник
1
работает как шарм, даже с моей машины Windows 7 с перенаправлением портов Putty SSH. Спасибо.
gsbabil
1
@JimMcKeeth: в зависимости от конфигурации сети, описанной выше, откройте Putty, перейдите в Connection> SSH> Tunnels. Теперь добавьте запись с Source-port: 5556 и Destination: localhost: 5554. Повторите то же самое с Source-port: 5557 и Destination: localhost: 5555. Ура!
gsbabil
5
Просто помните, что вам killall adbтоже нужно это сделать на сервере, потому что эмулятор не будет принимать несколько подключений и будет offlineдля локальной машины.
Энрике де Соуза
Кто-нибудь может объяснить это по-английски?
Anil GR
21

Вот как я решил это в 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: Connection -> SSH -> Tunnels

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

Хенрик Хеймбюргер
источник
Сработало отлично! Спасибо за подробности.
Джим МакКит
1
Хорошо, но я хотел бы уточнить: после шага 4 вам нужно закрыть шпатлевку, затем на шаге 5 снова открыть ее, настроить туннели и повторно подключиться. Шаги 6-8: сначала запустите эмулятор, затем запустите adb (на хост-машине). Шаг 9: вы можете перезапустить adb на клиентском компьютере и ввести adb devices, чтобы убедиться, что все в порядке. Обычные DDMS и eclipse тоже должны работать.
Мистер Смит
@MisterSmith Очень важные моменты, почему бы вам не отправить правку? :)
Henrik Heimbuerger
@MisterSmith Не могли бы вы отредактировать свой ответ, чтобы отразить этот комментарий, это очень важно для успеха проблемы. Кроме того, спасибо, теперь я могу подключиться к моему хосту с моей гостевой машины.
meanbunny 02
21

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

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

Итак, вот сенарио:

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

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

скриншот туннеля

Наконец, подключитесь с помощью 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 работает в системе-A, а не в системе-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
Патрик Маккиннон
источник
Есть ли способ сделать это без установки android sdk в System-A? (машина Windows?)
Кейт Твомбли
Нет, потому что сервер adb и драйверы USB должны быть запущены в System-A для связи с устройством.
Патрик Маккиннон
Я тоже сделал это с такой настройкой, как: Windows 7 (работает эмулятор) -> Linux (требуется переход, из-за сети ...) -> OS X с Eclipse. Я могу видеть устройства с adb devices и использовать эмулятор из Eclipse. Проблема в том, что он не распознает цель эмулятора Android, поэтому я должен выбирать цель при каждом запуске вручную.
Фрэнк
если вам нужна шпатлевка для Mac OS X, вы можете найти ее здесь: mac-tools.org/putty-fur-mac-os-x/02/2012 Для меня это сработало с этим инструментом.
Bruno Bieri
@PatrickMcKinnon, все работало нормально, но на System-B я получаю несанкционированный доступ при вызове "adb devices". На System-B "adb devices" показывает как работает нормально. Любая помощь?
Теджас Шердивала
6

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

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

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

htc означает клиент туннеля HTTP .

Эти команды создают недостающие полумосты. Они прослушивают локальные порты 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

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

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

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

Затем со второго ПК запускаем:

adb connect <host ip>
Эмирикол
источник
1

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

Сарпе
источник
Прекрасный ответ и статья! Если вы используете Genymotion, воспользуйтесь этим решением. Статья написана о Windows и Mac, но у меня есть локальная Ubuntu и удаленная Ubuntu, и все работает нормально. Спас мою неделю!
konstantin_doncov
1

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

android.weasel
источник
Не могли бы вы подробнее рассказать об этом решении? Я сделал все, что вы сказали, но у меня нет устройства в разделе «Выбор цели развертывания» в Android Studio. На втором компьютере использую Genymotion.
konstantin_doncov
@ don-prog Вы не говорите, работает ли это для вас из командной строки: adb -L tcp:remotehost:1234 devicesесли да, то вам нужно выяснить, поддерживает ли Android Studio удаленные ADB или нет - меня не удивит, если он будет настаивать на использовании локальные устройства.
android.weasel
0

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

Крис Бойл
источник