Gỡ lỗi từ xa với trình giả lập Android


93

Có thể viết mã / biên dịch ứng dụng Android trên một máy và gỡ lỗi nó từ xa trên trình giả lập được khởi chạy trên máy khác không? Tôi phát ốm và mệt mỏi vì trình giả lập liên tục ăn hết một nửa CPU của máy tính xách tay của tôi.

Câu trả lời:


71

Trước đây tôi chưa thử (hoặc thậm chí nhận thấy) adb connectlệnh mà cmb đã đề cập, nhưng tôi có thể xác nhận rằng việc tự chuyển tiếp các cổng TCP - chẳng hạn như qua SSH - hoạt động tốt.

Trình giả lập lắng nghe trên hai cổng TCP mỗi phiên bản: 5554 cho giao diện telnet và 5555 cho giao tiếp điều khiển với các công cụ như DDMS. Vì vậy, bạn có thể có được chỉ với cổng chuyển tiếp 5555 (mặc dù tôi chỉ thử nó cho đến nay với cả hai). Mỗi trình mô phỏng tiếp theo lấy bộ số cổng chẵn + lẻ có sẵn tiếp theo (tôi nghĩ là lên đến khoảng 5580).

Để tham khảo, tôi đã thực hiện các bước sau trên máy cục bộ của mình:

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

Tôi tin rằng trình giả lập cố gắng thông báo cho máy chủ adb cục bộ khi khởi động; do đó cần phải khởi động lại adb để nó thăm dò 5554+ cổng cục bộ.

Lưu ý rằng lệnh localhosttrong ssh đề cập đến giao diện cục bộ của máy từ xa .

adb deviceshiển thị một trình giả lập mới - emulator-5554- và tôi có thể sử dụng nó như thể nó đang chạy trên máy cục bộ của tôi.


1
hoạt động như một sự quyến rũ, ngay cả từ máy Windows 7 của tôi có chuyển tiếp cổng Putty SSH. Cảm ơn bạn.
gsbabil

1
@JimMcKeeth: Dựa trên cấu hình mạng ở trên, mở Putty, vào Connection> SSH> Tunnels. Bây giờ, hãy thêm một mục nhập với Cổng nguồn: 5556 và Đích: localhost: 5554. Lặp lại tương tự với Source-port: 5557 và Destination: localhost: 5555. Chúc mừng!
gsbabil

5
Chỉ cần nhớ rằng bạn cũng cần phải killall adbtrên máy chủ, vì trình giả lập sẽ không chấp nhận nhiều kết nối và sẽ offlinedành cho máy cục bộ.
Henrique de Sousa

Bất cứ ai có thể giải thích nó bằng tiếng Anh?
Anil GR

21

Đây là cách tôi đã giải quyết nó trên Windows. Tôi đã làm theo khá nhiều dẫn dắt của Christopher, nhưng tôi không thể chỉnh sửa, vì vậy một câu trả lời mới sẽ phải làm.

Vấn đề tôi gặp phải là ADB cũng như trình giả lập chỉ nghe trên 127.0.0.1, không phải 0.0.0.0 đối với tôi. Nếu không, tôi đã sử dụng TCPMon . Tôi đoán điều này khác trên Windows hoặc đã thay đổi với các phiên bản SDK mới nhất. (Bạn có thể kiểm tra với netstat -ban.)

  1. Tôi đã cài đặt WinSSHD trên máy chạy trình giả lập. (Tôi tin rằng nó cũng sẽ hoạt động với freeSSHd, nhưng tôi không thể đăng nhập được ở đó.)

  2. Tôi đã mở cổng 22 (TCP) trong Tường lửa của Windows. (WinSSHD có thể làm điều đó cho bạn.)

  3. Tôi đã tạo một tài khoản ảo trong WinSSHD GUI.

  4. Tôi đã tạo kết nối PuTTY mới từ máy phát triển tới máy giả lập và đảm bảo rằng tôi có thể kết nối.

  5. Sau đó, tôi thiết lập đường hầm trong PuTTY: Connection -> SSH -> Tunnels

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

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

    (Kết nối và giữ cho PuTTY mở, để duy trì đường hầm.)

  6. Bây giờ tôi đã kích hoạt trình giả lập trên máy từ xa và đảm bảo rằng ADB không chạy ở đó.

  7. Tôi đã khởi động lại ADB trên máy phát triển ( adb kill-server, sau đó adb start-server).

  8. adb devicesvà trình giả lập từ xa hiển thị dưới dạng emulator-5554 device. Bây giờ tôi có thể triển khai và chạy ứng dụng của mình trực tiếp từ Eclipse / ADT, nơi trình giả lập hiển thị trong Thiết bị ảo như thể nó là một trình giả lập cục bộ.


Làm việc rất tốt! Cảm ơn vì các chi tiết.
Jim McKeeth

1
Tốt, nhưng tôi muốn làm rõ: Sau bước 4, bạn phải đóng putty, sau đó ở bước 5 mở lại, cấu hình các đường hầm và kết nối lại. Bước 6-8: đầu tiên khởi động trình giả lập, sau đó khởi động adb (trong máy chủ). Bước 9: Bạn có thể muốn khởi động lại adb trong máy khách và nhập thiết bị adb để đảm bảo rằng nó ổn. DDMS thông thường và nội dung nhật thực cũng sẽ hoạt động.
Mister Smith

@MisterSmith Điểm rất hợp lệ, tại sao bạn không gửi bản chỉnh sửa? :)
Henrik Heimbuerger

@MisterSmith Bạn có thể vui lòng chỉnh sửa câu trả lời của mình để phản ánh nhận xét này không, nó rất quan trọng đối với sự thành công của vấn đề. Ngoài ra, cảm ơn bạn, tôi hiện có thể kết nối với máy chủ của mình từ máy khách của mình.
meanbunny

20

Tôi nhận ra câu hỏi này thực sự cũ, nhưng tôi đã giải quyết vấn đề hơi khác một chút, và tôi đã mất một lúc để tìm ra giải pháp nhỏ nhặt này.

Tôi thường sử dụng PC hoặc máy tính xách tay Windows7 (tùy thuộc vào nơi tôi đang làm việc) làm giao diện người dùng của mình vì tôi thích GUI, tuy nhiên, tôi thích thực hiện tất cả chỉnh sửa / biên dịch / gỡ lỗi của mình trên một máy chủ Ubuntu không đầu vì tất cả dòng lệnh mà nó cung cấp. Mục tiêu của tôi là làm cho mỗi hệ thống windows càng trở thành một ứng dụng khách mỏng nhất có thể mà không có bất kỳ dịch vụ bổ sung nào (chẳng hạn như sshd) hoặc lỗ hổng tường lửa.

Đây là senario:

  • System-A: Hệ thống Windows7 với trình giả lập Android đang chạy
  • System-B: Máy chủ Ubuntu có cài đặt SDK

Vấn đề như đã mô tả trước đó là trình giả lập trên System-A liên kết với localhost, không phải giao diện ethernet bên ngoài, vì vậy adb trên System-B không thể truy cập trình giả lập trên System-A. Tất cả những gì bạn cần làm là thiết lập chuyển tiếp cổng từ xa trong PuTTY cho kết nối SSH của bạn với System-B. Mẹo là kiểm tra nút radio "Từ xa" khi bạn tạo hai đường hầm để hướng đường hầm bị đảo ngược (đường hầm từ máy chủ bạn đang đăng nhập đến máy khách bạn đang đăng nhập).

ảnh chụp màn hình đường hầm

Cuối cùng, kết nối với adb với "localhost" trên System-B sau khi thiết lập kết nối SSH:

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

Bây giờ bạn có thể tải xuống hình ảnh / gỡ lỗi như bình thường và việc chuyển sang một hệ thống Windows khác là một vấn đề nhỏ nếu bạn muốn mang máy tính xách tay ra ngoài và uống một chút cà phê.

Ngoài ra, bằng cách đào cổng 5037 theo cách tương tự, bạn thực sự có thể chuyển tiếp kết nối máy chủ adb của mình để bạn có thể kết nối thiết bị Android thực qua USB trên System-A và tải hình ảnh xuống nó từ System-B. Để điều này hoạt động, bạn cần đảm bảo rằng máy chủ adb đang chạy trên Hệ thống-A và không chạy trên Hệ thống-B trước khi bắt đầu phiên SSH của bạn:

Đầu tiên, khởi động máy chủ adb trên System-A (dấu nhắc lệnh)

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

Tiếp theo, giết máy chủ adb trên System-B

System-B$ adb kill-server

Cuối cùng, khởi động lại phiên ssh của bạn đến System-B và xác minh

System-B$ adb devices
List of devices attached
3435F6E6035B00EC        device

Có cách nào để làm điều này mà không cần cài đặt sdk android trên System-A không? (các cửa sổ máy?)
Keith Twombley

Không, vì máy chủ adb và trình điều khiển usb cần chạy trên System-A để giao tiếp với thiết bị.
Patrick McKinnon

Tôi cũng đã thực hiện điều này với một thiết lập như: Windows 7 (chạy trình giả lập) -> Linux (bắt buộc phải nhảy, do mạng ...) -> OS X chạy Eclipse. Tôi có thể xem các thiết bị có 'thiết bị adb' và sử dụng trình giả lập từ Eclipse. Vấn đề là nó không nhận ra mục tiêu Android của trình giả lập, vì vậy tôi phải chọn mục tiêu ở mỗi lần chạy theo cách thủ công.
Frank

Nếu bạn cần một putty cho Mac OS X, bạn có thể tìm thấy nó ở đây: mac-tools.org/putty-fur-mac-os-x/02/2012 Đối với tôi, nó hoạt động với công cụ đó.
Bruno Bieri

@PatrickMcKinnon, mọi thứ hoạt động tốt nhưng trên System-B, tôi đang bị trái phép khi gọi "thiết bị adb". Trên System-B, "thiết bị adb" cho thấy nó hoạt động tốt. Bất kỳ giúp đỡ?
Tejas Sherdiwala,

5

Tôi đã tìm thấy một cách dễ dàng để thực hiện việc này nếu hai máy của bạn nằm trong cùng một mạng riêng và do đó không cần sử dụng mã hóa SSH (đây là trường hợp phổ biến). Điều này có thể hữu ích vì đường hầm SSH có thể khá dài và khó cài đặt. Ví dụ: cài đặt một daemon SSH trong Cygwin / Windows lần đầu tiên có thể dẫn đến bỏ cuộc (tôi đã từ bỏ).

Trong Windows, những gì sau đây yêu cầu phải cài đặt Cygwin với gói httptunnel . Điều này cũng phải hoạt động trong Linux / httptunnel nhưng tôi đã không thử.

  • Chạy trình giả lập trên một trong các máy (giả sử tên máy chủ của nó là HostEmulator )

  • Khởi động Eclipse trên máy khác (chúng ta hãy gọi nó là HostEclipse )

  • Mở một thiết bị đầu cuối Cygwin trên mỗi máy, sau đó,

  • Trên HostEmulator , hãy nhập các lệnh cygwin sau :

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

hts có nghĩa là Máy chủ Http Tunnel .

Hai lệnh này tạo ra hai nửa cầu nối lắng nghe các cổng 10001 và 10001 và chuyển hướng I / O của các cổng này đến các cổng cục bộ 5554 và 5555, là các cổng được sử dụng bởi trình giả lập (thực sự là trình giả lập được lắp ráp đầu tiên - nếu bạn có một số trong số chúng đang chạy, chúng sẽ sử dụng số cổng cao hơn như đã thấy trong các câu trả lời khác của trang này).

  • Trên HostEclipse , hãy nhập những cái sau:

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

htc có nghĩa là Ứng dụng khách đường hầm Http .

Các lệnh này tạo ra các nửa cầu bị thiếu. Chúng lắng nghe các cổng cục bộ 5554 và 5555 và chuyển hướng I / O của các cổng này đến các nửa cầu mà chúng tôi đã tạo trên HostEmulator ngay trước đó.

  • Sau đó, vẫn trên HostEclipse , hãy nhập ba lệnh sau:

    adb kill-server
    adb start-server
    adb devices

Điều này khởi động lại adb vì nó không phát hiện trình giả lập từ xa. Nó phải được thực hiện một số quét khi khởi động. Và sau đó nó liệt kê các thiết bị (trình giả lập có sẵn) chỉ để kiểm tra.

  • Và ở đó bạn đi.

Bạn có thể làm việc với trình giả lập từ xa của mình như thể nó là cục bộ. Bạn phải giữ các thiết bị đầu cuối Cygwin mở trên cả hai máy nếu không bạn sẽ giết các nửa cầu mà bạn đã tạo.

Tôi đã sử dụng cổng 10000 và 10001 để trao đổi máy / máy ở đây, nhưng tất nhiên bạn có thể sử dụng các cổng khác miễn là chúng chưa được sử dụng.


2

Giải pháp của tôi cho windows + AndroVM (yêu cầu bộ điều hợp chỉ dành cho máy chủ) khi dịch vụ ssh của tôi không khởi động được. vì vậy nó không yêu cầu bất kỳ phần mềm bổ sung nào.

adb connect <Andro VM IP>
adp tcpip 555

Trên cmd nhắc chạy với tư cách quản trị viên:

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

mở cổng TCP 5555 trong tường lửa của windows.

Sau đó, từ PC thứ hai chạy:

adb connect <host ip>

1

Không có giải pháp nào được đề xuất phù hợp với tôi. Tôi đã bắt đầu từ giải pháp của Emirikol và tinh chỉnh nó, vì với Android API> 21 mới, trình giả lập xuất hiện ngoại tuyến và tôi phải truy cập cài đặt Genymotion và để trống đường dẫn Android SDK. Và từ dòng lệnh:

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

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

source: http://www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ Disclaimer, tôi là tác giả.


Câu trả lời và bài viết hoàn hảo! Nếu bạn sử dụng Genymotion, thì hãy sử dụng giải pháp này. Bài báo viết về Windows và Mac, nhưng tôi có Ubuntu cục bộ và Ubuntu từ xa và tất cả đều hoạt động tốt. Đã lưu tuần của tôi!
konstantin_doncov

1

Khi bạn chạy adb, nó sẽ bắt đầu một bản sao máy chủ của chính nó nếu một bản chưa chạy. Bạn có thể tự khởi động bản sao đó trên máy cùng với thiết bị và vì sdk 4.3 bạn có thể cung cấp cho nó tùy chọn -a để yêu cầu máy chủ đó lắng nghe các máy từ xa. Làm điều đó với lệnh sau mà không thoát:

adb -a -P 5037 máy chủ nodaemon

Trên máy bạn muốn sử dụng thiết bị, hãy đặt ADB_SERVER_SOCKET thành tcp: xxxx: 5037 trong biến môi trường (hoặc cung cấp cùng một giá trị cho mỗi lệnh gọi adb với tùy chọn -L), trong đó xxxx là địa chỉ IP hoặc tên máy chủ của máy với các thiết bị và 5037 khớp với cổng bạn đã cung cấp trong lệnh trên.

Chúng tôi sử dụng điều này để cấp quyền truy cập vào khoảng 100 trình giả lập trải rộng trên 3 máy cho một máy đang chạy thử nghiệm từ xa đến cuối cùng và cho các nhà phát triển muốn chia sẻ thiết bị thực từ xa.

Bạn có thể chuyển tiếp các cổng đến và đi từ trình giả lập với adb forward và adb reverse, và chúng sẽ xuất hiện trên máy cùng với các thiết bị (không phải máy bạn đang chạy 'adb forward').


Bạn có thể cung cấp thêm chi tiết về giải pháp này? Tôi đã làm mọi thứ như bạn nói, nhưng tôi không có bất kỳ thiết bị nào trong "Chọn mục tiêu triển khai" trong Android Studio. Tôi sử dụng Genymotion trên máy tính thứ hai.
konstantin_doncov

@ don-prog Bạn không nói liệu nó có phù hợp với bạn hay không từ dòng lệnh: adb -L tcp:remotehost:1234 devicesNếu có, thì bạn cần tìm hiểu xem Android Studio có hỗ trợ ADB từ xa hay không - tôi sẽ không ngạc nhiên nếu nó khăng khăng muốn sử dụng thiết bị cục bộ.
android.weasel

0

Tôi không có máy thứ hai với SDK để sử dụng, nhưng tôi lưu ý rằng các cổng lắng nghe của trình giả lập (mặc định 5554, 5555) đang bật 0.0.0.0, tức là có thể truy cập từ các máy từ xa và adb --helphiển thị connect <host>:<port>lệnh. Tôi cho rằng sẽ làm cho nó hiển thị trong adb devicesquá adblệnh làm việc trên đó. Đối với Eclipse, hãy thử "Chạy / Chạy cấu hình ..." và đặt Mục tiêu thành Thủ công. Điều đó cung cấp cho bạn một "trình chọn thiết bị" mà tôi đoán sẽ bao gồm trình giả lập từ xa nếu adb được kết nối với nó. Đáng để thử.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.