Чи можна написати код / скомпілювати додаток 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: Підключення -> SSH -> Тунелі
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, щоб ви могли підключити справжній андроїд-пристрій через USB на System-A та завантажувати на нього зображення з System-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
Я знайшов простий спосіб зробити це, якщо ваші дві машини перебувають в одній приватній мережі, і тому їм не потрібно використовувати шифрування 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
У командному рядку cmd запустіть як адміністратор:
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 спробуйте "Виконати / Запустити конфігурації ..." та встановіть для Target значення Manual. Це дає вам "вибір пристрою", який, на мою думку, включав би віддалений емулятор, якщо до нього підключений adb. Варто спробувати.