คุณเชื่อมต่อ 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 ใหม่

ResultLikely ownerNext check
adb devices is empty with USB attachedUSB, driver or adb servercable, authorization prompt, adb kill-server
adb start-server hangsmDNS discoveryADB_MDNS_OPENSCREEN=0
Emulator reaches 10.0.2.2, names failHost resolver to emulator boundaryhost lookup of the same name
Host resolves, emulator still failsEmulator process or client filterrestart emulator, ask IT about virtual adapters
Both fail for internal names onlySplit DNS or search domainresolver and zone configuration

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

บทความที่เกี่ยวข้อง