Віддалена налагодження за допомогою емулятора 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 із переадресацією портів SSH Putty. Дякую.
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: Підключення -> SSH -> Тунелі

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


Працювали чудово! Дякую за подробиці.
Jim McKeeth

1
Приємно, але я хотів би пояснити: Після кроку 4 ви повинні закрити шпаклівку, а потім на кроці 5 знову відкрити її, налаштувати тунелі та знову підключитися. Етапи 6-8: спочатку запустіть емулятор, потім запустіть adb (у хост-машині). Крок 9: можливо, вам доведеться перезапустити adb на клієнтській машині та ввести adb devices, щоб переконатися, що це нормально. Регулярні DDMS та затьмарення також повинні працювати.
Mister Smith

@MisterSmith Дуже вагомі пункти, чому ви не подаєте редагування? :)
Генрік Хаймбуергер

@MisterSmith Чи можете ви, будь ласка, відредагувати свою відповідь, щоб відобразити цей коментар, який дуже важливий для успіху проблеми. Крім того, дякую, тепер я можу підключитися до мого хосту з моєї гостьової машини.
meanbunny

20

Я усвідомлюю, що це питання справді давнє, але я вирішив проблему дещо інакше, і мені знадобився час, щоб з’ясувати це тривіальне рішення.

Зазвичай я використовую ПК або ноутбук під керуванням 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, щоб ви могли підключити справжній андроїд-пристрій через 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

Чи можна це зробити без встановлення android sdk на System-A? (машина з вікнами?)
Кіт Твомблі

Ні, оскільки сервер adb та usb-драйвери повинні працювати на System-A для зв’язку з пристроєм.
Patrick McKinnon

Я теж зробив це з такою установкою, як: Windows 7 (запуск емулятора) -> Linux (необхідний перехід через мережу ...) -> OS X під керуванням Eclipse. Я бачу пристрої з "пристроями adb" та використовую емулятор від Eclipse. Проблема в тому, що він не розпізнає ціль Android емулятора, тому я повинен обирати ціль під час кожного запуску вручну.
Френк

якщо вам потрібна шпаклівка для Mac OS X, ви можете знайти її тут: mac-tools.org/putty-fur-mac-os-x/02/2012 Для мене вона працювала з цим інструментом.
Bruno Bieri

@PatrickMcKinnon все спрацювало нормально, але на System-B я отримую несанкціонований виклик "пристроїв adb". На System-B "adb devices" показує, що він працює нормально. Будь-яка допомога?
Tejas Sherdiwala

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

У командному рядку cmd запустіть як адміністратор:

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 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 спробуйте "Виконати / Запустити конфігурації ..." та встановіть для Target значення Manual. Це дає вам "вибір пристрою", який, на мою думку, включав би віддалений емулятор, якщо до нього підключений adb. Варто спробувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.