ตั้งค่าเครือข่าย Android Emulator

โปรแกรมจำลองมีฟีเจอร์เครือข่ายที่หลากหลายซึ่งคุณสามารถใช้เพื่อ ตั้งค่าสภาพแวดล้อมการจำลองและการทดสอบที่ซับซ้อนสำหรับแอปของคุณ หน้านี้ จะแนะนำสถาปัตยกรรมและความสามารถของเครือข่ายโปรแกรมจำลอง

พื้นที่ที่อยู่เครือข่าย

แต่ละอินสแตนซ์ของโปรแกรมจำลองจะทำงานอยู่เบื้องหลังเราเตอร์เสมือนหรือบริการไฟร์วอลล์ ซึ่งแยกอินสแตนซ์ดังกล่าวออกจากอินเทอร์เฟซและการตั้งค่าเครือข่ายของเครื่องพัฒนา และจากอินเทอร์เน็ต อุปกรณ์ที่จำลองไม่สามารถตรวจหาเครื่องพัฒนา หรืออินสแตนซ์โปรแกรมจำลองอื่นๆ ในเครือข่ายได้ โดยจะตรวจจับได้เฉพาะว่าอุปกรณ์ เชื่อมต่อผ่านอีเทอร์เน็ตกับเราเตอร์หรือไฟร์วอลล์

เราเตอร์เสมือนสำหรับแต่ละอินสแตนซ์จะจัดการพื้นที่ที่อยู่เครือข่าย 10.0.2/24 ที่อยู่ทั้งหมดที่จัดการโดยเราเตอร์จะอยู่ในรูปแบบ 10.0.2.xx โดย xx คือตัวเลข ที่อยู่ในพื้นที่นี้จะได้รับการจัดสรรล่วงหน้าโดยโปรแกรมจำลองหรือเราเตอร์ดังนี้

ที่อยู่เครือข่าย คำอธิบาย
10.0.2.1 ที่อยู่เราเตอร์หรือเกตเวย์
10.0.2.2 นามแฝงพิเศษสำหรับอินเทอร์เฟซลูปแบ็กของโฮสต์ (127.0.0.1 ในเครื่องพัฒนา)
10.0.2.3 เซิร์ฟเวอร์ DNS แรก
10.0.2.4 / 10.0.2.5 / 10.0.2.6 เซิร์ฟเวอร์ DNS ที่ 2, 3 และ 4 (ไม่บังคับ)
10.0.2.15 เครือข่ายอุปกรณ์จำลองเมื่อเชื่อมต่อโดยใช้อีเทอร์เน็ต
10.0.2.16 เครือข่ายอุปกรณ์จำลองเมื่อเชื่อมต่อโดยใช้ Wi-Fi
127.0.0.1 อินเทอร์เฟซการวนรอบของอุปกรณ์ที่จำลอง

อินสแตนซ์อีมูเลเตอร์ที่ทำงานทั้งหมดจะใช้การกำหนดที่อยู่เดียวกัน ซึ่งหมายความว่าหากคุณมีอินสแตนซ์ 2 รายการที่ทำงานพร้อมกันในเครื่อง อินสแตนซ์แต่ละรายการจะมีเราเตอร์ของตัวเอง และอินสแตนซ์แต่ละรายการจะมีที่อยู่ IP เป็น 10.0.2.15 เราเตอร์จะแยกอินสแตนซ์ออกจากกันและอินสแตนซ์จะตรวจหา กันและกันในเครือข่ายเดียวกันไม่ได้ ดูข้อมูลเกี่ยวกับวิธี อนุญาตให้อินสแตนซ์โปรแกรมจำลองสื่อสารผ่าน TCP/UDP ได้ที่ส่วนเกี่ยวกับการเชื่อมต่ออินสแตนซ์โปรแกรมจำลอง

ที่อยู่ 127.0.0.1 ในเครื่องที่ใช้พัฒนาจะสอดคล้องกับอินเทอร์เฟซ Loopback ของโปรแกรมจำลอง หากต้องการเข้าถึงบริการที่ทำงาน ในอินเทอร์เฟซ Loopback ของเครื่องพัฒนา ให้ใช้ที่อยู่พิเศษ 10.0.2.2 แทน

ที่อยู่ที่จัดสรรไว้ล่วงหน้าของอุปกรณ์ที่จำลองจะ เฉพาะเจาะจงสำหรับ Android Emulator และมีแนวโน้มที่จะแตกต่างจากอุปกรณ์จริง อย่างมาก (ซึ่งมีแนวโน้มที่จะมีการแปลที่อยู่เครือข่ายด้วย โดยเฉพาะ ที่อยู่หลังเราเตอร์หรือไฟร์วอลล์)

ข้อจำกัดด้านเครือข่ายภายใน

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

  • ไฟร์วอลล์ โปรแกรมที่ทำงานในเครื่องของคุณอาจบล็อกการสื่อสารกับอุปกรณ์ที่จำลอง
  • การสื่อสารกับอุปกรณ์ที่จำลองอาจถูกบล็อกโดยไฟร์วอลล์หรือเราเตอร์ (จริง) อื่นที่เครื่องของคุณเชื่อมต่ออยู่

เราเตอร์เสมือนของโปรแกรมจำลองควรจัดการการเชื่อมต่อและข้อความ TCP และ UDP ขาออกทั้งหมดในนามของอุปกรณ์ที่จำลองได้ ตราบใดที่สภาพแวดล้อมเครือข่ายของเครื่องพัฒนาซอฟต์แวร์อนุญาต ไม่มี ข้อจำกัดในตัวเกี่ยวกับหมายเลขหรือช่วงพอร์ต มีเพียงข้อจำกัดที่กำหนดโดย ระบบปฏิบัติการโฮสต์และเครือข่ายของคุณเท่านั้น

โปรแกรมจำลองอาจไม่รองรับโปรโตคอลอื่นๆ (เช่น ICMP ซึ่งใช้สำหรับ "ping") ทั้งนี้ขึ้นอยู่กับสภาพแวดล้อม ปัจจุบัน โปรแกรมจำลองยังไม่รองรับ IGMP หรือการส่งแบบหลายผู้รับ

ใช้การเปลี่ยนเส้นทางเครือข่าย

หากต้องการสื่อสารกับอินสแตนซ์โปรแกรมจำลองที่อยู่หลังเราเตอร์เสมือน ให้ตั้งค่าการเปลี่ยนเส้นทางเครือข่ายในเราเตอร์เสมือน จากนั้นไคลเอ็นต์จะเชื่อมต่อ กับพอร์ตสำหรับผู้มาเยือนที่ระบุในเราเตอร์ได้ ขณะที่เราเตอร์จะนำการรับส่งข้อมูล ไปยังและจากพอร์ตนั้นไปยังพอร์ตโฮสต์ของอุปกรณ์ที่จำลอง

หากต้องการตั้งค่าการเปลี่ยนเส้นทางเครือข่าย ให้สร้างการแมปโฮสต์และแขกรับเชิญ พอร์ตและที่อยู่บนอินสแตนซ์โปรแกรมจำลอง คุณตั้งค่าการเปลี่ยนเส้นทางเครือข่ายได้ 2 วิธี ได้แก่ การใช้คำสั่งคอนโซลของโปรแกรมจำลองและการใช้เครื่องมือ Android Debug Bridge (adb) ตามที่อธิบายไว้ในส่วนต่อไปนี้

ตั้งค่าการเปลี่ยนเส้นทางผ่านคอนโซลโปรแกรมจำลอง

อินสแตนซ์โปรแกรมจำลองแต่ละรายการมีคอนโซลควบคุมที่คุณเชื่อมต่อและ ออกคำสั่งที่เฉพาะเจาะจงกับอินสแตนซ์นั้นได้ ใช้ redirคำสั่งคอนโซลเพื่อตั้งค่าการเปลี่ยนเส้นทางตามที่จำเป็นสำหรับ อินสแตนซ์โปรแกรมจำลอง

ก่อนอื่น ให้กำหนดหมายเลขพอร์ตของคอนโซลสำหรับอินสแตนซ์อีมูเลเตอร์เป้าหมาย เช่น หมายเลขพอร์ตคอนโซลสำหรับอินสแตนซ์โปรแกรมจำลองเครื่องแรกที่เปิดใช้คือ 5554 จากนั้นเชื่อมต่อกับคอนโซลของอินสแตนซ์โปรแกรมจำลองเป้าหมาย โดยระบุ หมายเลขพอร์ตคอนโซล ดังนี้

telnet localhost 5554

เมื่อเชื่อมต่อแล้ว คุณต้องตรวจสอบสิทธิ์ก่อนจึงจะตั้งค่าการเปลี่ยนเส้นทางได้ ดูรายละเอียดวิธีดำเนินการได้ที่หัวข้อเริ่มและหยุดเซสชันคอนโซล เมื่อตรวจสอบสิทธิ์แล้ว ให้ใช้คำสั่ง redir เพื่อทำงานกับการเปลี่ยนเส้นทาง

หากต้องการเพิ่มการเปลี่ยนเส้นทาง ให้ใช้คำสั่งต่อไปนี้

redir add <protocol>:<host-port>:<guest-port>

โดย <protocol> คือ tcp หรือ udp และ <host-port> กับ <guest-port> จะตั้งค่า การแมประหว่างเครื่องของคุณกับระบบที่จำลอง

เช่น คำสั่งต่อไปนี้จะตั้งค่าการเปลี่ยนเส้นทางที่จัดการการเชื่อมต่อ TCP ขาเข้าทั้งหมดไปยังเครื่องโฮสต์ (การพัฒนา) ที่ 127.0.0.1:5000 และส่งต่อการเชื่อมต่อเหล่านั้นไปยังระบบที่จำลองที่ 10.0.2.15:6000

redir add tcp:5000:6000

หากต้องการลบการเปลี่ยนเส้นทาง ให้ใช้คำสั่ง redir del หากต้องการ แสดงรายการการเปลี่ยนเส้นทางทั้งหมดสำหรับอินสแตนซ์ที่เฉพาะเจาะจง ให้ใช้ redir list ดูข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งคอนโซลเหล่านี้และคำสั่งอื่นๆ ได้ที่ ส่งคำสั่งคอนโซลโปรแกรมจำลอง

โปรดทราบว่าหมายเลขพอร์ตถูกจำกัดโดยสภาพแวดล้อมในพื้นที่ของคุณ โดยปกติแล้ว หมายความว่าคุณจะใช้หมายเลขพอร์ตโฮสต์ที่ต่ำกว่า 1024 ไม่ได้หากไม่มีสิทธิ์ของผู้ดูแลระบบ พิเศษ นอกจากนี้ คุณจะตั้งค่าการเปลี่ยนเส้นทางสำหรับ พอร์ตโฮสต์ที่กระบวนการอื่นในเครื่องของคุณใช้อยู่แล้วไม่ได้ ในกรณีนี้ redir จะสร้างข้อความแสดงข้อผิดพลาดเพื่อแจ้งให้ทราบ

ตั้งค่าการเปลี่ยนเส้นทางผ่าน adb

เครื่องมือ Android Debug Bridge (adb) มีการส่งต่อพอร์ต ซึ่งเป็นวิธีอื่น ในการตั้งค่าการเปลี่ยนเส้นทางเครือข่าย ดูข้อมูลเพิ่มเติมได้ที่ตั้งค่าการส่งต่อพอร์ตในadb เอกสารประกอบ

โปรดทราบว่าขณะนี้ adb ยังไม่มีวิธีนำการเปลี่ยนเส้นทางออก นอกจากการหยุดเซิร์ฟเวอร์ adb

กำหนดค่าการตั้งค่า DNS ของโปรแกรมจำลอง

เมื่อเริ่มต้น โปรแกรมจำลองจะอ่านรายการเซิร์ฟเวอร์ DNS ที่ระบบของคุณ ใช้อยู่ในปัจจุบัน จากนั้นจะจัดเก็บที่อยู่ IP ของเซิร์ฟเวอร์สูงสุด 4 เครื่องในรายการนี้ และตั้งค่าชื่อแทนสำหรับเซิร์ฟเวอร์เหล่านั้นในที่อยู่ที่จำลอง 10.0.2.3, 10.0.2.4, 10.0.2.5 และ 10.0.2.6 ตามต้องการ

ใน Linux และ macOS โปรแกรมจำลองจะรับที่อยู่เซิร์ฟเวอร์ DNS โดยการแยกวิเคราะห์ไฟล์ /etc/resolv.conf ใน Windows โปรแกรมจำลองจะรับที่อยู่โดยการเรียกใช้ GetNetworkParams() API โปรดทราบว่าโดยปกติแล้วการดำเนินการนี้หมายความว่าโปรแกรมจำลองจะละเว้นเนื้อหาของไฟล์ "hosts" (/etc/hosts ใน Linux/macOS, %WINDOWS%/system32/HOSTS ใน Windows)

เมื่อเริ่มโปรแกรมจำลองจากบรรทัดคำสั่ง คุณสามารถใช้ตัวเลือก -dns-server <serverList> เพื่อระบุที่อยู่ของเซิร์ฟเวอร์ DNS ที่จะใช้ด้วยตนเอง โดย <serverList> คือรายการชื่อเซิร์ฟเวอร์หรือที่อยู่ IP ที่คั่นด้วยเครื่องหมายจุลภาค คุณอาจพบว่าตัวเลือกนี้มีประโยชน์หากพบปัญหาการแปลง DNS ในเครือข่ายจำลอง (เช่น ข้อความ "ข้อผิดพลาดเกี่ยวกับโฮสต์ที่ไม่รู้จัก" ที่ปรากฏเมื่อใช้เว็บเบราว์เซอร์)

ใช้โปรแกรมจำลองกับพร็อกซี

ในเครือข่ายขององค์กรหลายแห่ง ผู้ดูแลเครือข่ายจะปฏิเสธการเชื่อมต่ออินเทอร์เน็ตโดยตรง แต่การเชื่อมต่ออินเทอร์เน็ตต้องผ่าน พร็อกซีที่เฉพาะเจาะจง หากต้องการเข้าถึงอินเทอร์เน็ตในเครือข่ายที่มีข้อกำหนดพร็อกซี โปรแกรมจำลอง ต้องทราบว่ามีพร็อกซีและต้องเชื่อมต่อกับพร็อกซีนั้น

เนื่องจากลักษณะของ HTTP การเชื่อมต่อเว็บเซิร์ฟเวอร์โดยตรงและการเชื่อมต่อผ่านพร็อกซีจะส่งผลให้เกิดคำขอ GET ที่แตกต่างกัน โปรแกรมจำลองจะเขียนคำขอ GET จากอุปกรณ์เสมือนใหม่โดยไม่แสดงให้เห็นก่อนที่จะสื่อสารกับพร็อกซีเพื่อให้ทำงานได้

หากโปรแกรมจำลองต้องเข้าถึงอินเทอร์เน็ตผ่านพร็อกซีเซิร์ฟเวอร์ คุณสามารถกำหนดค่า พร็อกซี HTTP ที่กำหนดเองได้

เมื่อใช้โปรแกรมจำลองภายใน Android Studio คุณจะกำหนดค่าพร็อกซีได้โดยใช้ การตั้งค่าในเมนู Android Studio (Settings > Appearance & Behavior > System Settings > HTTP Proxy) ดูรายละเอียดเพิ่มเติมได้ที่ตั้งค่าพร็อกซี Android Studio ใน เอกสารประกอบAndroid Studio

เมื่อใช้โปรแกรมจำลองแบบสแตนด์อโลน (นอก Android Studio) คุณจะกำหนดค่าพร็อกซีได้จากหน้าจอการควบคุมเพิ่มเติมของโปรแกรมจำลอง

  1. เมื่อเปิดโปรแกรมจำลองแล้ว ให้คลิกเพิ่มเติม
  2. คลิกการตั้งค่าและ พร็อกซี (ใช้ได้เฉพาะในกรณีที่ไม่ได้เปิดโปรแกรมจำลองจาก Android Studio)
  3. กำหนดการตั้งค่าพร็อกซี HTTP

หรือจะกำหนดค่าพร็อกซีจากบรรทัดคำสั่งด้วยตัวเลือก -http-proxy <proxy> เมื่อเริ่มโปรแกรมจำลองก็ได้ ในกรณีนี้ ให้ระบุข้อมูลพร็อกซี ใน <proxy> ในรูปแบบใดรูปแบบหนึ่งต่อไปนี้

http://<machineName>:<port>

หรือ

http://<username>:<password>@<machineName>:<port>

-http-proxy ตัวเลือกนี้บังคับให้โปรแกรมจำลองใช้พร็อกซี HTTP หรือ HTTPS ที่ระบุสำหรับการเชื่อมต่อ TCP ขาออกทั้งหมด ไม่รองรับการเปลี่ยนเส้นทางสำหรับ UDP

หรือจะกำหนดตัวแปรสภาพแวดล้อม http_proxy ด้วยค่าที่ต้องการใช้สำหรับ <proxy> ก็ได้ ในกรณีนี้ คุณไม่จำเป็นต้องระบุค่าสำหรับ <proxy> ในคำสั่ง -http-proxy เนื่องจาก โปรแกรมจำลองจะตรวจสอบค่าของตัวแปรสภาพแวดล้อม http_proxy เมื่อเริ่มต้น และใช้ค่าโดยอัตโนมัติหากมีการกำหนดไว้

คุณใช้ตัวเลือก -debug-proxy เพื่อวิเคราะห์ปัญหาการเชื่อมต่อพร็อกซีได้

อินสแตนซ์โปรแกรมจำลองการเชื่อมต่อถึงกัน

หากต้องการให้อินสแตนซ์โปรแกรมจำลองหนึ่งสื่อสารกับอีกอินสแตนซ์หนึ่ง ให้ตั้งค่า การเปลี่ยนเส้นทางเครือข่ายตามที่อธิบายไว้ด้านล่าง

สมมติว่าสภาพแวดล้อมของคุณแสดงดังนี้

  • A คือเครื่องพัฒนา
  • B คืออินสแตนซ์โปรแกรมจำลองเครื่องแรกของคุณที่ทำงานบน A
  • C คืออินสแตนซ์โปรแกรมจำลองที่ 2 ซึ่งทำงานบน A ด้วย

หากต้องการเรียกใช้เซิร์ฟเวอร์ใน B ซึ่ง C จะเชื่อมต่อ ให้ตั้งค่าดังนี้

  1. ตั้งค่าเซิร์ฟเวอร์ใน B เพื่อรับฟังที่ 10.0.2.15:<serverPort>
  2. ในคอนโซล B ให้ตั้งค่าการเปลี่ยนเส้นทางจาก A:localhost:<localPort> ไปยัง B:10.0.2.15:<serverPort>
  3. ใน C ให้ไคลเอ็นต์เชื่อมต่อกับ 10.0.2.2:<localPort>

เช่น หากต้องการเรียกใช้เซิร์ฟเวอร์ HTTP ให้เลือก <serverPort> เป็น 80 และ <localPort> เป็น 8080

  • B ฟังที่ 10.0.2.15:80
  • ในคอนโซล B ให้เรียกใช้ redir add tcp:8080:80.
  • C เชื่อมต่อกับ 10.0.2.2:8080

ส่งการโทรด้วยเสียงหรือ SMS ไปยังอินสแตนซ์โปรแกรมจำลองอื่น

โปรแกรมจำลองจะส่งต่อการโทรด้วยเสียงและข้อความ SMS ที่จำลองจากอินสแตนซ์หนึ่งไปยังอีกอินสแตนซ์หนึ่งโดยอัตโนมัติ หากต้องการส่งการโทรด้วยเสียงหรือ SMS ให้ใช้แอปโทรศัพท์หรือแอป SMS ตามลำดับ จากโปรแกรมจำลองเครื่องใดเครื่องหนึ่ง

วิธีเริ่มการโทรด้วยเสียงจำลองไปยังอินสแตนซ์โปรแกรมจำลองอื่น

  1. เปิดแอปแป้นโทรศัพท์ในอินสแตนซ์โปรแกรมจำลองต้นทาง
  2. ป้อนหมายเลขพอร์ตของคอนโซลของอินสแตนซ์เป้าหมายเป็นหมายเลขที่จะโทร

    คุณสามารถ กำหนดหมายเลขพอร์ตคอนโซลของอินสแตนซ์เป้าหมายได้โดยตรวจสอบชื่อหน้าต่าง หากอินสแตนซ์นั้น ทำงานในหน้าต่างแยกต่างหาก แต่จะทำไม่ได้หากทำงานในหน้าต่างเครื่องมือ ระบบจะรายงานหมายเลขพอร์ตของคอนโซลเป็น "Android Emulator (<port>)"

    หรือใช้คำสั่ง adb devices เพื่อพิมพ์รายการอุปกรณ์เสมือนที่ทำงานอยู่และหมายเลขพอร์ตคอนโซล ของอุปกรณ์ ดูข้อมูลเพิ่มเติมได้ที่ค้นหา อุปกรณ์

  3. คลิกปุ่มโทร สายเรียกเข้าใหม่จะปรากฏในอินสแตนซ์โปรแกรมจำลองเป้าหมาย

วิธีส่งข้อความ SMS ไปยังอินสแตนซ์โปรแกรมจำลองอื่น

  1. เปิดแอป SMS หากมี
  2. ระบุหมายเลขพอร์ตของคอนโซลของอินสแตนซ์โปรแกรมจำลองเป้าหมายเป็นที่อยู่ SMS
  3. ป้อนข้อความ
  4. ส่งข้อความ ระบบจะส่งข้อความไปยังอินสแตนซ์โปรแกรมจำลองเป้าหมาย

นอกจากนี้ คุณยังเชื่อมต่อกับคอนโซลของโปรแกรมจำลองเพื่อจำลองการโทรด้วยเสียงหรือ SMS ขาเข้าได้ด้วย ดูข้อมูลเพิ่มเติมได้ที่ การจำลองโทรศัพท์และ การจำลอง SMS