การดีบักระยะไกลด้วยโปรแกรมจำลอง Android


94

เป็นไปได้หรือไม่ที่จะเขียนโค้ด / คอมไพล์แอปพลิเคชัน Android บนเครื่องหนึ่งและดีบักจากระยะไกลบนโปรแกรมจำลองที่เปิดตัวในอีกเครื่อง ฉันเบื่อและเบื่อที่ตัวจำลองจะกิน CPU ครึ่งหนึ่งของแล็ปท็อปอยู่ตลอดเวลา

คำตอบ:


73

ฉันไม่เคยลอง (หรือสังเกตเห็น) 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- และฉันสามารถใช้งานได้ราวกับว่ามันกำลังทำงานบนเครื่องของฉัน


1
ทำงานได้อย่างมีเสน่ห์แม้กระทั่งจากเครื่อง Windows 7 ของฉันที่มีการส่งต่อพอร์ต Putty SSH ขอบคุณ.
gsbabil

1
@JimMcKeeth: ตามการกำหนดค่าเครือข่ายด้านบนเปิด Putty ไปที่ Connection> SSH> Tunnels ตอนนี้เพิ่มรายการด้วย Source-port: 5556 และ Destination: localhost: 5554 ทำซ้ำเช่นเดียวกันกับ Source-port: 5557 และ Destination: localhost: 5555 ไชโย!
gsbabil

5
เพียงจำไว้ว่าคุณต้องkillall adbอยู่บนเซิร์ฟเวอร์ด้วยเช่นกันเนื่องจากโปรแกรมจำลองจะไม่ยอมรับการเชื่อมต่อหลายรายการและจะใช้offlineสำหรับเครื่องภายใน
Henrique de Sousa

ใครช่วยอธิบายเป็นภาษาอังกฤษ
Anil GR

21

นี่คือวิธีที่ฉันแก้ไขบน Windows ฉันติดตามการนำของคริสโตเฟอร์มามาก แต่ฉันไม่สามารถแก้ไขได้ดังนั้นคำตอบใหม่จะต้องทำ

ปัญหาที่ฉันมีคือ ADB และอีมูเลเตอร์เพิ่งฟังบน 127.0.0.1 ไม่ใช่ 0.0.0.0 สำหรับฉัน มิฉะนั้นผมจะได้ใช้TCPMon ฉันเดาว่าสิ่งนี้อาจแตกต่างกันใน Windows หรือมีการเปลี่ยนแปลงเมื่อใช้ SDK เวอร์ชันล่าสุด (คุณสามารถตรวจสอบnetstat -banได้)

  1. ฉันติดตั้งWinSSHDบนเครื่องที่เรียกใช้โปรแกรมจำลอง (ฉันเชื่อว่ามันควรจะทำงานกับ freeSSHd เช่นกัน แต่ฉันไม่สามารถเข้าสู่ระบบได้ที่นั่น)

  2. ฉันเปิดพอร์ต 22 (TCP) ใน Windows Firewall (WinSSHD อาจสามารถทำเพื่อคุณได้)

  3. ฉันสร้างบัญชีเสมือนใน WinSSHD GUI

  4. ฉันสร้างการเชื่อมต่อ PuTTY ใหม่จากเครื่องพัฒนาไปยังเครื่องจำลองและตรวจสอบให้แน่ใจว่าสามารถเชื่อมต่อได้

  5. จากนั้นฉันตั้งค่า Tunnels ใน PuTTY: Connection -> SSH -> Tunnels

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

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

    (เชื่อมต่อและเปิด PuTTY ไว้เพื่อรักษาอุโมงค์)

  6. ตอนนี้ฉันยิงโปรแกรมจำลองบนเครื่องระยะไกลและตรวจสอบให้แน่ใจว่า ADB ไม่ทำงานที่นั่น

  7. ฉันรีสตาร์ท ADB บนเครื่องพัฒนา ( adb kill-serverจากนั้นadb start-server)

  8. adb devicesและตัวจำลองระยะไกลปรากฏขึ้นเป็นemulator-5554 device. ตอนนี้ฉันสามารถปรับใช้และเรียกใช้แอปของฉันได้โดยตรงจาก Eclipse / ADT โดยที่ตัวจำลองปรากฏขึ้นภายใต้อุปกรณ์เสมือนราวกับว่าเป็นโปรแกรมจำลองภายในเครื่อง


ทำงานได้ดีมาก! ขอบคุณสำหรับรายละเอียด
Jim McKeeth

1
ดี แต่ฉันอยากจะชี้แจง: หลังจากขั้นตอนที่ 4 คุณต้องปิดสีโป๊วจากนั้นในขั้นตอนที่ 5 ให้เปิดอีกครั้งกำหนดค่าอุโมงค์และเชื่อมต่อใหม่ ขั้นตอนที่ 6-8: เริ่มต้นโปรแกรมจำลองก่อนจากนั้นเริ่ม adb (ในเครื่องโฮสต์) ขั้นตอนที่ 9: คุณอาจต้องการรีสตาร์ท adb ในเครื่องไคลเอนต์และพิมพ์ adb devices เพื่อให้แน่ใจว่าใช้ได้ DDMS และ eclipse ปกติควรใช้งานได้เช่นกัน
Mister Smith

@MisterSmith คะแนนถูกต้องมากทำไมคุณไม่ส่งการแก้ไข? :)
Henrik Heimbuerger

@MisterSmith คุณช่วยแก้ไขคำตอบของคุณเพื่อแสดงความคิดเห็นนี้ได้ไหมมันสำคัญมากต่อความสำเร็จของปัญหา นอกจากนี้ขอขอบคุณตอนนี้ฉันสามารถเชื่อมต่อกับโฮสต์ของฉันจากเครื่องแขกของฉันได้แล้ว
meanbunny

21

ฉันรู้ว่าคำถามนี้เก่ามาก แต่ฉันแก้ไขปัญหาต่างออกไปเล็กน้อยและฉันใช้เวลาสักพักในการหาวิธีแก้ปัญหาที่ไม่สำคัญนี้

ฉันมักจะใช้พีซีหรือแล็ปท็อป Windows7 (ขึ้นอยู่กับว่าฉันทำงานที่ไหน) เป็นส่วนหน้าเพราะฉันชอบ GUI อย่างไรก็ตามฉันชอบที่จะแก้ไข / รวบรวม / แก้จุดบกพร่องทั้งหมดบนเซิร์ฟเวอร์ Ubuntu ที่ไม่มีหัวเนื่องจาก อำนาจบรรทัดคำสั่งให้ เป้าหมายของฉันคือทำให้ระบบ windows แต่ละระบบเป็น thin-client ให้มากที่สุดโดยไม่ต้องมีบริการเสริม (เช่น sshd) หรือ firewall

นี่คือ Senario:

  • System-A: ระบบ Windows7 พร้อมโปรแกรมจำลอง Android ที่ทำงานอยู่
  • System-B: เซิร์ฟเวอร์ Ubuntu ที่ติดตั้ง SDK

ปัญหาตามที่อธิบายไว้ก่อนหน้านี้คือตัวจำลองบน 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

มีวิธีใดบ้างที่ทำได้โดยไม่ต้องติดตั้ง android sdk ใน System-A? (เครื่อง windows?)
Keith Twombley

ไม่ได้เนื่องจากเซิร์ฟเวอร์ adb และไดรเวอร์ usb จำเป็นต้องทำงานบน System-A เพื่อสื่อสารกับอุปกรณ์
Patrick McKinnon

ฉันได้ทำสิ่งนี้เช่นกันกับการตั้งค่าเช่น: Windows 7 (ใช้โปรแกรมจำลอง) -> Linux (ต้องการ hop เนื่องจากเครือข่าย ... ฉันสามารถดูอุปกรณ์ที่มี 'อุปกรณ์ adb' และใช้โปรแกรมจำลองจาก Eclipse ได้ ปัญหาคือมันไม่รู้จักเป้าหมาย Android ของโปรแกรมจำลองดังนั้นฉันต้องเลือกเป้าหมายในการรันแต่ละครั้งด้วยตนเอง
Frank

หากคุณต้องการสีโป๊วสำหรับMac OS X คุณสามารถหาได้ที่นี่: mac-tools.org/putty-fur-mac-os-x/02/2012สำหรับฉันมันใช้งานได้กับเครื่องมือนั้น
Bruno Bieri

@PatrickMcKinnon สิ่งนี้ทำงานได้ดี แต่ใน System-B ฉันไม่ได้รับอนุญาตเมื่อเรียก "อุปกรณ์ adb" บน System-B "อุปกรณ์ adb" แสดงว่าทำงานได้ดี ความช่วยเหลือใด ๆ
Tejas Sherdiwala

6

ฉันพบวิธีง่ายๆในการทำเช่นนี้หากเครื่องทั้งสองของคุณอยู่ในเครือข่ายส่วนตัวเดียวกันดังนั้นจึงไม่จำเป็นต้องใช้การเข้ารหัส 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 สำหรับการแลกเปลี่ยนเครื่อง / เครื่องที่นี่ แต่แน่นอนว่าคุณสามารถใช้พอร์ตอื่นได้ตราบเท่าที่ยังไม่ได้ใช้งาน


2

วิธีแก้ปัญหาของฉันสำหรับ 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>

1

ไม่มีวิธีแก้ปัญหาใดที่เสนอให้ฉันได้ผล ฉันเริ่มต้นจากโซลูชันของ 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/ ข้อจำกัดความรับผิดชอบฉันเป็นผู้เขียน


คำตอบและบทความที่สมบูรณ์แบบ! หากคุณใช้ Genymotion ให้ใช้วิธีนี้ บทความนี้เขียนเกี่ยวกับ Windows และ Mac แต่ฉันมี Ubuntu ในเครื่องและ Ubuntu ระยะไกลและใช้งานได้ดี บันทึกสัปดาห์ของฉัน!
konstantin_doncov

1

เมื่อคุณเรียกใช้ 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' จาก)


คุณสามารถให้รายละเอียดเพิ่มเติมเกี่ยวกับโซลูชันนี้ได้หรือไม่? ฉันทำทุกอย่างตามที่คุณพูด แต่ฉันไม่มีอุปกรณ์ใน "Select Deployment Target" ใน Android Studio ฉันใช้ Genymotion บนคอมพิวเตอร์เครื่องที่สอง
konstantin_doncov

@ don-prog คุณไม่ได้บอกว่ามันเหมาะกับคุณหรือไม่จากบรรทัดคำสั่ง: adb -L tcp:remotehost:1234 devicesถ้าเป็นเช่นนั้นคุณต้องหาว่า Android Studio รองรับ ADB ระยะไกลหรือไม่ - มันจะไม่แปลกใจเลยถ้ามันยืนยันที่จะใช้ อุปกรณ์ท้องถิ่น
android.weasel

0

ฉันไม่มีเครื่องที่สองที่มี SDK อยู่ในมือ แต่ฉันสังเกตว่าพอร์ตฟังของอีมูเลเตอร์ (ค่าเริ่มต้น 5554, 5555) กำลังฟังอยู่0.0.0.0นั่นคือสามารถเข้าถึงได้จากเครื่องระยะไกลและนั่นadb --helpแสดงconnect <host>:<port>คำสั่ง ฉันคิดว่าจะทำให้มันปรากฏขึ้นadb devicesเพื่อให้adbคำสั่งทำงานได้ สำหรับ Eclipse ให้ลอง "Run / Run Configurations ... " และตั้งค่า Target เป็น Manual นั่นทำให้คุณมี "ตัวเลือกอุปกรณ์" ซึ่งฉันเดาว่าน่าจะมีตัวจำลองระยะไกลหากเชื่อมต่อ adb คุ้มค่าที่จะลอง.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.