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

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


person zakovyrya    schedule 18.11.2009    source источник


Ответы (9)


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

person Christopher Orr    schedule 19.12.2009
comment
работает как шарм, даже с моей машины с Windows 7 с переадресацией портов Putty SSH. Спасибо. - person gsbabil; 20.06.2012
comment
@JimMcKeeth: Основываясь на приведенной выше конфигурации сети, откройте Putty, перейдите в «Подключение» > «SSH» > «Туннели». Теперь добавьте запись с Source-port: 5556 и Destination: localhost:5554. Повторите то же самое с исходным портом: 5557 и назначением: localhost: 5555. Ваше здоровье! - person gsbabil; 30.07.2013
comment
Просто помните, что вам также нужно killall adb на сервере, потому что эмулятор не будет принимать множественные подключения и будет offline для локальной машины. - person Henrique de Sousa; 17.03.2016
comment
Кто-нибудь может объяснить это по-английски? - person Anil GR; 02.12.2019

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

person Henrik Heimbuerger    schedule 08.05.2010
comment
Хорошо, но я хотел бы уточнить: после шага 4 вы должны закрыть шпатлевку, затем на шаге 5 снова открыть ее, настроить туннели и переподключиться. Шаги 6-8: сначала запустите эмулятор, затем запустите adb (на хост-компьютере). Шаг 9: вы можете перезапустить adb на клиентском компьютере и ввести adb devices, чтобы убедиться, что все в порядке. Обычные DDMS и eclipse тоже должны работать. - person Mister Smith; 14.04.2014
comment
@MisterSmith Очень важные моменты, почему бы вам не отправить редактирование? :) - person Henrik Heimbuerger; 14.04.2014
comment
@MisterSmith Не могли бы вы отредактировать свой ответ, чтобы отразить этот комментарий, это очень важно для решения проблемы. Кроме того, спасибо, теперь я могу подключиться к моему хосту с моей гостевой машины. - person meanbunny; 02.07.2015

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

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

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

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

Проблема, описанная ранее, заключается в том, что эмулятор в Системе-А привязывается к локальному хосту, а не к внешнему интерфейсу Ethernet, поэтому adb в Системе-В не может получить доступ к эмулятору в Системе-А. Все, что вам нужно сделать, это настроить перенаправление удаленных портов в 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 в Системе-A и загрузить на него изображения из Системы-B. Чтобы это работало, вам нужно убедиться, что сервер adb работает в Системе-A, а не в Системе-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
person Patrick McKinnon    schedule 08.04.2011
comment
Есть ли способ сделать это без установки Android SDK на System-A? (Windows-машина?) - person Keith Twombley; 26.09.2011
comment
Нет, потому что сервер adb и драйверы USB должны быть запущены в System-A для связи с устройством. - person Patrick McKinnon; 21.11.2011
comment
Я сделал это тоже с такой настройкой, как: Windows 7 (работает эмулятор) -> Linux (требуется прыжок из-за сети...) -> OS X с Eclipse. Я могу видеть устройства с «устройствами adb» и использовать эмулятор от Eclipse. Проблема в том, что он не распознает цель Android эмулятора, поэтому я должен выбирать цель при каждом запуске вручную. - person Frank; 02.07.2012
comment
если вам нужна замазка для Mac OS X, вы можете найти ее здесь: mac-tools.org/putty-fur-mac-os-x/02/2012 У меня это сработало с этим инструментом. - person Bruno Bieri; 29.06.2013
comment
@PatrickMcKinnon, все работало нормально, но в System-B я получаю несанкционированный доступ при вызове устройств adb. На устройствах System-B adb показывает, что все работает нормально. Любая помощь? - person Tejas Sherdiwala; 31.08.2017
comment
@Tejas, у меня такая же проблема - person redbeam_; 02.04.2018

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

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

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

    adb kill-server
    adb start-server
    adb devices
    

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

  • И вот.

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

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

person Shlublu    schedule 24.08.2011

Мое решение для 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>
person Emirikol    schedule 05.06.2013

Когда вы запускаете adb, он запускает свою серверную копию, если она еще не запущена. Вы можете запустить эту копию самостоятельно на машине с устройством, а начиная с sdk 4.3, вы можете указать параметр -a, чтобы сервер прослушивал удаленные машины. Сделайте это с помощью следующей команды, которая не завершается:

adb -a -P 5037 сервер нодамон

На машине, с которой вы хотите использовать устройство, установите для ADB_SERVER_SOCKET значение tcp:xxxx:5037 в переменной среды (или задайте одно и то же значение для каждого вызова adb с параметром -L), где xxxx — это IP-адрес или имя хоста машина с устройствами, а 5037 соответствует порту, который вы указали в приведенной выше команде.

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

Вы можете перенаправлять порты в эмулятор и из него с помощью adb forward и adb reverse, и они появятся на машине с устройствами (а не на машине, с которой вы запускаете «adb forward»).

person android.weasel    schedule 21.06.2018
comment
Можете ли вы предоставить более подробную информацию об этом решении? Я сделал все, что вы сказали, но у меня нет ни одного устройства в Select Deployment Target в Android Studio. Я использую Genymotion на втором компьютере. - person konstantin_doncov; 24.10.2018
comment
@don-prog Вы не говорите, работает ли это для вас из командной строки: adb -L tcp:remotehost:1234 devices Если да, то вам нужно выяснить, поддерживает ли Android Studio удаленные ADB или нет - меня не удивит, если он будет настаивать на с помощью локальных устройств. - person android.weasel; 11.12.2018

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

person Sarpe    schedule 02.10.2016
comment
Идеальный ответ и статья! Если вы используете Genymotion, используйте это решение. В статье написано про Windows и Mac, но у меня локальная Ubuntu и удаленная Ubuntu и все работает нормально. Спас мою неделю! - person konstantin_doncov; 19.11.2018

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

person Chris Boyle    schedule 18.11.2009

Эмуляторы Android по умолчанию прослушивают локальный порт 5555, поэтому один из способов подключения к удаленному эмулятору — использование инструмента переадресации портов для пересылки всех пакетов локальной сети на локальный порт 5555.

Одним из таких превосходных инструментов является Trivial Port Forward.

Вот команда:

trivial_portforward.exe 1234 127.0.0.1 5555

Здесь 1234 — это номер порта, к которому будет подключаться компьютер разработки. 127.0.0.1 — адрес обратной связи, а 5555 — порт эмулятора.

Более подробный пример см. в моем блоге.

person Amit Mittal    schedule 09.02.2021