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:
Trước đây tôi chưa thử (hoặc thậm chí nhận thấy) adb connect
lệ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 localhost
trong ssh đề cập đến giao diện cục bộ của máy từ xa .
adb devices
hiể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.
killall adb
trê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ẽ offline
dành cho máy cục bộ.
Đâ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
.)
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 ở đó.)
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.)
Tôi đã tạo một tài khoản ảo trong WinSSHD GUI.
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.
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.)
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 ở đó.
Tôi đã khởi động lại ADB trên máy phát triển ( adb kill-server
, sau đó adb start-server
).
adb devices
và 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ộ.
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:
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).
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
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.
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.
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>
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ả.
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').
adb -L tcp:remotehost:1234 devices
Nế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ộ.
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 --help
hiển thị connect <host>:<port>
lệnh. Tôi cho rằng sẽ làm cho nó hiển thị trong adb devices
quá adb
lệ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ử.