Czy można napisać kod/skompilować aplikację Android na jednym komputerze i zdalnie przeprowadzić debugowanie na emulatorze uruchomionym na innym? Jestem chory i zmęczony emulatorem, ciągle jedzącym połowę procesora mojego laptopa.Zdalne debugowanie za pomocą emulatora Androida
Odpowiedz
Nie próbowałem (ani nawet nie zauważyłem) polecenia adb connect
wymienionego cmb, ale mogę potwierdzić, że przekazywanie portów TCP samemu —, takie jak ponad SSH — działa dobrze.
Emulator nasłuchuje na dwóch portach TCP na wystąpienie: 5554 dla interfejsu telnet i 5555 dla komunikacji kontrolnej z narzędziami takimi jak DDMS. Więc prawdopodobnie mógłbyś uciec tylko z portem 5555 do przesyłania dalej (chociaż do tej pory próbowałem go tylko z obydwoma). Każdy kolejny emulator pobiera następną dostępną krotkę numeru + nieparzystego numeru portu (do około 5580, jak sądzę).
Dla porównania, zrobiłem następujące kroki na moim komputerze lokalnym:
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 [email protected]
killall adb; adb devices
wierzę emulator próbuje powiadomić lokalny serwer adb przy starcie; stąd potrzeba zrestartowania adb w celu sprawdzenia lokalnych portów 5554+.
Należy zauważyć, że localhost
w komendzie ssh odnosi się do lokalnego interfejsu urządzenia zdalnej.
adb devices
pokazał nowy emulator — emulator-5554
— i mogę go używać tak, jakby były uruchomione na moim komputerze lokalnym.
nie mam drugą maszynę z SDK do ręki, ale pamiętać, że słuchają porty emulatora (domyślnie 5554, 5555) słuchają na 0.0.0.0
, tj osiągalny z urządzeń zdalnych, a adb --help
pokazuje polecenie connect <host>:<port>
. Zakładam, że sprawiłoby, że pojawiłyby się w nim komendy adb devices
, więc adb
pracują nad tym. W przypadku Eclipse spróbuj "Run/Run Configurations ..." i ustaw Target na Manual. To daje ci "wybieracz urządzeń", który, jak przypuszczam, zawiera zdalny emulator, jeśli adb jest do niego podłączony. Warte spróbowania.
Telefon programisty jest tańszy niż dodatkowy komputer i może być zdalnie debugowany. Dodatkową zaletą jest posiadanie wszystkich opcjonalnych czujników, których emulator domyślnie nie ma.
Gorąco polecam pobranie telefonu programisty do testowania.
Oto jak rozwiązałem go w systemie Windows. Dosłownie podążałem za przykładem Christophera, ale nie mogę go edytować, więc nowa odpowiedź będzie musiała zrobić.
Problem polegał na tym, że ADB oraz emulator właśnie mnie słuchali 127.0.0.1, a nie 0.0.0.0. W przeciwnym razie użyłbym TCPMon. Domyślam się, że jest inaczej w systemie Windows lub zmieniła się z najnowszymi wersjami SDK. (Można sprawdzić z netstat -ban
.)
zainstalowałem WinSSHD na maszynie, która biegnie emulatora. (Sądzę, że powinien również działać z freeSSHd, ale nie mogłem uzyskać działającego logowania.)
Otworzyłem port 22 (TCP) w Zaporze systemu Windows. (WinSSHD może to zrobić dla ciebie.)
Utworzone konto wirtualne w GUI WinSSHD.
Stworzyłem nowe połączenie PuTTY z maszyny deweloperskiej do maszyny emulatora i upewniłem się, że mogę się połączyć.
Potem skonfigurować tunelowanie w PuTTY: Connection -> SSH -> Tunele
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(Podłącz i zachować Położyć TY otwarte, aby utrzymać tunel.)
Teraz uruchomiłem emulator na zdalnym komputerze i upewniłem się, że ADB nie jest tam uruchomiony.
Uruchomiłem ponownie program ADB na maszynie programującej (
adb kill-server
, a następnieadb start-server
).adb devices
i zdalny emulator pojawił się jakoemulator-5554 device
. Mogę teraz wdrożyć i uruchomić aplikację bezpośrednio z Eclipse/ADT, gdzie emulator pojawił się w wirtualnych urządzeniach, tak jakby był lokalnym emulatorem.
Pracował świetnie! Dzięki za szczegóły. –
Fajnie, ale chciałbym wyjaśnić: po kroku 4 musisz zamknąć kit, następnie w kroku 5 otwórz go ponownie, skonfiguruj tunele i połącz ponownie. Kroki 6-8: najpierw uruchom emulator, następnie uruchom adb (w komputerze głównym). Krok 9: możesz chcieć zrestartować adb na komputerze klienta i wpisać urządzenia adb, aby się upewnić, że wszystko jest w porządku. Powinny również działać regularne pliki DDMS i eclipse. –
@MisterSmith Bardzo ważne punkty, dlaczego nie przesyłasz zmiany? :) –
Zdaję sobie sprawę, że to pytanie jest naprawdę stare, ale rozwiązałem problem nieco inaczej i zajęło mi trochę czasu, aby wymyślić to trywialne rozwiązanie.
Zwykle używam komputera PC lub laptopa z systemem Windows 7 (w zależności od tego, gdzie pracuję) jako interfejsu front-end, ponieważ podoba mi się GUI, jednak wolę wykonywać całą moją edycję/kompilację/debugowanie na bezobsługowym serwerze Ubuntu ze względu na całą dostarczoną moc linii poleceń. Moim celem jest uczynienie każdego systemu Windows tak bardzo cienkim klientem, jak to możliwe, bez żadnych dodatkowych usług (takich jak sshd) lub otworów w zaporze ogniowej.
Więc tutaj jest senario:
- System-A: System Windows7 z android emulator działa
- System-B: Serwer Ubuntu z SDK instalowane
problem jak opisany wcześniej jest emulator w systemie System-A wiąże się z lokalnym hostem, a nie z zewnętrznym interfejsem ethernetowym, więc polecenie adb w systemie-B nie może uzyskać dostępu do emulatora w systemie-A. Wszystko, co musisz zrobić, to skonfigurować zdalne przekazywanie portów w PuTTY dla twojego połączenia SSH z Systemem-B. Sztuką jest sprawdzenie przycisku radiowego "Zdalne" podczas tworzenia dwóch tuneli, aby kierunek tunelu był odwrócony (tunelowanie z serwera, do którego logujesz się, do klienta, z którego logujesz się).
Na koniec połączyć z adb na "localhost" na System-B po nawiązaniu połączenia ssh:
System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555 device
Teraz można pobrać obrazy/debug jako normalne, a to jest trywialne ważne jest, aby przełączyć się na inny system Windows, jeśli chcesz wyjąć laptopa i wypić kawę.
Dodatkowo, poprzez tunelowanie portu 5037 w taki sam sposób, można przekazać połączenie z serwerem adb, aby można było podłączyć prawdziwe urządzenie z Androidem przez USB w Systemie-A i pobrać obrazy do niego z Systemu-B. Aby to zadziałało, musisz upewnić się, że serwer adb działa w systemie A i nie uruchamia się w systemie B przed rozpoczęciem sesji SSH:
Najpierw uruchom serwer adb w systemie System-A (wiersz poleceń)
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
Następnie zabić serwer adb na system-B
System-B$ adb kill-server
Wreszcie ponownie uruchomić sesję ssh do systemu-B i sprawdzić
System-B$ adb devices
List of devices attached
3435F6E6035B00EC device
Czy jest jakiś sposób, aby to zrobić bez instalowania systemu Android SDK w systemie A? (maszyna Windows?) –
Nie, ponieważ serwer adb i sterowniki USB muszą być uruchomione na Systemie A, aby komunikować się z urządzeniem. –
Zrobiłem to również przy konfiguracji: Windows 7 (działający emulator) -> Linux (wymagany skok, ze względu na sieć ...) -> OS X z Eclipsem. Jestem w stanie zobaczyć urządzenia z "urządzeniami adb" i użyć emulatora z Eclipse. Problem polega na tym, że nie rozpoznaje docelowego Androida emulatora, więc muszę wybrać cel w każdym uruchomieniu ręcznie. – Frank
Znalazłem łatwy sposób, aby to zrobić, jeśli twoje dwa komputery są w tej samej sieci prywatnej i dlatego nie muszą używać szyfrowania SSH (co jest powszechnym przypadkiem). Może to pomóc, ponieważ tunel SSH może być dość długi i trudny do zainstalowania. Na przykład zainstalowanie demona SSH pod Cygwin/Windows po raz pierwszy może doprowadzić do rezygnacji (cóż, zrezygnowałem).
pod Windows, co za tym idzie wymaga po Cygwin zainstalowane z pakietem httptunnel. To musi działać pod Linux/httptunnel również, ale nie próbowałem.
Uruchom emulator na jednej z maszyn (powiedzmy jego nazwa hosta jest HostEmulator)
start Eclipse na innym komputerze (nazwijmy go HostEclipse)
Otwórz terminal Cygwin na każdej maszynie, a następnie,
Na HostEmulator, wprowadź następujące polecenia cygwin:
hts -F localhost:5554 10000 hts -F localhost:5555 10001
HTS oznacza tunel http Server.
Te dwa polecenia tworzą dwa półmostki, które nasłuchują portów 10001 i 10001 i przekierowują wejścia/wyjścia tych portów do lokalnych portów 5554 i 5555, które są portami używanymi przez emulator (w rzeczywistości pierwszy gotowy emulator - jeśli używasz kilku z nich, będą używać wyższych numerów portów, jak w innych odpowiedziach na tej stronie).
Na HostEclipse wprowadź tych co:
htc -F 5554 HostEmulator:10000 htc -F 5555 HostEmulator:10001
HTC oznacza Http Tunnel Client.
Te polecenia tworzą brakujące pół-mosty. Słuchają lokalnych portów 5554 i 5555 i przekierowują wejścia/wyjścia tych portów do pół-mostów, które utworzyliśmy na HostEmulator tuż przed.
Następnie, nadal na HostEclipse wprowadź Te trzy polecenia:
adb kill-server adb start-server adb devices
to restartuje adb gdyż nie wykrywa pilota emulator inaczej. To musi być skanowanie podczas uruchamiania. Następnie wyświetla listę urządzeń (dostępnych emulatorów) tylko do sprawdzenia.
- I nie udać.
Możesz pracować ze zdalnym emulatorem tak, jakby był lokalny. Musisz trzymać zaciski Cygwin otwarte na obu maszynach, bo inaczej zabijesz utworzone przez siebie mosty.
Użyłem tu portów 10000 i 10001 do wymiany maszyn/maszyn, ale oczywiście można używać innych portów, o ile nie są jeszcze używane.
Moje rozwiązanie dla Windows + AndroVM (które wymaga adaptera tylko hosta), gdy usługa ssh nie uruchomi się. więc nie wymaga żadnego dodatkowego oprogramowania.
adb connect <Andro VM IP>
adp tcpip 555
Na cmd szybkiego biegu jako admin:
netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>
portu TCP 5555 otwarty w Zaporze systemu Windows.
Następnie z drugiego biegu PC:
adb connect <host ip>
Żaden z proponowanych rozwiązań pracował dla mnie. Rozpocząłem od rozwiązania firmy Emirikol i udoskonaliłem je, tak jak w przypadku nowego interfejsu API Android> 21 emulator był wyświetlany w trybie offline i musiałem przejść do ustawień Genymotion i pozostawić ścieżkę SDK systemu Android pustą. A z linii poleceń:
netsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>
netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>
źródło: http://www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ Zastrzeżone, jestem autorem.
działa jak urok, nawet z mojego komputera z systemem Windows 7 z przekazywaniem portów Putty SSH. Dziękuję Ci. – gsbabil
@gsbabil Jakie było polecenie dla Putty SSH? –
@JimMcKeeth: Na podstawie powyższej konfiguracji sieci otwórz Putty, przejdź do Połączenie> SSH> Tunele. Teraz dodaj wpis za pomocą Source-port: 5556 i Destination: localhost: 5554. Powtórz to samo z Source-port: 5557 i Destination: localhost: 5555. Twoje zdrowie! – gsbabil