เป็นไปได้หรือไม่ที่จะเขียนโค้ด / คอมไพล์แอปพลิเคชัน Android บนเครื่องหนึ่งและดีบักจากระยะไกลบนโปรแกรมจำลองที่เปิดตัวในอีกเครื่อง ฉันเบื่อและเบื่อที่ตัวจำลองจะกิน CPU ครึ่งหนึ่งของแล็ปท็อปอยู่ตลอดเวลา
เป็นไปได้หรือไม่ที่จะเขียนโค้ด / คอมไพล์แอปพลิเคชัน Android บนเครื่องหนึ่งและดีบักจากระยะไกลบนโปรแกรมจำลองที่เปิดตัวในอีกเครื่อง ฉันเบื่อและเบื่อที่ตัวจำลองจะกิน CPU ครึ่งหนึ่งของแล็ปท็อปอยู่ตลอดเวลา
คำตอบ:
ฉันไม่เคยลอง (หรือสังเกตเห็น) adb connect
คำสั่งที่ cmb กล่าวถึงก่อนหน้านี้แต่ฉันสามารถยืนยันได้ว่าการส่งต่อพอร์ต TCP ด้วยตัวคุณเอง - เช่นผ่าน SSH - ใช้งานได้ดี
อีมูเลเตอร์จะฟังพอร์ต TCP สองพอร์ตต่ออินสแตนซ์: 5554 สำหรับอินเตอร์เฟสเทลเน็ตและ 5555 สำหรับการสื่อสารควบคุมด้วยเครื่องมือเช่น DDMS ดังนั้นคุณอาจจะหนีไปได้ด้วยพอร์ตส่งต่อเท่านั้น 5555 (แม้ว่าฉันจะลองใช้ทั้งสองอย่างเท่านั้น) อีมูเลเตอร์ที่ตามมาแต่ละตัวจะใช้ทูเปิลหมายเลขพอร์ตคู่ + คี่ที่มีอยู่ถัดไป (ฉันคิดว่าสูงถึงประมาณ 5580)
สำหรับการอ้างอิงฉันได้ทำตามขั้นตอนต่อไปนี้บนเครื่องท้องถิ่นของฉัน:
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
killall adb; adb devices
ฉันเชื่อว่าอีมูเลเตอร์พยายามแจ้งเซิร์ฟเวอร์ adb ในพื้นที่เมื่อเริ่มต้น ดังนั้นจำเป็นต้องรีสตาร์ท adb เพื่อให้สามารถตรวจสอบพอร์ต 5554+ ในเครื่องได้
โปรดสังเกตว่าlocalhost
ในคำสั่ง ssh อ้างถึงอินเตอร์เฟสโลคัลของเครื่องระยะไกล
adb devices
แสดงโปรแกรมจำลองใหม่ - emulator-5554
- และฉันสามารถใช้งานได้ราวกับว่ามันกำลังทำงานบนเครื่องของฉัน
killall adb
อยู่บนเซิร์ฟเวอร์ด้วยเช่นกันเนื่องจากโปรแกรมจำลองจะไม่ยอมรับการเชื่อมต่อหลายรายการและจะใช้offline
สำหรับเครื่องภายใน
นี่คือวิธีที่ฉันแก้ไขบน Windows ฉันติดตามการนำของคริสโตเฟอร์มามาก แต่ฉันไม่สามารถแก้ไขได้ดังนั้นคำตอบใหม่จะต้องทำ
ปัญหาที่ฉันมีคือ ADB และอีมูเลเตอร์เพิ่งฟังบน 127.0.0.1 ไม่ใช่ 0.0.0.0 สำหรับฉัน มิฉะนั้นผมจะได้ใช้TCPMon ฉันเดาว่าสิ่งนี้อาจแตกต่างกันใน Windows หรือมีการเปลี่ยนแปลงเมื่อใช้ SDK เวอร์ชันล่าสุด (คุณสามารถตรวจสอบnetstat -ban
ได้)
ฉันติดตั้งWinSSHDบนเครื่องที่เรียกใช้โปรแกรมจำลอง (ฉันเชื่อว่ามันควรจะทำงานกับ freeSSHd เช่นกัน แต่ฉันไม่สามารถเข้าสู่ระบบได้ที่นั่น)
ฉันเปิดพอร์ต 22 (TCP) ใน Windows Firewall (WinSSHD อาจสามารถทำเพื่อคุณได้)
ฉันสร้างบัญชีเสมือนใน WinSSHD GUI
ฉันสร้างการเชื่อมต่อ PuTTY ใหม่จากเครื่องพัฒนาไปยังเครื่องจำลองและตรวจสอบให้แน่ใจว่าสามารถเชื่อมต่อได้
จากนั้นฉันตั้งค่า Tunnels ใน PuTTY: Connection -> SSH -> Tunnels
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(เชื่อมต่อและเปิด PuTTY ไว้เพื่อรักษาอุโมงค์)
ตอนนี้ฉันยิงโปรแกรมจำลองบนเครื่องระยะไกลและตรวจสอบให้แน่ใจว่า ADB ไม่ทำงานที่นั่น
ฉันรีสตาร์ท ADB บนเครื่องพัฒนา ( adb kill-server
จากนั้นadb start-server
)
adb devices
และตัวจำลองระยะไกลปรากฏขึ้นเป็นemulator-5554 device
. ตอนนี้ฉันสามารถปรับใช้และเรียกใช้แอปของฉันได้โดยตรงจาก Eclipse / ADT โดยที่ตัวจำลองปรากฏขึ้นภายใต้อุปกรณ์เสมือนราวกับว่าเป็นโปรแกรมจำลองภายในเครื่อง
ฉันรู้ว่าคำถามนี้เก่ามาก แต่ฉันแก้ไขปัญหาต่างออกไปเล็กน้อยและฉันใช้เวลาสักพักในการหาวิธีแก้ปัญหาที่ไม่สำคัญนี้
ฉันมักจะใช้พีซีหรือแล็ปท็อป Windows7 (ขึ้นอยู่กับว่าฉันทำงานที่ไหน) เป็นส่วนหน้าเพราะฉันชอบ GUI อย่างไรก็ตามฉันชอบที่จะแก้ไข / รวบรวม / แก้จุดบกพร่องทั้งหมดบนเซิร์ฟเวอร์ Ubuntu ที่ไม่มีหัวเนื่องจาก อำนาจบรรทัดคำสั่งให้ เป้าหมายของฉันคือทำให้ระบบ windows แต่ละระบบเป็น thin-client ให้มากที่สุดโดยไม่ต้องมีบริการเสริม (เช่น sshd) หรือ firewall
นี่คือ Senario:
ปัญหาตามที่อธิบายไว้ก่อนหน้านี้คือตัวจำลองบน System-A ผูกกับ localhost ไม่ใช่อินเทอร์เฟซอีเธอร์เน็ตภายนอกดังนั้น adb บน System-B จึงไม่สามารถเข้าถึงอีมูเลเตอร์บน System-A ได้ สิ่งที่คุณต้องทำคือตั้งค่าการส่งต่อพอร์ตระยะไกลใน PuTTY สำหรับการเชื่อมต่อ SSH กับ System-B เคล็ดลับคือการตรวจสอบปุ่มตัวเลือก "รีโมท" เมื่อคุณสร้างทั้งสองช่องสัญญาณเพื่อให้ทิศทางของอุโมงค์กลับด้าน (การสร้างช่องสัญญาณจากเซิร์ฟเวอร์ที่คุณเข้าสู่ระบบไคลเอ็นต์ที่คุณกำลังเข้าสู่ระบบ)
สุดท้ายเชื่อมต่อกับ adb กับ "localhost" บน System-B หลังจากสร้างการเชื่อมต่อ SSH:
System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555 device
ตอนนี้คุณสามารถดาวน์โหลดอิมเมจ / ดีบักได้ตามปกติและเป็นเรื่องเล็กน้อยที่จะเปลี่ยนไปใช้ระบบ Windows อื่นหากคุณต้องการนำแล็ปท็อปออกไปดื่มกาแฟ
นอกจากนี้โดยการอุโมงค์พอร์ต 5037 ในลักษณะเดียวกันคุณสามารถส่งต่อการเชื่อมต่อเซิร์ฟเวอร์ adb ของคุณเพื่อให้คุณสามารถเชื่อมต่ออุปกรณ์ Android จริงผ่าน USB บน System-A และดาวน์โหลดภาพจาก System-B เพื่อให้สามารถใช้งานได้คุณต้องตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ adb ทำงานบน System-A และไม่ได้ทำงานบน System-B ก่อนที่จะเริ่มเซสชัน SSH ของคุณ:
ขั้นแรกเริ่มเซิร์ฟเวอร์ adb บน System-A (พร้อมรับคำสั่ง)
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
จากนั้นฆ่าเซิร์ฟเวอร์ adb บน System-B
System-B$ adb kill-server
สุดท้ายรีสตาร์ทเซสชัน ssh ของคุณเป็น System-B และตรวจสอบ
System-B$ adb devices
List of devices attached
3435F6E6035B00EC device
ฉันพบวิธีง่ายๆในการทำเช่นนี้หากเครื่องทั้งสองของคุณอยู่ในเครือข่ายส่วนตัวเดียวกันดังนั้นจึงไม่จำเป็นต้องใช้การเข้ารหัส SSH (ซึ่งเป็นกรณีทั่วไป) สิ่งนี้อาจช่วยได้เนื่องจากอุโมงค์ SSH อาจค่อนข้างยาวและติดตั้งยาก ตัวอย่างเช่นการติดตั้ง SSH daemon ภายใต้ Cygwin / Windows เป็นครั้งแรกอาจทำให้ยอมแพ้ (ดีฉันยอมแพ้)
ภายใต้ Windows, สิ่งต่อไปนี้ต้องมีการติดตั้ง Cygwin กับแพคเกจHTTPTunnel สิ่งนี้ต้องทำงานภายใต้ Linux / httptunnelด้วย แต่ฉันไม่ได้ลอง
เรียกใช้โปรแกรมจำลองบนเครื่องใดเครื่องหนึ่ง (สมมติว่าชื่อโฮสต์คือHostEmulator )
เริ่ม Eclipse บนเครื่องอื่น (เรียกว่าHostEclipse )
เปิดเทอร์มินัล Cygwin ในแต่ละเครื่องจากนั้น
บนHostEmulatorให้ป้อนคำสั่ง cygwin ต่อไปนี้ :
hts -F localhost:5554 10000
hts -F localhost:5555 10001
HTSหมายความHttp อุโมงค์เซิร์ฟเวอร์
คำสั่งทั้งสองนี้สร้าง half-bridge สองตัวที่รับฟังพอร์ต 10001 และ 10001 และเปลี่ยนเส้นทาง I / O ของพอร์ตเหล่านี้ไปยังพอร์ตในเครื่อง 5554 และ 5555 ซึ่งเป็นพอร์ตที่ใช้โดยอีมูเลเตอร์ (อันที่จริงแล้วโปรแกรมจำลองแบบ lauched ตัวแรก - หากคุณมีหลายคนที่ทำงานอยู่พวกเขาจะใช้หมายเลขพอร์ตที่สูงขึ้นตามที่เห็นในการตอบกลับอื่น ๆ ของหน้านี้)
ในHostEclipseให้ป้อนสิ่งเหล่านี้ :
htc -F 5554 HostEmulator:10000
htc -F 5555 HostEmulator:10001
HTCวิธีHttp อุโมงค์ไคลเอ็นต์
คำสั่งเหล่านี้สร้างครึ่งสะพานที่ขาดหายไป พวกเขาฟังพอร์ตโลคัล 5554 และ 5555 และเปลี่ยนเส้นทาง I / O ของพอร์ตเหล่านี้ไปยังฮาล์ฟบริดจ์ที่เราสร้างบนHostEmulatorก่อนหน้านี้
จากนั้นยังคงอยู่บนHostEclipseให้ป้อนคำสั่งทั้งสามนี้ :
adb kill-server
adb start-server
adb devices
สิ่งนี้จะรีสตาร์ท adb เนื่องจากไม่พบตัวจำลองระยะไกลเป็นอย่างอื่น ต้องทำการสแกนเมื่อเริ่มต้นระบบ จากนั้นจะแสดงรายการอุปกรณ์ (ตัวเลียนแบบที่มีอยู่) เพื่อตรวจสอบ
คุณสามารถทำงานกับโปรแกรมจำลองระยะไกลได้ราวกับอยู่ในเครื่อง คุณต้องเปิดเทอร์มินัล Cygwin ไว้บนเครื่องทั้งสองเครื่องมิฉะนั้นคุณจะฆ่าครึ่งสะพานที่คุณสร้างขึ้น
ฉันใช้พอร์ต 10000 และ 10001 สำหรับการแลกเปลี่ยนเครื่อง / เครื่องที่นี่ แต่แน่นอนว่าคุณสามารถใช้พอร์ตอื่นได้ตราบเท่าที่ยังไม่ได้ใช้งาน
วิธีแก้ปัญหาของฉันสำหรับ windows + AndroVM (ซึ่งต้องใช้อะแดปเตอร์โฮสต์เท่านั้น) เมื่อบริการ ssh ของฉันไม่สามารถเริ่มต้นได้ ดังนั้นจึงไม่ต้องใช้ซอฟต์แวร์เพิ่มเติมใด ๆ
adb connect <Andro VM IP>
adp tcpip 555
ในพรอมต์ cmd ให้เรียกใช้ในฐานะผู้ดูแลระบบ:
netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>
เปิดพอร์ต TCP 5555 ในไฟร์วอลล์ windows
จากนั้นจากการรันพีซีเครื่องที่สอง:
adb connect <host ip>
ไม่มีวิธีแก้ปัญหาใดที่เสนอให้ฉันได้ผล ฉันเริ่มต้นจากโซลูชันของ Emirikol และปรับแต่งมันเช่นเดียวกับ Android API ใหม่> 21 โปรแกรมจำลองจะปรากฏออฟไลน์และฉันต้องไปที่การตั้งค่า Genymotion และปล่อยให้เส้นทาง Android SDK ว่าง และจากบรรทัดคำสั่ง:
netsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>
netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>
แหล่งที่มา: http://www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ ข้อจำกัดความรับผิดชอบฉันเป็นผู้เขียน
เมื่อคุณเรียกใช้ adb จะเริ่มต้นสำเนาเซิร์ฟเวอร์ของตัวเองหากยังไม่ได้ทำงาน คุณสามารถเริ่มการคัดลอกตัวเองบนเครื่องด้วยอุปกรณ์และตั้งแต่ sdk 4.3 คุณสามารถให้ตัวเลือก -a เพื่อบอกให้เซิร์ฟเวอร์นั้นฟังสำหรับเครื่องระยะไกล ทำเช่นนั้นโดยใช้คำสั่งต่อไปนี้ซึ่งไม่ได้ออก:
adb -a -P 5037 เซิร์ฟเวอร์ nodaemon
บนเครื่องที่คุณต้องการใช้อุปกรณ์ให้ตั้งค่า ADB_SERVER_SOCKET เป็น tcp: xxxx: 5037 ในตัวแปรสภาพแวดล้อม (หรือให้ค่าเดียวกันกับการเรียกใช้ adb แต่ละรายการด้วยตัวเลือก -L) โดยที่ xxxx คือที่อยู่ IP หรือชื่อโฮสต์ของ เครื่องกับอุปกรณ์และ 5037 ตรงกับพอร์ตที่คุณให้ไว้ในคำสั่งด้านบน
เราใช้สิ่งนี้เพื่อให้เข้าถึงอีมูเลเตอร์ประมาณ 100 ตัวที่กระจายอยู่บนเครื่อง 3 เครื่องไปยังเครื่องที่รันการทดสอบแบบ end to end พร้อมกันและสำหรับนักพัฒนาที่ต้องการแชร์อุปกรณ์จริงจากระยะไกล
คุณสามารถส่งต่อพอร์ตเข้าและออกจากโปรแกรมจำลองด้วย adb forward และ adb reverse และจะปรากฏบนเครื่องพร้อมกับอุปกรณ์ต่างๆ (ไม่ใช่เครื่องที่คุณใช้ 'adb forward' จาก)
adb -L tcp:remotehost:1234 devices
ถ้าเป็นเช่นนั้นคุณต้องหาว่า Android Studio รองรับ ADB ระยะไกลหรือไม่ - มันจะไม่แปลกใจเลยถ้ามันยืนยันที่จะใช้ อุปกรณ์ท้องถิ่น
ฉันไม่มีเครื่องที่สองที่มี SDK อยู่ในมือ แต่ฉันสังเกตว่าพอร์ตฟังของอีมูเลเตอร์ (ค่าเริ่มต้น 5554, 5555) กำลังฟังอยู่0.0.0.0
นั่นคือสามารถเข้าถึงได้จากเครื่องระยะไกลและนั่นadb --help
แสดงconnect <host>:<port>
คำสั่ง ฉันคิดว่าจะทำให้มันปรากฏขึ้นadb devices
เพื่อให้adb
คำสั่งทำงานได้ สำหรับ Eclipse ให้ลอง "Run / Run Configurations ... " และตั้งค่า Target เป็น Manual นั่นทำให้คุณมี "ตัวเลือกอุปกรณ์" ซึ่งฉันเดาว่าน่าจะมีตัวจำลองระยะไกลหากเชื่อมต่อ adb คุ้มค่าที่จะลอง.