Câu hỏi Gỡ lỗi từ xa bằng trình giả lập Android


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ột trình khác không? Tôi bị bệnh và mệt mỏi với giả lập liên tục ăn một nửa CPU của máy tính xách tay của tôi.


76
2017-11-18 07:08


gốc




Các câu trả lời:


Trước đây tôi chưa thử (hoặc thậm chí chú ý) adb connect lệnh mà cmb đã đề cập, nhưng tôi có thể xác nhận rằng chuyển tiếp các cổng TCP chính mình - 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 trên mỗi trường hợp: 5554 cho giao tiếp telnet và 5555 để liên lạc điều khiển với các công cụ như DDMS. Vì vậy, bạn có thể có thể nhận được ngay với chỉ chuyển tiếp cổng 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 sẽ có bộ số cổng lẻ + lẻ có sẵn tiếp theo (lên tới khoảng 5580, tôi nghĩ).

Để 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 sẽ cố gắng thông báo cho một 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ò các cổng 5554+ cục bộ.

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

adb devices cho thấy một trình mô phỏng 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.


61
2017-12-19 01:30



hoạt động như một sự quyến rũ, thậm chí từ máy tính Windows 7 của tôi với cổng chuyển tiếp Putty SSH. Cảm ơn bạn. - gsbabil
@gsbabil Lệnh cho Putty SSH là gì? - Jim McKeeth
@JimMcKeeth: Dựa trên cấu hình mạng ở trên, mở Putty, đi đến Connection> SSH> Tunnels. Bây giờ thêm một mục với Source-port: 5556 và Destination: localhost: 5554. Lặp lại tương tự với Source-port: 5557 và Destination: localhost: 5555. Chúc mừng! - gsbabil
Chỉ cần nhớ bạn cần phải killall adb trên máy chủ, vì trình mô phỏng sẽ không chấp nhận nhiều kết nối và sẽ offline cho máy địa phương. - Henrique de Sousa
Cảm ơn, giải pháp này hoạt động. - Xin Meng


Đây là cách tôi giải quyết nó trên Windows. Tôi theo đuổi Christopher rất nhiều, nhưng tôi không thể chỉnh sửa, nên 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 là khác nhau trên Windows hoặc đã thay đổi với 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 mô phỏng. (Tôi tin rằng nó sẽ làm việc với freeSSHd là tốt, nhưng tôi không thể có được một đăng nhập làm việ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 giao diện WinSSHD.

  4. Tôi đã tạo một kết nối PuTTY mới từ máy phát triển đến máy mô phỏng 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ữ PuTTY mở, để duy trì đường hầm.)

  6. Bây giờ tôi đã kích hoạt trình mô phỏng 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 devices và trình giả lập từ xa xuất hiện emulator-5554 device. Bây giờ tôi có thể triển khai và chạy ứng dụng của tôi 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 mô phỏng cục bộ.


19
2018-05-08 00:15



Làm việc tuyệt vời! Cảm ơn các chi tiết. - Jim McKeeth
Nice, nhưng tôi muốn làm rõ: Sau bước 4 bạn phải đóng putty, sau đó trong bước 5 mở nó một lần nữa, cấu hình các đường hầm và kết nối lại. Các bước 6-8: bộ mô phỏng bắt đầu đầu tiên, 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 các thiết bị adb để đảm bảo rằng nó ổn. DDMS thông thường và các công cụ nhật thực cũng hoạt động tốt. - Mister Smith
@MisterSmith Rất hợp lệ, tại sao bạn không gửi 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 bạn để phản ánh nhận xét này, 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 bây giờ có thể kết nối với máy chủ của tôi từ máy khách của tôi. - meanbunny


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 tầm thường này.

Tôi thường sử dụng PC hoặc laptop Windows7 (tùy thuộc vào nơi tôi đang làm việc) như giao diện người dùng vì tôi thích GUI, tuy nhiên tôi thích chỉnh sửa / biên dịch / gỡ lỗi trên 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 cửa sổ hệ thống càng nhiều khách hàng mỏng càng tốt mà không cần thêm bất kỳ dịch vụ nào (chẳng hạn như sshd) hoặc lỗ hổng tường lửa.

Đây là senario:

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

Vấn đề như mô tả ở trên là 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, do đó adb trên System-B không thể truy cập trình mô phỏng trên System-A. Tất cả những gì bạn cần làm là thiết lập cổng chuyển tiếp từ xa trong PuTTY cho kết nối SSH của bạn tới System-B. Bí quyết là kiểm tra nút radio "Từ xa" khi bạn tạo hai đường hầm để hướng đường hầm được đảo ngược (đường hầm từ máy chủ bạn đang đăng nhập vào máy khách mà bạn đang đăng nhập).

tunnel screenshot

Cuối cùng, kết nối với adb tớ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à nó là một vấn đề tầm thường để chuyển sang một hệ thống Windows khác nếu bạn muốn lấy máy tính xách tay của bạn ra và nhận được một số cà phê.

Ngoài ra, bằng cách cũng hầm cổng 5037 theo cùng một cách bạn thực sự có thể chuyển tiếp kết nối máy chủ adb của bạn để bạn có thể kết nối thiết bị Android thực trên USB trên System-A và tải hình ảnh xuống từ System-B. Để làm việc này, bạn cần đảm bảo rằng máy chủ adb đang chạy trên System-A và không chạy trên System-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 (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, hãy 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 vào System-B và xác minh

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

16
2018-04-08 03:48



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? (máy cửa sổ?) - Keith Twombley
Không, bởi vì máy chủ adb và trình điều khiển USB cần phải chạy trên System-A để giao tiếp với thiết bị. - Patrick McKinnon
Tôi đã làm điều này quá với một thiết lập như: Windows 7 (chạy giả lập) -> Linux (yêu cầu hop, do mạng ...) -> OS X chạy Eclipse. Tôi có thể thấy 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 mô phỏng, vì vậy tôi phải chọn mục tiêu ở mỗi lần chạy 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ó đã làm việc với công cụ đó. - Bruno Bieri
@PatrickMcKinnon điều làm việc tốt nhưng trên System-B, tôi nhận được trái phép khi gọi "thiết bị adb". Trên System-B "adb devices" cho thấy nó hoạt động tốt. Bất kỳ giúp đỡ? - Tejas


Tôi tìm thấy một cách dễ dàng để làm điều 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ể giúp ích như một đường hầm SSH có thể khá dài và khó cài đặt. Ví dụ, cài đặt một SSH daemon dưới Cygwin / Windows lần đầu tiên có thể dẫn đến bỏ cuộc (tốt, tôi đã từ bỏ).

Trong Windows, những gì sau yêu cầu phải cài đặt Cygwin với gói httptunnel. Điều này phải hoạt động dưới Linux / httptunnel nhưng tôi cũng 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 (hãy gọi nó là HostEclipse)

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

  • Trên HostEmulator, nhập các lệnh Cygwin sau:

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

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

Hai lệnh này tạo ra hai nửa cầu 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 địa phương 5554 và 5555, là các cổng được trình giả lập sử dụng (thực sự là trình mô phỏng lần đầu tiên - nếu bạn là một vài người trong số họ chạy họ sẽ sử dụng số cổng cao hơn như đã thấy trong các trả lời khác của trang này).

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

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

htc có nghĩa Http Tunnel Client.

Các lệnh này tạo ra nửa cầu còn thiếu. Họ lắng nghe các cổng địa phương 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 HostEmulatorngay trước đó.

  • Sau đó, vẫn tiếp tục HostEclipse, nhập ba lệnh này:

    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ố chức năng quét khi khởi động. Và sau đó nó liệt kê các thiết bị (các 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 bạn 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 nửa cây cầu bạn tạo ra.

Tôi đã sử dụng cổng 10000 và 10001 để trao đổi máy / máy tại đâ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.


4
2017-08-24 22:04





Điện thoại của nhà phát triển ít tốn kém hơn máy tính bổ sung và có thể được sửa lỗi từ xa. Nó có lợi ích bổ sung khi có tất cả các cảm biến tùy chọn mà trình giả lập không hiển thị theo mặc định.

Tôi đặc biệt khuyên bạn nên có điện thoại của nhà phát triển để thử nghiệm.


2
2017-11-21 15:55





Giải pháp của tôi dành 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 như admin:

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

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

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

adb connect <host ip>

2
2018-06-05 08:50





Tôi không có một máy thứ hai với SDK để bàn tay, nhưng tôi lưu ý rằng các cổng nghe giả lập (mặc định 5554, 5555) đang lắng nghe 0.0.0.0, tức là có thể truy cập từ các máy từ xa và adb --help Cho thấy một connect <host>:<port> chỉ huy. Tôi cho rằng điều đó sẽ làm cho nó hiển thị trong adb devices vì thế adb lệnh hoạt động trên đó. Đối với Eclipse, hãy thử "Run / Run Configurations ..." và đặt Target to Manual. Điều đó mang lại cho bạn một "lựa chọn thiết bị" mà tôi đoán sẽ bao gồm một trình mô phỏng từ xa nếu adb được kết nối với nó. Đáng thử.


0
2017-11-18 14:38





Không có giải pháp được đề xuất nào 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ó, như với Android API mới> 21 trình giả lập đã xuất hiện ngoại tuyến và tôi phải đi tới 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>

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


0
2017-10-02 17:25





Khi bạn chạy adb, nó bắt đầu 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ể bắt đầu bản sao đó trên máy bằng thiết bị và kể từ sdk 4.3 bạn có thể cung cấp cho nó tùy chọn -a để cho máy chủ đó nghe các máy từ xa. Làm điều đó với lệnh sau 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ị từ, đặt ADB_SERVER_SOCKET thành tcp: xxxx: 5037 trong biến môi trường (hoặc cung cấp cùng giá trị cho mỗi lời 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 để cung 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 chạy kết thúc đến cuối kiểm tra song song 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 về phía trước và ngược lại, và chúng sẽ xuất hiện trên máy với các thiết bị.


0
2018-06-21 05:41