ADB และ Android emulator ล้มเหลวหลัง VPN: สามเส้นทาง
การค้นหา ADB การ์ดเครือข่ายเสมือนของ emulator และตัวแปลงชื่อของโฮสต์ล้มเหลวแยกกันหลัง VPN ทดสอบแต่ละเส้นทางตามลำดับก่อนโทษอุโมงค์
คุณเชื่อมต่อ VPN ของออฟฟิศ แล้ว Android Studio ก็สูญเสีย emulator ที่กำลังทำงาน adb start-server ค้าง และโทรศัพท์จริงบน Wi-Fi หลุดจากรายการอุปกรณ์ ดูเหมือนอุโมงค์เดียวบล็อกผลิตภัณฑ์เดียว ความจริงแล้วมีสามเส้นทางที่ล้มเหลวต่างกันสามแบบ: การค้นหาอุปกรณ์ของ adb เครือข่ายเสมือนของ emulator และตัวแปลงชื่อของโฮสต์ อุโมงค์มักเป็นเจ้าของเพียงเส้นทางสุดท้าย และบ่อยครั้งเพียงบางส่วน
สามซ็อกเก็ต สามเจ้าของ
เซิร์ฟเวอร์ adb รับฟังที่พอร์ต 5037 บนโฮสต์และสื่อสารกับอุปกรณ์ผ่าน USB หรือ TCP ใช้ mDNS สำหรับการค้นหาในเครือข่าย emulator ทำงานหลังเราเตอร์เสมือนของตัวเอง: เกสต์คือ 10.0.2.15 เกตเวย์คือ 10.0.2.2 และเซิร์ฟเวอร์ DNS คือ 10.0.2.3 และโปรเซสของ emulator แปลงทั้งหมดเป็นซ็อกเก็ตของโฮสต์ ตัวแปลงชื่อของโฮสต์คือที่ที่ไคลเอนต์ VPN ติดตั้ง DNS และโดเมนค้นหา
การแยกนั้นอธิบายว่าเหตุใด การแก้ไขจึงดูเหมือนได้ผลกับเครื่องมือหนึ่งแต่ไม่ได้ผลกับอีกตัว ไคลเอนต์ที่เปลี่ยนตัวแปลงชื่อของโฮสต์จะทิ้งโปรเซส emulator ที่ทำงานอยู่พร้อมสถานะตัวแปลงชื่อที่อ่านตอนเริ่มต้น ไคลเอนต์ที่กรอง multicast ทำให้การค้นหาเสียโดยไม่แตะ DNS ไคลเอนต์ที่กรองอะแดปเตอร์เสมือนจะปฏิเสธ emulator ขณะที่เบราว์เซอร์ของโฮสต์ยังทำงาน อาการแต่ละอย่างมีสาเหตุต่างกัน จึงระบุเส้นทางที่ล้มเหลวก่อนเปลี่ยนการตั้งค่าใด ๆ
เริ่มจากสิ่งที่ adb มองเห็น
เรียกใช้ adb devices ก่อนแตะ VPN รายการว่างคือปัญหาการขนส่ง ไม่ใช่การกำหนดเส้นทาง และไม่มีการตั้งค่าอุโมงค์ใดแก้ไขอุปกรณ์ที่เซิร์ฟเวอร์ไม่เคยระบุได้ เริ่มเซิร์ฟเวอร์ใหม่ให้สะอาด: ก่อนอื่น adb kill-server จากนั้น adb start-server แล้วอ่านผลลัพธ์เพื่อดูว่ามันยึดพอร์ตใด หากการเริ่มต้นเองค้าง การค้นหา mDNS เป็นผู้ต้องสงสัยปกติในเครือข่ายที่กรอง multicast วิธีแก้ที่บันทึกไว้คือเริ่มเซิร์ฟเวอร์โดยปิดการค้นหา:
ADB_MDNS_OPENSCREEN=0 adb start-server
adb devicesสำหรับอุปกรณ์จริง USB คือเส้นทางที่สั้นที่สุด หากต้องการ TCP ให้อุปกรณ์อยู่ในโหมดรับฟังด้วย adb tcpip 5555 และเชื่อมต่อไปยังที่อยู่และพอร์ตของอุปกรณ์ adb connect 192.0.2.10:5555 พอร์ต 5037 คือพอร์ตเซิร์ฟเวอร์ของโฮสต์ ไม่ใช่พอร์ตที่อุปกรณ์รับฟัง
ทดสอบ emulator จากภายใน
emulator ตอบ DNS จาก 10.0.2.3 และตัวแปลงชื่อนั้นได้รับอาหารจากโปรเซสของโฮสต์ เมื่อไคลเอนต์ VPN เปลี่ยนตัวแปลงชื่อของโฮสต์ emulator อาจสืบทอดได้ เมื่อไคลเอนต์กรองโปรเซสของ emulator หรือรายการอะแดปเตอร์ของโฮสต์เปลี่ยนหลังเริ่มต้น มันทำไม่ได้ แยกทั้งสองด้วยเป้าหมายที่เป็นตัวเลขและชื่อจากเชลล์เดียวกัน adb shell ping -c 2 10.0.2.2 พิสูจน์ว่าเครือข่ายเสมือนไปถึงฝั่งโฮสต์ได้ การค้นหาชื่อหลังจากนั้นบอกว่าการแปลงข้ามเขตหรือไม่
จากนั้นเรียกใช้การค้นหาชื่อเดียวกันบนโฮสต์ โฮสต์แปลงได้แต่ emulator ไม่ได้หมายความรอยขาดอยู่ระหว่างตัวแปลงชื่อของโฮสต์กับเครือข่ายเสมือนของ emulator ไม่ใช่ในอุโมงค์ ทั้งสองล้มเหลวหมายความว่าควรดูที่ตัวแปลงชื่อของโฮสต์ การรีสตาร์ท emulator หลังเชื่อมต่อ VPN คุ้มหนึ่งครั้ง เพราะไคลเอนต์บางตัวติดตั้งสถานะตัวแปลงชื่อที่โปรเซส emulator ที่ทำงานอยู่ไม่รับ
ตรวจสอบตัวแปลงชื่อของโฮสต์และตัวกรองของไคลเอนต์
ไคลเอนต์อุโมงค์เต็มรูปแบบแทนที่ตัวแปลงชื่อของโฮสต์ด้วยของตัวเอง และไคลเอนต์ split-DNS เพิ่มโดเมนค้นหาและตัวส่งต่อแบบมีเงื่อนไข ชื่อภายในมักขึ้นกับคอนฟิกูเรชัน split-DNS นั้น ดังนั้นดูว่าโฮสต์ใช้อะไรขณะเชื่อมต่อ: ที่อยู่ตัวแปลงชื่อ โดเมนค้นหา และโซนภายในถูกกำหนดเส้นทางไปยัง DNS องค์กรหรือไม่ ตัวแปลงชื่อที่ตอบชื่อสาธารณะแต่ไม่ตอบชื่อภายในเป็นคำถามเชิงนโยบาย ไม่ใช่อุโมงค์ที่เสีย
ไคลเอนต์องค์กรบางตัวบล็อกทราฟฟิกจากอะแดปเตอร์เสมือนด้วย สำหรับไดรเวอร์ตัวกรอง emulator ดูเหมือนอะแดปเตอร์เสมือน โฮสต์จึงอาจทำงานได้อย่างสมบูรณ์ขณะที่นโยบายปฏิเสธ emulator นโยบายนั้นมองไม่เห็นจากสถานีงาน และการเดาการตั้งค่าพร็อกซีก็ไม่เปิดเผย หากโฮสต์แปลงได้แต่ emulator ถูกบล็อกไม่ว่าการตั้งค่าเป็นอย่างไร การยกระดับที่ถูกต้องคือทีมที่ดูแลนโยบายไคลเอนต์
ลำดับการตรวจสอบและความหมายของแต่ละผล
ทำงานจากบนลงล่างและหยุดที่แถวแรกที่ล้มเหลว ผลลัพธ์แต่ละอย่างชี้ไปยังเจ้าของที่ต่างกัน และไม่มีอันใดแก้ได้ด้วยการติดตั้ง Android Studio ใหม่
| Result | Likely owner | Next check |
|---|---|---|
| adb devices is empty with USB attached | USB, driver or adb server | cable, authorization prompt, adb kill-server |
| adb start-server hangs | mDNS discovery | ADB_MDNS_OPENSCREEN=0 |
| Emulator reaches 10.0.2.2, names fail | Host resolver to emulator boundary | host lookup of the same name |
| Host resolves, emulator still fails | Emulator process or client filter | restart emulator, ask IT about virtual adapters |
| Both fail for internal names only | Split DNS or search domain | resolver and zone configuration |
มีเพียงสองแถวสุดท้ายที่เป็นคำถาม VPN ในความหมายปกติ และมีเพียงแถวสุดท้ายที่เกี่ยวกับเนื้อหา DNS เอกสาร adb ครอบคลุมพอร์ตเซิร์ฟเวอร์และตัวแปรสภาพแวดล้อมที่กล่าวถึงที่นี่ เพียงพอที่จะรักษาฝั่งการขนส่งให้ซื่อตรงขณะทดสอบส่วนที่เหลือ