
简介Android应用开发中模拟器默认使用独立的虚拟网段与宿主机IP不同容易导致模拟器无法访问互联网、无法与开发电脑上的本地服务通信。这份操作文档即为解决此类问题而编写面向需要配置AVD模拟器网络环境的初、中级开发者。配置流程完整讲解了六个关键步骤启动模拟器、进入adb shell、读取系统属性确认默认DNS与IP、分别设置新的DNS与同网段IP、再次读取属性验证生效并配有命令输入及结果截图清晰直观。除了正常配置流程文档还专门整理了adb常见报错的原因与处理方法例如设备未找到和设备离线这些提示通常需要重启adb进程或确认模拟器正常启动。资源以doc格式提供压缩包整体仅一个文件、大小约47KB内容精炼便于随身携带与查阅。目前已有2148人学习下载对解决模拟器网络配置疑问、提升联调测试效率具有实际的参考价值。1. 从连不上服务到 IP 玄学这篇文档到底解决什么但凡做过 Android 调试的开发者十有八九都遇到过这种场景模拟器里 App 请求本机接口报 connection refused真机插上 USB 能跑、拔了线走 WiFi 就超时或者好不容易在设置里填了一串静态 IP保存后网络反而彻底断了。这些问题的根源说穿了就是 IP 没设置对——要么是没搞清楚 Android 设备当前用的是什么地址要么是把真机那套网络理解硬套到 AVD 模拟器上。AVD 模拟器的 IP 机制跟真机差别很大它默认跑在 10.0.2.x 这个内部网段里访问宿主机要用专用地址真机则完全取决于你的 WiFi 环境。这篇笔记就是把这些操作拆开讲清楚怎么看 IP、怎么配静态 IP、AVD 的特殊规则是什么、改了不生效往哪儿排查。适合做 App 开发调试、需要让设备访问电脑上服务的从业者按章节操作即可复现。2. 先看再改Android 与 AVD 查看 IP 的三种方式2.1 图形界面看 IP手机设置与模拟器扩展面板真机查看 IP 最简单路径基本固定在「设置 → 网络和互联网/WLAN → 点击当前连接的 WiFi → 展开高级/查看详细信息」里面能看到 IP 地址、网关、子网掩码和 DNS。不同厂商的定制系统把菜单藏得深浅不一有的叫「状态信息」有的叫「IP 地址」但入口逻辑一致先找到当前连接的 WiFi再点进去找详情。小米系的系统还需要额外点开「高级」才能展开完整字段这一步容易漏。AVD 模拟器这边图形入口藏在模拟器边框的「扩展控制」里点开菜单栏的三个点图标在「Network」或「Settings」面板中可以看到模拟器当前的 IP 信息。冷启动模拟器时底部状态栏也会短暂显示网络状态但一闪而过不建议依赖它。需要注意模拟器的图形面板展示的是虚拟网卡信息它内部使用的 IP 网段由 QEMU 的用户态网络栈分配正常固定为 10.0.2.15这个地址和宿主机的局域网 IP 完全是两套体系看到 10.0.2.x 开头不用慌那不是配置错误。2.2 adb shell 命令行看 IPifconfig、ip addr 与 busybox图形界面在开发调试时有点鸡肋因为设备通常连着 USB 或已经开了无线调试直接在电脑上执行命令反而最快。先保证 adb 能识别设备再进 shell 看网卡信息# 检查设备连接状态 adb devices # 进入 shell 后用 ip 命令查看所有网卡地址Android 5.0 推荐 adb shell ip addr show # 只看 wlan0 网卡真机 WiFi 通常是 wlan0 adb shell ip addr show wlan0 # 老设备或精简系统里没有 ip 命令时退回用 ifconfig adb shell ifconfig第一个adb devices先确认设备在线如果列表里设备名后面跟的不是device而是offline或unauthorized先解决连接问题再往下走。ip addr show输出里重点看inet那一行形如inet 192.168.1.23/24的字段就是当前 IP 和掩码前缀长度/24对应子网掩码 255.255.255.0。ifconfig在部分精简版系统里可能不存在如果一个命令报not found立刻换另一个不要纠结。有些 App 开发场景需要拿到设备的公网出口 IP比如后端要做白名单这时候命令要换成访问外网服务来探测# 在设备 shell 里请求一个 IP 回显接口 adb shell curl ifconfig.me这个命令依赖设备能联网且装了 curl模拟器镜像一般自带部分真机 ROM 会精简掉。拿回来的地址是运营商分配的出口 IP跟局域网内网 IP 不是一回事做白名单时别填错了这是个容易忽略的细节。2.3 用 IP 判断网络状态网段、网关和 DNS 的判别拿到 IP 之后更重要的是会读它。三个关键字段各管一摊IP 地址标识设备在局域网里的身份网关是设备出网必须经过的路由器地址DNS 负责把域名解析成 IP。开发调试时最常用的判断是——设备能不能跟电脑通信看两个 IP 是否在同一个网段。电脑执行ipconfigWindows或ifconfigmacOS/Linux拿到自己的局域网 IP如果网段前缀和设备的一致比如都是 192.168.1.x那走局域网直连就行如果网段不同设备在 192.168.1.x电脑在 10.0.0.x就需要考虑端口转发或者把设备切到同一网段。DNS 在模拟器场景里是个重点坑。模拟器默认 DNS 指向 10.0.2.3它会把 DNS 请求转发给宿主机当前使用的 DNS 服务器。如果你发现模拟器能 ping 通 IP 但解析不了域名大概率是宿主机的 DNS 本身有问题或者模拟器的 DNS 转发链路被防火墙拦了。验证方法很简单# 在模拟器 shell 里分别测试 IP 连通性和域名解析 adb shell ping -c 3 223.5.5.5 adb shell ping -c 3 www.baidu.com第一条通、第二条不通问题就锁定在 DNS 链路上别去折腾 IP 配置。掌握了这套判别方法后面设置静态 IP 时才算真正知道自己在填什么。3. 真机端设置 IP静态 IP 配置的完整流程3.1 为什么需要静态 IP开发调试场景的三个理由开发阶段给真机配置静态 IP通常是为了解决三类问题。第一类是设备需要固定访问某个局域网服务——比如电脑上跑着后端接口手机每次开机 DHCP 分配的 IP 都会变后端如果做了来源 IP 校验换一次 IP 就要改一次白名单静态 IP 一劳永逸。第二类是 WiFi 环境的 DHCP 服务不稳定办公室网络设备接入量一大DHCP 分配就间歇性失灵手机显示已连接但拿不到有效 IP手动指定能绕过这个故障。第三类是端口映射需求——路由器上配了 DMZ 主机或端口转发规则这些规则通常绑定固定 IPDHCP 分配的动态地址会导致规则失效。静态 IP 不是随便填的。最常见的翻车操作是把 IP 乱写一通——填了个 192.168.5.88但路由器网段是 192.168.1.x配置保存后立刻断网。配置静态 IP 的本质是手动向网络声明「我就用这个地址」这个地址必须在当前局域网的有效分配范围内而且不能和其他设备冲突。动手前先在电脑上执行arp -a看一眼局域网里哪些 IP 已被占用选一个空闲的、在路由器 DHCP 分配池范围内的地址。3.2 在设置里配置静态 IP 的步骤与参数Android 系统的静态 IP 配置入口藏在 WiFi 详情里标准路径是设置 → WLAN → 长按当前连接的 WiFi → 修改网络 → 高级选项 → IP 设置改成「静态」。不同 ROM 的措辞略有差别但核心逻辑一样先把 IP 获取模式从 DHCP 切到静态然后填四个字段——IP 地址、网关、子网掩码、DNS。具体参数怎么填拿一个常见的家庭网络举例路由器管理地址是 192.168.1.1DHCP 分配池是 192.168.1.100 到 192.168.1.199。那么字段填写值说明IP 地址192.168.1.88必须在 DHCP 池范围内但未被占用的地址网关192.168.1.1路由器的局域网地址填错直接无法出网子网掩码255.255.255.0与前缀 /24 等价设备与电脑同网段判断依据DNS1192.168.1.1用路由器做 DNS 转发兼容性最好DNS2223.5.5.5备用的公共 DNS防止路由器 DNS 故障保存之后不要急着关设置页先退回桌面等几秒让系统重新关联 WiFi。这里有个规律静态 IP 配置在 WiFi 重连后才会完全生效如果保存后网络图标显示已连接但没有数据传输先开关一次 WiFi 强制触发重连。另外部分国产 ROM 在「高级选项」里还藏着「IP 设置」和「代理设置」两个入口IP 设置务必选「静态」而不是「DHCP」代理保持「无」很多开发者在这里误把代理设成了10.0.2.2:8080这是模拟器访问宿主机的写法导致真机所有请求都走了个不存在的代理血泪教训。3.3 通过命令行临时设置 IProot 与调试环境下的替代方案系统设置里的静态 IP 配置是持久化的重启设备后依然保留但这套入口在两种场景下不够用一是设备是测试机、系统被精简过设置界面里没有「修改网络」的选项二是需要频繁切换不同网段的 IP每次都去设置里点十几次太浪费时间。这两种情况可以用命令行临时设置前提是设备有 root 权限或者使用adb shell配合su命令以管理员身份执行# 连接设备并获取 root 权限 adb shell su -c ifconfig wlan0 192.168.1.88 netmask 255.255.255.0 adb shell su -c ip route add default via 192.168.1.1 dev wlan0 # 设置系统 DNS adb shell su -c setprop net.dns1 192.168.1.1 adb shell su -c setprop net.dns2 223.5.5.5第一条命令给 wlan0 网卡绑定 IP 和子网掩码第二条命令添加默认路由也就是网关。这里有个关键问题ifconfig设置 IP 后原来的 DHCP 租约和路由表并不会自动更新如果设备是自动获取模式系统可能在后台检测到 IP 冲突后自动释放并重新申请导致静态 IP 失效。更稳的做法是先切断 WiFi 的 DHCP 续约机制但这个在命令行里不好控制所以命令行方式只建议用在临时调试场景持久化配置还是走设置界面。setprop net.dns1设置 DNS 有一个适用边界部分 Android 版本里net.dns1是只读属性命令行写入会报权限错误这种情况需要改用ndc resolver命令或直接修改/etc/resolv.conf要求 root 且关闭了 SELinux 强制模式。实操中我会先执行一遍getprop net.dns1看看当前值能不能改能改就改不能改就确认 WiFi 详情页里显示的 DNS 是否已经是新值——很多系统会把命令行设置的结果直接继承到图形界面显示里。3.4 配置完必须验证的四件事静态 IP 配好后别直接打开 App 就以为大功告成按顺序做四步验证# 第一步确认 IP 真的生效 adb shell ip addr show wlan0 | grep inet # 第二步验证网关可达 adb shell ping -c 3 192.168.1.1 # 第三步验证外网连通走 DNS 解析 adb shell ping -c 3 www.baidu.com # 第四步验证电脑到设备的双向通道电脑上执行 ping 192.168.1.88这四步分别卡住了四个环节第一步检查 IP 是否绑定成功防止配置保存了但系统未应用第二步确认网关通不通网关不通说明子网掩码或网关填错第三步验证 DNS 和出网链路域名解析失败先换 DNS 再排查第四步验证电脑这个客户端能不能访问到设备。四步全通静态 IP 配置才算真正落地。实际调试中第四步最容易忽略——设备能连外网不代表电脑能直连设备如果 App 需要连接电脑上的服务电脑到设备方向的连通性才是决定性的。4. AVD 模拟器 IP 机制别拿真机的思路去套4.1 10.0.2.x 网段的先天设定AVD 模拟器的网络架构和真机完全是两回事。真机连 WiFi 拿的是路由器分配的局域网地址模拟器则是在宿主机内部虚拟了一个用户态网络栈所有网络流量都通过 QEMU 的虚拟网卡转发。这个内部网络固定使用 10.0.2.x 这个保留网段模拟器自己拿到的 IP 永远是 10.0.2.15网关是 10.0.2.1DNS 是 10.0.2.3。这个网段跟宿主机所在的物理局域网没有任何关系模拟器在 10.0.2.15 上监听的端口宿主机和局域网其他设备都访问不到。理解这个机制你就能解释很多奇怪现象模拟器里ping 192.168.1.1宿主机所在局域网的路由器地址通常是通的因为用户态网络栈会把这些包转发给宿主机再由宿主机路由出去但局域网里的其他设备反向访问模拟器的服务连 IP 都找不到。反向不通是网络栈的转发边界决定的不是 IP 配置错误。真机那套「看 WiFi 详情页拿 IP」的思路在模拟器上完全不适用模拟器的 IP 是写死的你不需要改它也改不动它。4.2 模拟器访问宿主机10.0.2.2 的使用要点模拟器访问宿主机上跑的服务最核心的一个地址是 10.0.2.2——它映射的是宿主机的回环地址127.0.0.1。也就是说模拟器里访问http://10.0.2.2:8080等价于宿主机上访问http://127.0.0.1:8080。这个机制让本地调试变得非常方便电脑上启动一个 Spring Boot 服务监听 8080 端口模拟器里直接请求 10.0.2.2:8080 就能打通。但这里有个容易翻车的细节10.0.2.2 映射的是宿主机的 loopback不是局域网 IP。如果宿主机上的服务绑定了特定的局域网 IP比如0.0.0.0之外的指定地址或者防火墙阻止了 loopback 的入站请求模拟器访问 10.0.2.2 就会失败。常见的正确姿势是让服务监听127.0.0.1:8080或0.0.0.0:8080不要绑定到具体网卡的局域网 IP。还有一点要注意10.0.2.2 只在模拟器内部有效真机不能用这个地址——很多开发者 App 里把接口地址写死成 10.0.2.2装到真机上就抓瞎这个问题在章节 5 里会详细展开。4.3 给 AVD 自定义网络与 DNS冷启动参数详解模拟器的网络参数有几个可以通过冷启动命令行覆盖最常用的是-dns-server和-http-proxy。启动模拟器时执行# 启动 AVD 并指定自定义 DNS 服务器 emulator -avd 你的AVD名称 -dns-server 223.5.5.5,192.168.1.1 # 通过代理访问外网公司内网调试时用 emulator -avd 你的AVD名称 -http-proxy http://192.168.1.100:8888-dns-server后面可以跟多个 DNS 地址用英文逗号分隔这些地址是给模拟器内部 DNS 解析用的最终在模拟器里看到的 DNS 服务器仍是 10.0.2.3但转发目标已经被替换成你指定的地址。-http-proxy适用于模拟器需要走代理才能访问外部服务的场景代理地址必须是宿主机网络能访问到的内网代理服务器。除此之外还有-port参数它指定模拟器控制台的端口号。默认情况下第一个模拟器是 5554第二个是 5556依次递增。命令行指定端口可以让多个模拟器的 adb 连接、控制台操作互不干扰实际开发中一台电脑开多个模拟器跑兼容性测试时这个参数的价值就体现出来了。# 指定端口启动模拟器 emulator -avd 你的AVD名称 -port 55584.4 模拟器之间的互通与 adb 连接两个 AVD 模拟器之间能不能直接通信取决于它们是否共享同一个虚拟网络。默认情况下每个模拟器都跑在独立的 QEMU 用户态网络栈里它们各自的 10.0.2.15 指的是自己两个模拟器之间无法用 10.0.2.x 网段直接互通。如果需要模拟器之间互访常见做法是让其中一个模拟器的服务通过 adb 反向端口映射暴露出来或者用两个模拟器分别访问宿主机的不同端口再由宿主机做转发。adb 连接模拟器走的是宿主机上的 TCP 端口默认 5555 或 5554。命令行里执行# 查看当前连接的模拟器 adb devices -l # 连接指定端口的模拟器 adb connect 127.0.0.1:5558adb connect后面跟的地址是宿主机视角的地址127.0.0.1:5558 指向本机的模拟器控制端口。如果你在别的机器上想 adb 连接这台电脑上的模拟器需要把 127.0.0.1 换成这台电脑的局域网 IP并且确保防火墙放行了对应端口。这里有一个和标题核心诉求强相关的地方很多人误以为连接远程模拟器也要在模拟器里设置 IP其实完全不必要——模拟器内部的 10.0.2.15 只在它自己内部有意义外部访问统一走宿主机 IP 加端口。5. 避坑指南改了 IP 不生效、连不上服务的五个典型排查5.1 现象一静态 IP 设置后无法上网现象描述在 WiFi 设置里填了静态 IP保存后网络显示已连接但浏览器打不开网页ping 外网 IP 也不通。原因分析三个字段里必有一个填错。最常见的是网关填错——有人把网关填成了 DNS 服务器的地址或者把子网掩码从 255.255.255.0 改成 255.255.255.255导致设备认为所有目标都在同一网段所有出网请求都直接发广播路由器自然不会转发。其次是 IP 地址填在了 DHCP 分配池之外或者和另一台设备冲突路由器直接丢弃了它的包。解决路径重新进入静态 IP 配置页逐字段核对。网关必须是路由器自己的局域网地址不是电脑的 IP子网掩码要和当前 WiFi 的 DHCP 分配一致拿不准就统一填 255.255.255.0IP 地址确认在分配池范围内且arp -a里查不到占用记录。改完开关一次 WiFi再执行ping 网关通了再测外网。5.2 现象二模拟器 ping 不通宿主机现象描述模拟器里执行ping 10.0.2.2失败或者 App 请求http://10.0.2.2:8080超时。原因分析宿主机防火墙拦截是最常见的原因。Windows 的防火墙默认禁止来自虚拟网卡的入站连接macOS 的防火墙在开启状态下也会拦截 QEMU 网桥的流量。其次是宿主机上的服务只监听了特定网卡的 IP没监听127.0.0.1或0.0.0.0。解决路径在宿主机防火墙里放行模拟器对应的虚拟网卡或者在服务端把监听地址改成0.0.0.0。验证方法宿主机上先访问http://127.0.0.1:8080确认服务正常再用telnet 127.0.0.1 8080从本机测端口通不通。然后从模拟器里执行telnet 10.0.2.2 8080看是否报 connection refused。如果宿主机能通、模拟器不通集中在防火墙和监听地址上排查。5.3 现象三adb connect 报 cannot connect现象描述执行adb connect 192.168.1.100:5555返回cannot connect to 192.168.1.100:5555: 由于目标计算机积极拒绝无法连接。原因分析两个原因占比最高——手机端没有开启无线调试功能或者手机和电脑不在同一网段中间隔了路由器隔离策略。Android 10 及以上的无线调试开关藏在开发者选项里叫「无线调试」开启后还需要用配对码配对一次步骤比老版本繁琐不少。另外某些手机品牌默认开启了「WLAN 隔离」同一 WiFi 下的设备之间互相不可见adb 自然连不上。解决路径先确认网段——手机和电脑分别执行ip addr和ipconfig看是否同为 192.168.1.x。再确认手机开发者选项里「USB 调试」和「无线调试」都已开启Android 11 以上需要配对新设备在无线调试页面点「使用配对码配对设备」输入电脑端adb pair后显示的配对码。老版本 Android 直接用adb tcpip 5555切换端口监听模式然后再 connect。层层排除后才能定位到是手机端没开启服务还是网络隔离问题。5.4 现象四手机能连 WiFi 但 App 收不到服务器响应现象描述真机上 App 配置了电脑的局域网 IP请求能发出去但一直转圈服务端日志里没有收到任何请求。原因分析服务器端服务监听的地址可能绑定了某个具体 IP或者电脑的防火墙阻止了局域网设备的入站访问。还有一个容易忽略的点App 里配的电脑 IP 是电脑的当前 IP但电脑如果同时连着有线网和无线网操作系统会把不同网络出口的 IP 混在一起App 访问的那个 IP 可能根本不属于当前工作的网卡。解决路径在电脑上执行ipconfig找到与手机同一网段的那块网卡 IP如果匹配到了多个网卡优先用有线网卡对应的 IP。确认服务监听地址为0.0.0.0防火墙放行对应端口Windows 上执行netsh advfirewall firewall add rule namedebug dirin actionallow protocolTCP localport8080。最后从手机浏览器直接访问http://电脑IP:8080浏览器能开就说明链路是通的问题在 App 本身打不开就继续查防火墙和监听地址。5.5 现象五改了 IP 重启后回到自动获取现象描述静态 IP 配置保存后当时生效但手机重启或 WiFi 断开重连后IP 又变回 DHCP 分配的动态地址。原因分析部分国产 ROM 对「静态 IP」配置做了临时化处理——系统在 WiFi 断开重连时重新触发了 DHCP 请求覆盖了手动配置。这个行为和 ROM 的 WLAN 管理策略有关不是用户操作失误。解决路径优先用系统自带的路由器管理 App 或路由器后台在 DHCP 服务器里给手机的 MAC 地址绑定一个固定 IP 分配。这样做的好处是手机端完全不用配静态 IP路由器每次分配同一地址给这个设备效果等同静态 IP但省去了手机端配置被重置的烦恼。这种方法在开发机上同样适用——把电脑的 MAC 在路由器里绑一个固定 IP防止电脑 IP 漂移导致 App 里的接口地址失效。如果设备必须在无路由器环境下自组网比如通过手机热点直连再退回到手机端静态 IP 配置同时更新系统的网络设置文件以持久化保存配置但普通设备没有 root 权限时这条路走不通只能用「路由器绑定 MAC」这个根治方案。6. 进阶技巧adb reverse 让真机免 IP 访问电脑服务静态 IP 和 10.0.2.2 都解决了「设备到电脑」的连通问题但它们有一个共同的缺陷真机必须和电脑在同一网段模拟器必须接受固定网段限制。如果有一种方式能让设备通过localhost直接访问电脑上的服务IP 设置这一步就可以彻底省了——adb reverse就是干这个的。# 真机或模拟器通过 USB 连接后将设备的 localhost:8080 转发到电脑的 127.0.0.1:8080 adb reverse tcp:8080 tcp:8080执行完后在设备上访问http://localhost:8080等价于访问电脑的 8080 端口。它的原理是在 adb 的传输通道上建立一条反向隧道设备发出的 localhost:8080 请求经过 USB 或无线 adb 连接转发到宿主机宿主机再请求 127.0.0.1:8080。这个方案对真机和模拟器都有效而且不依赖 WiFi 网段、不用改防火墙、不用配静态 IP是本地联调最顺手的一招。这个命令在两种场景特别有用。第一种是电脑上的服务只监听了 127.0.0.1不方便改监听地址第二种是设备走的是蜂窝网络或不在同一个 WiFi 下局域网 IP 根本不可达。执行后先用adb reverse --list查看已建立的转发规则确认记录在册再在设备的浏览器里访问一次测试链路。需要注意adb reverse的失效条件拔掉 USB 线、重启 adb 服务、设备端切换网络后转发规则都会被清除需要重新执行。所以在写自动化脚本时我会把adb reverse放在每次连接设备后的初始化步骤里而不是手动执行一次就以为万事大吉。还有一个组合用法多个设备连接同一台电脑时adb reverse按设备维度独立建隧道每个设备转发到电脑的不同端口互不干扰。在电脑上分别启动 8081、8082、8083 三个服务实例再对每个设备执行不同的 reverse 映射一套多设备差异化调试就搭出来了——这个操作本质上也是在规避 IP 分配问题因为每台设备的 localhost 都是自己内部地址不存在跨设备冲突。以我对 Android 调试的理解IP 设置这个问题最大的障碍不是操作难而是概念混淆——真机的局域网 IP、模拟器的 10.0.2.x、adb 隧道的 localhost三套体系各有各的使用边界。之前我在一个项目里为了省事给所有测试机都配了静态 IP结果换了个办公室网段全部失效排查了半天才意识到是网关没跟着换。那次之后我养成了个习惯凡是设备到电脑的通信优先用adb reverse不行再考虑静态 IP模拟器场景才用 10.0.2.2。调试链路能少一层依赖就少一层IP 这种越依赖越容易出问题的环节能绕开就不硬碰。希望这些操作思路和排查路径能帮到你下次再碰到设备连不上服务至少知道该先看哪一个网段、跑哪一条命令。本文还有配套的精品资源点击获取