Android öykünücüsü ile uzaktan hata ayıklama


94

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:


72

Daha önce adb connectcmb'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 localhostSSH komutu lokal arayüzü belirtmektedir uzak makinesi.

adb devicesyeni bir emülatör gösterdi - emulator-5554- ve onu yerel makinemde çalışıyormuş gibi kullanabilirdim.


1
Putty SSH bağlantı noktası yönlendirme özelliğine sahip Windows 7 makinemden bile bir cazibe gibi çalışıyor. Teşekkür ederim.
gsbabil

1
@JimMcKeeth: Yukarıdaki ağ yapılandırmasına bağlı olarak Putty'yi açın, Bağlantı> SSH> Tüneller'e gidin. Şimdi Source-port: 5556 ve Destination: localhost: 5554 ile bir giriş ekleyin. Aynı işlemi Source-port: 5557 ve Destination: localhost: 5555 ile tekrarlayın. Şerefe!
gsbabil

5
killall adbSunucuda da ihtiyacınız olduğunu unutmayın , çünkü öykünücü birden fazla bağlantıyı kabul etmeyecek offlineve yerel makine için geçerli olacaktır .
Henrique de Sousa

Bunu ingilizce açıklayan var mı?
Anil GR

21

İş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.)

  1. Ö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.)

  2. Windows Güvenlik Duvarı'nda 22 numaralı bağlantı noktasını (TCP) açtım. (WinSSHD bunu sizin için yapabilir.)

  3. WinSSHD GUI'de sanal bir hesap oluşturdum.

  4. Geliştirme makinesinden emülatör makinesine yeni bir PuTTY bağlantısı oluşturdum ve bağlanabileceğimden emin oldum.

  5. 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.)

  6. Şimdi uzak makinede emülatörü çalıştırdım ve ADB'nin orada çalışmadığından emin oldum.

  7. ADB'yi geliştirme makinesinde yeniden başlattım ( adb kill-serversonra adb start-server).

  8. adb devicesve 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ü.


Harika çalıştı! Detaylar için teşekkürler.
Jim McKeeth

1
Güzel, ama açıklığa kavuşturmak istiyorum: 4. adımdan sonra macunu kapatmanız, ardından 5. adımda tekrar açmanız, tünelleri yapılandırmanız ve yeniden bağlamanız gerekir. Adım 6-8: önce öykünücüyü başlatın, ardından adb'yi başlatın (ana makinede). Adım 9: İstemci makinesinde adb'yi yeniden başlatmak isteyebilir ve sorun olmadığından emin olmak için adb cihazları yazabilirsiniz. Düzenli DDMS ve tutulma işleri de çalışmalıdır.
Bay Smith

@MisterSmith Çok geçerli noktalar, neden bir düzenleme göndermiyorsunuz? :)
Henrik Heimbuerger

@MisterSmith Sorunun başarısı için çok önemli olan bu yorumu yansıtacak şekilde yanıtınızı düzenleyebilir misiniz? Ayrıca, teşekkür ederim, artık konuk makinemden ev sahibime bağlanabiliyorum.
meanbunny

21

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:

  • System-A: Android öykünücüsü çalışan Windows7 sistemi
  • System-B: SDK yüklü Ubuntu sunucusu

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).

tünel ekran görüntüsü

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

Android sdk'yi System-A'ya yüklemeden bunu yapmanın bir yolu var mı? (windows machine?)
Keith Twombley

Hayır, çünkü adb sunucusu ve usb sürücülerinin cihazla iletişim kurması için Sistem-A üzerinde çalışması gerekir.
Patrick McKinnon

Bunu da şöyle bir kurulumla yaptım: Windows 7 (çalışan emülatör) -> Linux (ağ nedeniyle gerekli atlama ...) -> Eclipse çalıştıran OS X. Eclipse'den 'adb cihazları' olan cihazları görebiliyor ve emülatörü kullanabiliyorum. Sorun, öykünücünün Android hedefini tanımamasıdır, bu nedenle her çalıştırmada hedefi manuel olarak seçmem gerekir.
Frank

Mac OS X için bir macuna ihtiyacınız varsa, burada bulabilirsiniz: mac-tools.org/putty-fur-mac-os-x/02/2012 Benim için bu araçla çalıştı.
Bruno Bieri

@PatrickMcKinnon bu şey iyi çalıştı ama System-B'de "adb cihazları" aradığımda yetkisiz kalıyorum. System-B'de "adb cihazları" iyi çalıştığını gösterir. Herhangi bir yardım?
Tejas Sherdiwala

6

İ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.

  • Ve işte gidiyorsun.

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.


2

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>

1

Ö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.


Mükemmel cevap ve makale! Genymotion kullanıyorsanız, bu çözümü kullanın. Makale Windows ve Mac hakkında yazılmıştır, ancak yerel Ubuntu'm ve uzak Ubuntu'm var ve hepsi iyi çalışıyor. Haftamı kurtardım!
konstantin_doncov

1

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).


Bu çözüm hakkında daha fazla ayrıntı verebilir misiniz? Söylediğiniz her şeyi yaptım, ancak Android Studio'da "Dağıtım Hedefini Seçin" bölümünde herhangi bir cihazım yok. İkinci bilgisayarda Genymotion kullanıyorum.
konstantin_doncov

@ don-prog Sizin için çalışıp çalışmadığını komut satırından söylemiyorsunuz: Çalışıyorsa 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.
android.weasel

0

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 --helpbir connect <host>:<port>komut gösterdiğini not ediyorum . Bunun ortaya çıkmasını sağlayacağını ve adb devicesböylece adbkomutları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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.