Можно ли написать код / скомпилировать Android-приложение на одном компьютере и удаленно отладить его на эмуляторе, запущенном на другом? Я устал от эмулятора, который постоянно съедает половину процессора моего ноутбука.
источник
Можно ли написать код / скомпилировать Android-приложение на одном компьютере и удаленно отладить его на эмуляторе, запущенном на другом? Я устал от эмулятора, который постоянно съедает половину процессора моего ноутбука.
Я ранее не пробовал (и даже не замечал) 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
и я мог использовать его, как если бы он работал на моей локальной машине.
killall adb
тоже нужно это сделать на сервере, потому что эмулятор не будет принимать несколько подключений и будетoffline
для локальной машины.Вот как я решил это в 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, где эмулятор появлялся в разделе виртуальных устройств, как если бы это был локальный эмулятор.источник
Я понимаю, что этот вопрос действительно старый, но я решил проблему несколько иначе, и мне потребовалось время, чтобы найти это тривиальное решение.
Обычно я использую ПК или ноутбук с Windows7 (в зависимости от того, где я работаю) в качестве интерфейса, потому что мне нравится графический интерфейс, однако я предпочитаю выполнять все мое редактирование / компиляцию / отладку на автономном сервере Ubuntu из-за всех возможности командной строки, которые он предоставляет. Моя цель - сделать каждую систему Windows как можно более тонким клиентом без каких-либо дополнительных служб (таких как sshd) или дыр в брандмауэре.
Итак, вот сенарио:
Проблема, описанная ранее, заключается в том, что эмулятор в 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
источник
Я нашел простой способ сделать это, если ваши две машины находятся в одной частной сети и, следовательно, вам не нужно использовать шифрование 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 для обмена машина / машина, но, конечно, вы можете использовать и другие порты, если они еще не используются.
источник
Мое решение для 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>
источник
Ни одно из предложенных решений у меня не помогло. Я начал с решения 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/ Отказ от ответственности, я автор.
источник
Когда вы запускаете 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).
источник
adb -L tcp:remotehost:1234 devices
если да, то вам нужно выяснить, поддерживает ли Android Studio удаленные ADB или нет - меня не удивит, если он будет настаивать на использовании локальные устройства.У меня нет второй машины с SDK под рукой, но я отмечаю, что прослушивающие порты эмулятора (по умолчанию 5554, 5555) прослушиваются
0.0.0.0
, то есть доступны с удаленных машин, и этоadb --help
показываетconnect <host>:<port>
команду. Я предполагаю, что это заставит его появиться,adb devices
поэтомуadb
команды работают над ним. Для Eclipse попробуйте «Run / Run Configurations ...» и установите для Target значение Manual. Это дает вам «выбор устройства», который, как я предполагаю, будет включать удаленный эмулятор, если к нему подключен adb. Стоит попробовать.источник