Czy można napisać kod / skompilować aplikację na Androida na jednym komputerze i zdalnie debugować ją na emulatorze uruchomionym na innym? Mam dość tego, że emulator ciągle zjada połowę procesora mojego laptopa.
Odpowiedzi:
Wcześniej nie próbowałem (ani nawet nie zauważyłem) adb connect
polecenia, o którym wspomniał cmb, ale mogę potwierdzić, że samodzielne przekazywanie portów TCP - na przykład przez SSH - działa dobrze.
Emulator nasłuchuje na dwóch portach TCP na instancję: 5554 dla interfejsu telnet i 5555 do sterowania komunikacją z narzędziami takimi jak DDMS. Więc prawdopodobnie mógłbyś uciec tylko z przekierowaniem portu 5555 (chociaż próbowałem go do tej pory tylko z obydwoma). Każdy kolejny emulator przyjmuje następną dostępną krotkę portu parzystego + nieparzystego (do około 5580, jak sądzę).
Dla porównania wykonałem następujące kroki na moim komputerze lokalnym:
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
killall adb; adb devices
Uważam, że emulator próbuje powiadomić lokalny serwer ADB podczas uruchamiania; stąd potrzeba ponownego uruchomienia adb, aby mógł sondować lokalne porty 5554+.
Zauważ, że localhost
w poleceniu ssh odnosi się do lokalnego interfejsu zdalnej maszyny.
adb devices
pokazał nowy emulator - emulator-5554
- i mogłem go używać tak, jakby działał na moim lokalnym komputerze.
killall adb
na serwerze, ponieważ emulator nie zaakceptuje wielu połączeń i będzie offline
dla lokalnej maszyny.
Oto, jak rozwiązałem to w systemie Windows. Prawie poszedłem za przykładem Christophera, ale nie mogę edytować, więc nowa odpowiedź będzie musiała wystarczyć.
Problem polegał na tym, że ADB i emulator po prostu nasłuchiwały na 127.0.0.1, a nie na 0.0.0.0. W przeciwnym razie użyłbym TCPMon . Wydaje mi się, że jest to albo inne w systemie Windows, albo zmieniło się wraz z najnowszymi wersjami SDK. (Możesz to sprawdzić netstat -ban
.)
Zainstalowałem WinSSHD na maszynie, na której działa emulator. (Uważam, że powinno działać również z freeSSHd, ale nie mogłem tam uzyskać loginu).
Otworzyłem port 22 (TCP) w Zaporze systemu Windows. (WinSSHD może to zrobić za Ciebie).
Utworzyłem konto wirtualne w GUI WinSSHD.
Utworzyłem nowe połączenie PuTTY z maszyny deweloperskiej do maszyny emulatora i upewniłem się, że mogę się połączyć.
Następnie skonfigurowałem tunelowanie w PuTTY: Połączenie -> SSH -> Tunele
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(Połącz i pozostaw PuTTY otwarte, aby utrzymać tunel).
Teraz odpaliłem emulator na zdalnej maszynie i upewniłem się, że ADB tam nie działa.
Zrestartowałem ADB na komputerze deweloperskim ( adb kill-server
wtedy adb start-server
).
adb devices
a zdalny emulator pojawił się jako emulator-5554 device
. Mogłem teraz wdrożyć i uruchomić moją aplikację bezpośrednio z Eclipse / ADT, gdzie emulator pojawił się w obszarze Urządzenia wirtualne, jakby był emulatorem lokalnym.
Zdaję sobie sprawę, że to pytanie jest naprawdę stare, ale rozwiązałem problem nieco inaczej i zajęło mi trochę czasu, zanim doszedłem do tego trywialnego rozwiązania.
Zwykle używam komputera PC lub laptopa z systemem Windows 7 (w zależności od tego, gdzie pracuję) jako mojego interfejsu użytkownika, ponieważ lubię GUI, jednak wolę wykonywać całą edycję / kompilację / debugowanie na bezgłowym serwerze Ubuntu ze względu na wszystkie zapewnia moc wiersza poleceń. Moim celem jest uczynienie każdego systemu Windows jak najbardziej uproszczonym klientem bez żadnych dodatkowych usług (takich jak sshd) lub dziur w zaporze.
Więc oto senario:
Problem, jak opisano wcześniej, polega na tym, że emulator w System-A wiąże się z lokalnym hostem, a nie z zewnętrznym interfejsem Ethernet, więc adb w System-B nie może uzyskać dostępu do emulatora w System-A. Wszystko, co musisz zrobić, to skonfigurować zdalne przekierowanie portów w PuTTY dla połączenia SSH z System-B. Sztuczka polega na zaznaczeniu przycisku radiowego „Remote” podczas tworzenia dwóch tuneli, tak aby kierunek tunelu był odwrócony (tunelowanie z serwera, na którym się logujesz, do klienta, z którego się logujesz).
Na koniec połącz się z adb do „localhost” w System-B po ustanowieniu 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żesz normalnie pobierać obrazy / debugować, a przejście na inny system Windows jest banalną sprawą, jeśli chcesz wyjąć laptopa i napić się kawy.
Ponadto, tunelując port 5037 w ten sam sposób, możesz w rzeczywistości przekierować połączenie z serwerem adb, dzięki czemu możesz podłączyć prawdziwe urządzenie z Androidem przez USB do System-A i pobierać do niego obrazy z System-B. Aby to zadziałało, przed rozpoczęciem sesji SSH upewnij się, że serwer adb działa w System-A, a nie w System-B:
Najpierw uruchom serwer adb w System-A (wiersz polecenia)
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 zabij serwer adb na System-B
System-B$ adb kill-server
Na koniec zrestartuj sesję ssh do System-B i sprawdź
System-B$ adb devices
List of devices attached
3435F6E6035B00EC device
Znalazłem łatwy sposób, aby to zrobić, jeśli twoje dwa komputery znajdują się w tej samej sieci prywatnej i dlatego nie muszą używać szyfrowania SSH (co jest częstym 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 poddania się (cóż, poddałem się).
W systemie Windows poniższe czynności wymagają zainstalowania Cygwin z pakietem httptunnel . To musi działać również pod Linuksem / httptunnel, ale nie próbowałem.
Uruchom emulator na jednym z komputerów (powiedzmy, że jego nazwa hosta to HostEmulator )
Uruchom Eclipse na innym komputerze (nazwijmy to HostEclipse )
Otwórz terminal Cygwin na każdym komputerze, a następnie
W HostEmulator wprowadź następujące polecenia cygwin :
hts -F localhost:5554 10000
hts -F localhost:5555 10001
hts oznacza Http Tunnel 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 emulator uruchomiony - jeśli jest ich kilka działających, będą używać wyższych numerów portów, jak widać w innych odpowiedziach na tej stronie).
W HostEclipse wprowadź te :
htc -F 5554 HostEmulator:10000
htc -F 5555 HostEmulator:10001
htc oznacza klienta tunelu Http .
Te polecenia tworzą brakujące półmostki. Nasłuchują lokalnych portów 5554 i 5555 i przekierowują wejścia / wyjścia tych portów do półmostków, które utworzyliśmy tuż przed HostEmulator .
Następnie, nadal na HostEclipse , wprowadź te trzy polecenia :
adb kill-server
adb start-server
adb devices
Spowoduje to ponowne uruchomienie adb, ponieważ w przeciwnym razie nie wykrywa zdalnego emulatora. Musi wykonywać skanowanie podczas uruchamiania. A następnie wyświetla listę urządzeń (dostępnych emulatorów) tylko do sprawdzenia.
Możesz pracować ze zdalnym emulatorem tak, jakby był lokalny. Musisz pozostawić otwarte terminale Cygwin na obu maszynach, w przeciwnym razie zabijesz utworzone przez siebie połówki mostów.
Użyłem portu 10000 i 10001 do wymiany maszyna / maszyna tutaj, ale oczywiście możesz użyć innych portów, o ile nie są już używane.
Moje rozwiązanie dla systemu Windows + AndroVM (które wymaga adaptera tylko dla hosta), gdy moja usługa ssh nie uruchomiła się. więc nie wymaga żadnego dodatkowego oprogramowania.
adb connect <Andro VM IP>
adp tcpip 555
W zachęcie cmd uruchom jako administrator:
netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>
otwórz port TCP 5555 w zaporze systemu Windows.
Następnie z drugiego komputera uruchom:
adb connect <host ip>
Żadne z proponowanych rozwiązań nie zadziałało. Zacząłem od rozwiązania Emirikol i dopracowałem je, ponieważ z nowym Android API> 21 emulator pojawiał się offline i musiałem przejść do ustawień Genymotion i pozostawić pustą ścieżkę Android SDK. I 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żenie, jestem autorem.
Po uruchomieniu adb uruchamia kopię samego serwera, jeśli jeszcze nie jest uruchomiona. Możesz rozpocząć kopiowanie siebie na maszynie z urządzeniem, a od sdk 4.3 możesz dać mu opcję -a, aby nakazać serwerowi nasłuchiwanie zdalnych maszyn. Zrób to za pomocą następującego polecenia, które się nie kończy:
adb -a -P 5037 serwer nodaemon
Na komputerze, z którego chcesz korzystać z urządzenia, ustaw ADB_SERVER_SOCKET na tcp: xxxx: 5037 w zmiennej środowiskowej (lub nadaj tę samą wartość każdemu wywołaniu adb z opcją -L), gdzie xxxx to adres IP lub nazwa hosta maszyna z urządzeniami, a 5037 odpowiada portowi, który podałeś w powyższym poleceniu.
Używamy tego, aby zapewnić dostęp do około 100 emulatorów rozmieszczonych na 3 maszynach do maszyny wykonującej równolegle testy od końca do końca, a także do programistów, którzy chcą zdalnie udostępniać prawdziwe urządzenia.
Możesz przekazywać porty do iz emulatora za pomocą adb forward i adb reverse, a pojawią się one na maszynie z urządzeniami (nie na maszynie, z której uruchamiasz `` adb forward '').
adb -L tcp:remotehost:1234 devices
jeśli tak, to musisz dowiedzieć się, czy Android Studio obsługuje zdalne ADB, czy nie - nie zdziwiłbym się, gdyby nalegał na użycie urządzenia lokalne.
Nie mam pod ręką drugiej maszyny z SDK, ale zauważam, że porty nasłuchu emulatora (domyślnie 5554, 5555) nasłuchują 0.0.0.0
, tj. Są osiągalne z maszyn zdalnych, i to adb --help
pokazuje connect <host>:<port>
polecenie. Zakładam, że to sprawi, że pojawi się w, adb devices
więc adb
działają na nim polecenia. W przypadku Eclipse spróbuj „Run / Run Configurations ...” i ustaw Target na Manual. To daje ci "wybór urządzeń", który, jak przypuszczam, zawierałby zdalny emulator, jeśli jest do niego podłączony adb. Warte spróbowania.