2009-11-18 42 views
73

Có thể viết mã/biên dịch ứng dụng Android trên một máy và gỡ lỗi từ xa trên trình mô phỏng được khởi chạy trên một máy 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.Gỡ lỗi từ xa bằng trình giả lập Android

Trả lời

56

Trước đây tôi chưa thử (hoặc thậm chí được chú ý), lệnh adb connect đã được đề cập, nhưng tôi có thể xác nhận rằng chuyển tiếp cổng TCP cho 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 diện 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 đã làm theo các bước sau trên máy tính địa phương của tôi:

  • ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 [email protected]
  • killall adb; adb devices

Tôi tin rằng giả lập cố gắng thông báo cho một máy chủ adb địa phương lúc 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 máy từ xa từ xa.

adb devices hiển thị 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 nét duyên dáng, 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

+0

@gsbabil Lệnh cho Putty SSH là gì? –

+1

@JimMcKeeth: Dựa trên cấu hình mạng ở trên, mở Putty, đi tới 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

0

Tôi không có một máy thứ hai với SDK để bàn, nhưng tôi lưu ý của giả lập lắng nghe cổng (mặc định 5554, 5555) đều được lắng nghe trên 0.0.0.0, tức là có thể truy cập từ các máy tính từ xa, và rằng adb --help cho thấy một lệnh connect <host>:<port> . Tôi giả định rằng nó sẽ hiển thị trong các câu lệnh adb devices để adb 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ử.

2

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

18

Đâ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 vừa lắng 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 bộ 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 kết nối PuTTY mới từ máy phát triển đến máy mô phỏng và đảm bảo tôi có thể kết nối.

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

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

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

    (Connect và giữ Đặt TY mở, để duy trì đường hầm.)

  6. Bây giờ tôi đã khởi chạy 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 devices và trình mô phỏng từ xa hiển thị là 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ộ.

+0

Đã làm việc tuyệt vời! Cảm ơn các chi tiết. –

+1

Đẹp, 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. –

+0

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

15

Tôi nhận thấy câu hỏi này thực sự cũ, nhưng tôi đã giải quyết được vấn đề hơi khác một chút và tôi mất một thời gian để 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) làm 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ả sức mạnh 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.

Vì vậy, đây là senario:

  • System-A: hệ thống với giả lập Android chạy
  • System-B Windows7: Ubuntu máy chủ với SDK được cài đặt

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 giả lập 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 để "localhost" vào 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 hình ảnh/debug như bình thường, và nó là một tầm thường vấn đề để 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ách tương tự, bạn có thể thực sự chuyển tiếp kết nối máy chủ adb để có thể kết nối thiết bị Android thực trên USB trên Hệ thống-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:

Trước tiên, hãy khởi động máy chủ adb trên 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 

Tiếp theo, giết server adb vào System-B

System-B$ adb kill-server 

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

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

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ổ?) –

+0

Không, 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ị. –

+0

Tôi cũng đã thực hiện việc này với thiết lập như: Windows 7 (trình chạy giả lập) -> Linux (yêu cầu hop, do mạng ...) -> OS X đang 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 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

4

Tôi đã tìm thấy một cách dễ dàng để thực hiện đ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 cũng phải hoạt động trong Linux/httptunnel nhưng tôi không thử.

  • Chạy giả lập trên một trong những 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ó HostEclipse)

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

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

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

HTS nghĩa Http Tunnel server.

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

  • On HostEclipse, nhập những cái:

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

htc nghĩa Http Tunnel Khách hàng.

Các lệnh này tạo 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 nửa cầu mà chúng tôi đã tạo trên HostEmulator ngay trước đây.

  • Sau đó, vẫn còn trên HostEclipse, nhập ba lệnh dưới đây:

    adb kill-server 
    adb start-server 
    adb devices 
    

này khởi động lại adb vì nó không phát hiện ra sự giả lập từ xa khác. 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 đã đến đó.

Bạn có thể làm việc với trình mô phỏng từ xa như thể 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.

2

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 

On chạy cmd 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ác cửa sổ tường lửa.

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

adb connect <host ip> 
0

Không ai trong số các giải pháp được đề nghị làm việc cho tôi. Tôi đã bắt đầu từ giải pháp của Emirikol và tinh chỉnh nó, như với API Android mới> 21 trình mô phỏng đang xuất hiện ngoại tuyến và tôi phải chuyển đến 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ả.

Các vấn đề liên quan