Kod yazmak / Android uygulamasını bir makinede derlemek ve başka bir bilgisayarda başlatılan öykünücüde uzaktan hata ayıklamak mümkün müdür? Öykünücünün sürekli dizüstü bilgisayarımın CPU'sunun yarısını yemesinden bıktım usandım.
Yanıtlar:
Daha önce adb connect
cmb'nin bahsettiği komutu denemedim (hatta fark etmedim), ancak TCP bağlantı noktalarını (SSH üzerinden olduğu gibi) kendiniz iletmenin iyi çalıştığını onaylayabilirim.
Emülatör, örnek başına iki TCP bağlantı noktasını dinler: telnet arabirimi için 5554 ve DDMS gibi araçlarla kontrol iletişimi için 5555. Yani muhtemelen sadece yönlendirme portu 5555 ile kurtulabilirsiniz (şimdiye kadar sadece her ikisiyle de denedim). Sonraki her emülatör, bir sonraki çift + tek bağlantı noktası numarasını alır (sanırım 5580'e kadar).
Referans olarak yerel makinemde aşağıdaki adımları uyguladım:
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
killall adb; adb devices
Öykünücünün başlangıçta yerel bir adb sunucusunu bilgilendirmeye çalıştığına inanıyorum; bu nedenle yerel 5554+ bağlantı noktalarını araştırmak için adb'yi yeniden başlatma ihtiyacı vardır.
Not localhost
SSH komutu lokal arayüzü belirtmektedir uzak makinesi.
adb devices
yeni bir emülatör gösterdi - emulator-5554
- ve onu yerel makinemde çalışıyormuş gibi kullanabilirdim.
killall adb
Sunucuda da ihtiyacınız olduğunu unutmayın , çünkü öykünücü birden fazla bağlantıyı kabul etmeyecek offline
ve yerel makine için geçerli olacaktır .
İşte Windows'ta bunu nasıl çözdüm. Hemen hemen Christopher'ın liderliğini takip ettim, ancak düzenleme yapamıyorum, bu yüzden yeni bir yanıtın yapılması gerekecek.
Karşılaştığım sorun, ADB'nin ve emülatörün benim için 0.0.0.0'ı değil, sadece 127.0.0.1'i dinlemesiydi. Aksi takdirde TCPMon kullanırdım . Sanırım bu ya Windows'ta farklı ya da SDK'nın son sürümleriyle değişti. (İle kontrol edebilirsiniz netstat -ban
.)
Öykünücüyü çalıştıran makineye WinSSHD kurdum . (FreeSSHd ile de çalışması gerektiğine inanıyorum, ancak orada çalışan bir giriş alamadım.)
Windows Güvenlik Duvarı'nda 22 numaralı bağlantı noktasını (TCP) açtım. (WinSSHD bunu sizin için yapabilir.)
WinSSHD GUI'de sanal bir hesap oluşturdum.
Geliştirme makinesinden emülatör makinesine yeni bir PuTTY bağlantısı oluşturdum ve bağlanabileceğimden emin oldum.
Sonra PuTTY'de tünel kurdum: Bağlantı -> SSH -> Tüneller
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(Tüneli korumak için PuTTY'yi bağlayın ve açık tutun.)
Şimdi uzak makinede emülatörü çalıştırdım ve ADB'nin orada çalışmadığından emin oldum.
ADB'yi geliştirme makinesinde yeniden başlattım ( adb kill-server
sonra adb start-server
).
adb devices
ve uzak emülatör olarak göründü emulator-5554 device
. Artık uygulamamı doğrudan Eclipse / ADT'den dağıtabilir ve çalıştırabilirdim, burada öykünücü Sanal Aygıtlar altında yerel bir öykünücüymüş gibi göründü.
Bu sorunun gerçekten eski olduğunun farkındayım, ancak sorunu biraz farklı çözdüm ve bu önemsiz çözümü bulmam biraz zaman aldı.
GUI'yi sevdiğim için ön uç olarak genellikle bir Windows7 PC veya dizüstü bilgisayar (çalıştığım yere bağlı olarak) kullanırım, ancak tüm düzenleme / derleme / hata ayıklama işlemimi başsız bir Ubuntu sunucusunda yapmayı tercih ederim. komut satırı gücü sağlar. Amacım, her bir Windows sistemini fazladan hizmetler (sshd gibi) veya güvenlik duvarı delikleri olmadan olabildiğince ince bir istemci haline getirmek.
İşte senaryo:
Daha önce açıklandığı gibi sorun, System-A'daki emülatörün harici ethernet arabirimine değil localhost'a bağlanmasıdır, bu nedenle System-B'deki adb, System-A'daki öykünücüye erişemez. Tek yapmanız gereken, System-B'ye SSH bağlantınız için PuTTY'de uzak port yönlendirmeyi kurmaktır. İşin püf noktası, iki tünel oluşturduğunuzda "Uzak" radyo düğmesini kontrol etmektir, böylece tünel yönü tersine çevrilir (oturum açtığınız istemciye oturum açtığınız sunucudan tünelleme).
Son olarak, SSH bağlantısını kurduktan sonra adb ile System-B üzerindeki "localhost" a bağlanın:
System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555 device
Artık görüntüleri / hata ayıklamayı normal olarak indirebilirsiniz ve dizüstü bilgisayarınızı çıkarıp biraz kahve içmek istiyorsanız farklı bir Windows sistemine geçmek önemsiz bir konudur.
Ek olarak, aynı şekilde 5037 numaralı bağlantı noktasını tünelleyerek, aslında adb sunucu bağlantınızı yönlendirebilirsiniz, böylece gerçek bir android cihazı USB üzerinden Sistem-A'ya bağlayabilir ve Sistem-B'den görüntüleri ona indirebilirsiniz. Bunun çalışması için, SSH oturumunuzu başlatmadan önce adb sunucusunun System-A üzerinde çalıştığından ve System-B üzerinde çalışmadığından emin olmanız gerekir:
Öncelikle, System-A'da adb sunucusunu başlatın (komut istemi)
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
Ardından, System-B'deki adb sunucusunu öldürün
System-B$ adb kill-server
Son olarak, ssh oturumunuzu System-B'ye yeniden başlatın ve doğrulayın
System-B$ adb devices
List of devices attached
3435F6E6035B00EC device
İki makineniz aynı özel ağdaysa ve bu nedenle SSH şifrelemesine ihtiyaç duymuyorsa bunu yapmanın kolay bir yolunu buldum (bu yaygın bir durumdur). Bu, SSH tüneli oldukça uzun ve kurulumu zor olabileceğinden yardımcı olabilir. Örneğin, Cygwin / Windows altında bir SSH arka plan programı kurmak pes etmenize neden olabilir (pes ettim).
Windows altında, aşağıdakiler, Cygwin'in HTptunnel paketiyle birlikte kurulmasını gerektirir . Bu da Linux / HTptunnel altında çalışmalı ama denemedim.
Öykünücüyü makinelerden birinde çalıştırın (ana bilgisayar adı HostEmulator diyelim )
Diğer makinede Eclipse'i başlatın (buna HostEclipse diyelim )
Her makinede bir Cygwin terminali açın ve ardından,
On HostEmulator aşağıdaki cygwin komutları girin :
hts -F localhost:5554 10000
hts -F localhost:5555 10001
hts , Http Tünel Sunucusu anlamına gelir .
Bu iki komut, 10001 ve 10001 bağlantı noktalarını dinleyen ve bu bağlantı noktalarının I / O'larını emülatör tarafından kullanılan bağlantı noktaları olan 5554 ve 5555 yerel bağlantı noktalarına yönlendiren iki yarım köprü oluşturur (aslında, ilk lauched emülatör - Eğer bunlardan birkaçı çalıştırıyorsanız, bu sayfanın diğer yanıtlarında görüldüğü gibi daha yüksek bağlantı noktası numaraları kullanırlar).
On HostEclipse , bu olanları girmek :
htc -F 5554 HostEmulator:10000
htc -F 5555 HostEmulator:10001
htc , Http Tunnel Client anlamına gelir .
Bu komutlar eksik yarım köprüleri oluşturur. 5554 ve 5555 yerel portlarını dinlerler ve bu portların I / O'larını HostEmulator üzerinde oluşturduğumuz yarım köprülere yönlendirirler .
Ardından, hala HostEclipse'de , şu üç komutu girin :
adb kill-server
adb start-server
adb devices
Bu, aksi takdirde uzak öykünücüyü algılamadığı için adb'yi yeniden başlatır. Başlangıçta biraz tarama yapıyor olmalı. Ve sonra sadece kontrol için cihazları (mevcut emülatörler) listeler.
Uzak emülatörünüzle yerelmiş gibi çalışabilirsiniz. Cygwin terminallerini her iki makinede de açık tutmalısınız, aksi takdirde oluşturduğunuz yarım köprüleri öldürürsünüz.
Burada makine / makine değişimleri için 10000 ve 10001 bağlantı noktasını kullandım, ancak elbette daha önce kullanılmadıkları sürece diğer bağlantı noktalarını kullanabilirsiniz.
Ssh hizmetim başlatılamadığında Windows + AndroVM (yalnızca ana bilgisayar adaptörü gerektirir) için çözümüm. bu nedenle herhangi bir ek yazılım gerektirmez.
adb connect <Andro VM IP>
adp tcpip 555
Cmd isteminde yönetici olarak çalıştırın:
netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>
Windows güvenlik duvarında 5555 numaralı TCP bağlantı noktasını açın.
Ardından, ikinci bilgisayardan çalıştırın:
adb connect <host ip>
Önerilen çözümlerin hiçbiri benim için işe yaramadı. Emirikol'un çözümünden başladım ve onu geliştirdim, yeni Android API> 21'de olduğu gibi emülatör çevrimdışı görünüyordu ve Genymotion ayarlarına gidip Android SDK yolunu boş bırakmak zorunda kaldım. Ve komut satırından:
netsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>
netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>
kaynak: http://www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ Sorumluluk reddi, yazar benim.
Adb'yi çalıştırdığınızda, zaten çalışmıyorsa, kendisinin bir sunucu kopyasını başlatır. Bu kopyaya kendiniz cihazla makinede başlayabilirsiniz ve sdk 4.3'ten bu yana, sunucuya uzaktaki makineleri dinlemesini söylemek için -a seçeneği verebilirsiniz. Bunu çıkış yapmayan aşağıdaki komutla yapın:
adb -a -P 5037 sunucu nodaemon
Aygıtı kullanmak istediğiniz makinede, ADB_SERVER_SOCKET'i bir ortam değişkeninde tcp: xxxx: 5037 olarak ayarlayın (veya -L seçeneğiyle her adb çağrısına aynı değeri verin); burada xxxx, IP adresi veya ana bilgisayar adıdır. ve 5037, yukarıdaki komutta verdiğiniz bağlantı noktasıyla eşleşir.
Bunu, uçtan uca testleri paralel olarak çalıştıran bir makineye ve gerçek cihazları uzaktan paylaşmak isteyen geliştiricilere 3 makineye yayılmış yaklaşık 100 emülatöre erişim sağlamak için kullanıyoruz.
Adb forward ve adb reverse ile emülatöre ve emülatörden bağlantı noktalarını iletebilirsiniz ve bunlar cihazlarla birlikte makinede görünecektir ('adb ileri' çalıştırdığınız makine değil).
adb -L tcp:remotehost:1234 devices
, Android Studio'nun uzak ADB'leri destekleyip desteklemediğini öğrenmeniz gerekir - kullanmakta ısrar etmesi beni şaşırtmaz yerel cihazlar.
Elimde SDK bulunan ikinci bir makinem yok, ancak öykünücünün dinleme bağlantı noktalarının (varsayılan 5554, 5555) dinlediğini 0.0.0.0
, yani uzak makinelerden erişilebilir olduğunu ve bunun adb --help
bir connect <host>:<port>
komut gösterdiğini not ediyorum . Bunun ortaya çıkmasını sağlayacağını ve adb devices
böylece adb
komutların üzerinde çalışacağını varsayıyorum . Eclipse için, "Yapılandırmaları Çalıştır / Çalıştır ..." seçeneğini deneyin ve Hedefi Manuel olarak ayarlayın. Bu size, adb bağlıysa bir uzak emülatör içereceğini tahmin ettiğim bir "aygıt seçici" verir. Denemeye değer.