Debugging jarak jauh dengan emulator Android

94

Apakah mungkin untuk menulis kode / mengompilasi aplikasi Android di satu mesin dan men-debugnya dari jarak jauh pada emulator yang diluncurkan di mesin lain? Saya muak dan lelah dengan emulator yang terus-menerus memakan setengah dari CPU laptop saya.

zakovyrya.dll
sumber

Jawaban:

72

Saya sebelumnya belum mencoba (atau bahkan memperhatikan) adb connectperintah yang disebutkan cmb, tetapi saya dapat mengonfirmasi bahwa meneruskan port TCP sendiri - seperti melalui SSH - berfungsi dengan baik.

Emulator mendengarkan dua port TCP per instance: 5554 untuk antarmuka telnet dan 5555 untuk komunikasi kontrol dengan fitur seperti DDMS. Jadi Anda mungkin bisa lolos hanya dengan meneruskan port 5555 (meskipun saya baru mencobanya sejauh ini dengan keduanya). Setiap emulator berikutnya mengambil tuple nomor port genap + ganjil berikutnya yang tersedia (hingga sekitar 5580, saya kira).

Untuk referensi, saya melakukan langkah-langkah berikut di komputer lokal saya:

  • ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
  • killall adb; adb devices

Saya yakin emulator mencoba memberi tahu server adb lokal saat memulai; oleh karena itu adb harus direstart agar dapat memeriksa port 5554+ lokal.

Perhatikan bahwa perintah localhostdalam ssh mengacu pada antarmuka lokal mesin jarak jauh .

adb devicesmenunjukkan emulator baru - emulator-5554- dan saya dapat menggunakannya seolah-olah berjalan di komputer lokal saya.

Christopher Orr
sumber
1
bekerja seperti pesona, bahkan dari mesin Windows 7 saya dengan penerusan port Putty SSH. Terima kasih.
gsbabil
1
@JimMcKeeth: Berdasarkan konfigurasi jaringan di atas, buka Putty, buka Connection> SSH> Tunnels. Sekarang tambahkan entri dengan Source-port: 5556 dan Destination: localhost: 5554. Ulangi hal yang sama dengan Source-port: 5557 dan Destination: localhost: 5555. Bersulang!
gsbabil
5
Ingatlah Anda juga perlu killall adbdi server, karena emulator tidak akan menerima banyak koneksi dan akan offlineuntuk mesin lokal.
Henrique de Sousa
Adakah yang bisa menjelaskannya dalam bahasa Inggris?
Anil GR
21

Inilah cara saya menyelesaikannya di Windows. Saya cukup banyak mengikuti petunjuk Christopher, tetapi saya tidak bisa mengedit, jadi jawaban baru harus dilakukan.

Masalah yang saya hadapi adalah ADB dan emulator hanya mendengarkan 127.0.0.1, bukan 0.0.0.0, untuk saya. Kalau tidak, saya akan menggunakan TCPMon . Saya kira ini berbeda di Windows, atau telah berubah dengan versi terbaru SDK. (Anda bisa mengeceknya netstat -ban.)

  1. Saya telah menginstal WinSSHD di mesin yang menjalankan emulator. (Saya yakin itu harus bekerja dengan freeSSHd juga, tapi saya tidak bisa login bekerja di sana.)

  2. Saya membuka port 22 (TCP) di Windows Firewall. (WinSSHD mungkin bisa melakukannya untuk Anda.)

  3. Saya membuat akun virtual di WinSSHD GUI.

  4. Saya membuat koneksi PuTTY baru dari mesin pengembangan ke mesin emulator dan memastikan saya dapat terhubung.

  5. Kemudian saya menyiapkan tunneling di PuTTY: Connection -> SSH -> Tunnels

    Source port: 5554
    Destination: localhost:5554
    Type: Local/Auto

    Source port: 5555
    Destination: localhost:5555
    Type: Local/Auto

    (Hubungkan dan tetap buka PuTTY, untuk memelihara terowongan.)

  6. Sekarang saya menjalankan emulator di mesin jarak jauh dan memastikan bahwa ADB tidak berjalan di sana.

  7. Saya memulai ulang ADB di mesin pengembangan ( adb kill-server, lalu adb start-server).

  8. adb devicesdan emulator jarak jauh muncul sebagai emulator-5554 device. Sekarang saya dapat menerapkan dan menjalankan aplikasi saya langsung dari Eclipse / ADT, tempat emulator muncul di Perangkat Virtual seolah-olah itu adalah emulator lokal.

Henrik Heimbuerger
sumber
Bekerja dengan baik! Terima kasih untuk detailnya.
Jim McKeeth
1
Bagus, tetapi saya ingin menjelaskan: Setelah langkah 4 Anda harus menutup dempul, lalu di langkah 5 buka lagi, konfigurasikan terowongan dan sambungkan kembali. Langkah 6-8: pertama mulai emulator, lalu mulai adb (di mesin host). Langkah 9: Anda mungkin ingin memulai ulang adb di mesin klien, dan ketik adb devices untuk memastikan tidak apa-apa. DDMS biasa dan hal-hal gerhana harus berfungsi dengan baik.
Mister Smith
@MisterSmith Poin yang sangat valid, mengapa Anda tidak mengirimkan suntingan? :)
Henrik Heimbuerger
@MisterSmith Bisakah Anda mengedit jawaban Anda untuk mencerminkan komentar ini, ini sangat penting untuk keberhasilan masalah. Juga, terima kasih, saya sekarang dapat terhubung ke host saya dari mesin tamu saya.
meanbunny
21

Saya menyadari pertanyaan ini benar-benar tua, tetapi saya menyelesaikan masalah dengan sedikit berbeda, dan saya butuh beberapa saat untuk menemukan solusi yang sepele ini.

Saya biasanya menggunakan PC Windows7 atau laptop (tergantung di mana saya bekerja) sebagai front-end saya karena saya suka GUI, namun saya lebih suka melakukan semua edit / kompilasi / debug saya pada server Ubuntu tanpa kepala karena semua kekuatan baris perintah yang diberikannya. Tujuan saya adalah membuat setiap sistem windows menjadi thin-client sebanyak mungkin tanpa layanan tambahan (seperti sshd) atau lubang firewall.

Jadi inilah senario tersebut:

  • System-A: Sistem Windows7 dengan emulator android berjalan
  • System-B: Server Ubuntu dengan SDK diinstal

Masalah seperti yang dijelaskan sebelumnya adalah emulator di System-A mengikat ke localhost, bukan antarmuka ethernet eksternal, sehingga adb di System-B tidak dapat mengakses emulator di System-A. Yang perlu Anda lakukan hanyalah mengatur penerusan port jarak jauh di PuTTY untuk koneksi SSH Anda ke System-B. Triknya adalah dengan memeriksa tombol radio "Remote" ketika Anda membuat dua terowongan sehingga arah terowongan dibalik (tunneling dari server tempat Anda masuk ke klien tempat Anda masuk).

tangkapan layar terowongan

Terakhir, hubungkan dengan adb ke "localhost" di System-B setelah membuat koneksi SSH:

System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555  device

Sekarang Anda dapat mengunduh gambar / debug seperti biasa, dan itu adalah masalah yang sepele untuk beralih ke sistem Windows yang berbeda jika Anda ingin mengeluarkan laptop Anda dan minum kopi.

Selain itu, dengan juga tunneling port 5037 dengan cara yang sama Anda sebenarnya dapat meneruskan koneksi server adb Anda sehingga Anda dapat menghubungkan perangkat android nyata melalui USB pada System-A, dan mendownload gambar dari System-B. Agar ini berfungsi, Anda perlu memastikan bahwa server adb berjalan di System-A, dan tidak berjalan di System-B sebelum memulai sesi SSH Anda:

Pertama, mulai server adb di System-A (command prompt)

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

Selanjutnya, matikan server adb di System-B

System-B$ adb kill-server

Terakhir, mulai ulang sesi ssh Anda ke System-B dan verifikasi

System-B$ adb devices
List of devices attached
3435F6E6035B00EC        device
Patrick McKinnon
sumber
Apakah ada cara untuk melakukan ini tanpa menginstal sdk android di System-A? (mesin windows?)
Keith Twombley
Tidak, karena server adb dan driver usb harus berjalan di Sistem-A untuk berkomunikasi dengan perangkat.
Patrick McKinnon
Saya telah melakukan ini juga dengan pengaturan seperti: Windows 7 (menjalankan emulator) -> Linux (diperlukan hop, karena jaringan ...) -> OS X menjalankan Eclipse. Saya dapat melihat perangkat dengan 'adb devices' dan menggunakan emulator dari Eclipse. Masalahnya adalah ia tidak mengenali target Android dari emulator, jadi saya harus memilih target di setiap menjalankan secara manual.
Frank
jika Anda memerlukan dempul untuk Mac OS X, Anda dapat menemukannya di sini: mac-tools.org/putty-fur-mac-os-x/02/2012 Bagi saya, ini berfungsi dengan alat itu.
Bruno Bieri
@PatrickMcKinnon hal tersebut bekerja dengan baik tetapi pada Sistem-B, saya mendapatkan tidak sah saat memanggil "perangkat adb". Pada "perangkat adb" Sistem-B menunjukkannya sebagai berfungsi dengan baik. Ada bantuan?
Tejas Sherdiwala
6

Saya menemukan cara mudah untuk melakukan ini jika kedua mesin Anda berada di jaringan pribadi yang sama dan oleh karena itu tidak perlu menggunakan enkripsi SSH (yang merupakan kasus umum). Ini mungkin membantu karena terowongan SSH bisa sangat panjang dan sulit dipasang. Misalnya, menginstal daemon SSH di bawah Cygwin / Windows untuk pertama kalinya dapat menyebabkan menyerah (yah, saya menyerah).

Di bawah Windows, yang berikut mengharuskan Cygwin diinstal dengan paket httptunnel . Ini harus bekerja di Linux / httptunnel juga tetapi saya tidak mencoba.

  • Jalankan emulator di salah satu mesin (misalkan nama host-nya adalah HostEmulator )

  • Mulai Eclipse di komputer lain (sebut saja HostEclipse )

  • Buka terminal Cygwin di setiap mesin, dan kemudian,

  • Di HostEmulator , masukkan perintah cygwin berikut :

    hts -F localhost:5554 10000
    hts -F localhost:5555 10001
    

hts berarti Server Terowongan Http .

Kedua perintah ini membuat dua jembatan penghubung yang mendengarkan port 10001 dan 10001 dan yang mengalihkan I / O dari port ini ke port lokal 5554 dan 5555, yang merupakan port yang digunakan oleh emulator (sebenarnya, emulator pertama yang dibuka - jika Anda menjalankan beberapa dari mereka, mereka akan menggunakan nomor port yang lebih tinggi seperti yang terlihat di balasan lain halaman ini).

  • Di HostEclipse , masukkan yang berikut :

    htc -F 5554 HostEmulator:10000
    htc -F 5555 HostEmulator:10001
    

htc berarti Http Tunnel Client .

Perintah ini membuat setengah jembatan yang hilang. Mereka mendengarkan port lokal 5554 dan 5555 dan mengalihkan I / O dari port ini ke half-bridge yang telah kita buat di HostEmulator sebelumnya.

  • Kemudian, masih di HostEclipse , masukkan tiga perintah berikut :

    adb kill-server
    adb start-server
    adb devices
    

Ini akan memulai ulang adb karena sebaliknya tidak mendeteksi emulator jarak jauh. Itu harus melakukan beberapa pemindaian saat startup. Dan kemudian daftar perangkat (emulator yang tersedia) hanya untuk diperiksa.

  • Dan begitulah.

Anda dapat bekerja dengan emulator jarak jauh Anda seolah-olah itu lokal. Anda harus menjaga terminal Cygwin tetap terbuka di kedua mesin jika tidak, Anda akan mematikan setengah jembatan yang Anda buat.

Saya menggunakan port 10000 dan 10001 untuk mesin / mesin pertukaran di sini, tetapi tentu saja Anda dapat menggunakan port lain selama mereka belum digunakan.

Shlublu
sumber
2

Solusi saya untuk windows + AndroVM (yang membutuhkan adaptor khusus host) ketika layanan ssh saya gagal dimulai. jadi tidak memerlukan perangkat lunak tambahan.

adb connect <Andro VM IP>
adp tcpip 555

Pada prompt cmd, jalankan sebagai admin:

netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>

buka port TCP 5555 di firewall windows.

Kemudian, dari PC kedua jalankan:

adb connect <host ip>
Emirikol
sumber
1

Tidak ada solusi yang diusulkan yang berhasil untuk saya. Saya telah mulai dari solusi Emirikol dan menyempurnakannya, karena dengan Android API> 21 yang baru emulator muncul secara offline dan saya harus pergi ke pengaturan Genymotion dan membiarkan jalur Android SDK kosong. Dan dari baris perintah:

netsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>

netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>

sumber: http://www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ Disclaimer, saya penulisnya.

Sarpe
sumber
Jawaban dan artikel yang sempurna! Jika Anda menggunakan Genymotion, gunakan solusi ini. Artikel ini ditulis tentang Windows dan Mac, tetapi saya memiliki Ubuntu lokal dan Ubuntu jarak jauh dan semuanya berfungsi dengan baik. Menyelamatkan minggu saya!
konstantin_doncov
1

Saat Anda menjalankan adb, ini memulai salinan server itu sendiri jika belum berjalan. Anda dapat memulai penyalinan itu sendiri di mesin dengan perangkat dan sejak sdk 4.3 Anda dapat memberinya opsi -a untuk memberi tahu server itu untuk mendengarkan mesin jarak jauh. Lakukan itu dengan perintah berikut yang tidak keluar:

adb -a -P 5037 server nodaemon

Pada mesin tempat Anda ingin menggunakan perangkat, setel ADB_SERVER_SOCKET ke tcp: xxxx: 5037 dalam variabel lingkungan (atau berikan nilai yang sama untuk setiap pemanggilan adb dengan opsi -L), di mana xxxx adalah alamat IP atau nama host dari mesin dengan perangkat, dan 5037 cocok dengan port yang Anda berikan pada perintah di atas.

Kami menggunakan ini untuk memberikan akses ke sekitar 100 emulator yang tersebar di 3 mesin ke mesin yang menjalankan pengujian ujung ke ujung secara paralel, dan untuk pengembang yang ingin berbagi perangkat nyata dari jarak jauh.

Anda dapat meneruskan port ke dan dari emulator dengan adb forward dan adb reverse, dan port tersebut akan muncul di komputer dengan perangkatnya (bukan mesin tempat Anda menjalankan 'adb forward').

android.weasel
sumber
Dapatkah Anda memberikan detail lebih lanjut tentang solusi ini? Saya melakukan semua yang Anda katakan, tapi saya tidak memiliki perangkat di "Select Deployment Target" di Android Studio. Saya menggunakan Genymotion di komputer kedua.
konstantin_doncov
@ don-prog Anda tidak mengatakan apakah ini berfungsi untuk Anda dari baris perintah: adb -L tcp:remotehost:1234 devicesJika ya, maka Anda perlu mencari tahu apakah Android Studio mendukung ADB jarak jauh atau tidak - saya tidak akan terkejut jika tetap menggunakan perangkat lokal.
android.weasel
0

Saya tidak memiliki mesin kedua yang memiliki SDK, tetapi saya perhatikan bahwa port mendengarkan emulator (default 5554, 5555) sedang mendengarkan 0.0.0.0, yaitu dapat dijangkau dari mesin jarak jauh, dan itu adb --helpmenunjukkan connect <host>:<port>perintah. Saya berasumsi itu akan membuatnya muncul adb devicessehingga adbperintah bekerja di atasnya. Untuk Eclipse, coba "Run / Run Configurations ..." dan setel Target ke Manual. Itu memberi Anda "pemilih perangkat" yang menurut saya akan menyertakan emulator jarak jauh jika adb terhubung dengannya. Patut dicoba.

Chris Boyle
sumber