You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从Android模拟器访问主机网络并扫描同一网络内的设备?

Hey,这个问题我之前踩过不少坑,给你梳理清楚解决方案:

一、Android模拟器访问主机网络

不同的模拟器设置略有区别,先讲最常用的Android Studio自带模拟器:

  • 访问主机的localhost服务:直接用特殊IP 10.0.2.2 就行,这个是模拟器内置的映射地址,对应主机的127.0.0.1。比如主机在localhost:8080跑了个接口,模拟器里直接请求http://10.0.2.2:8080就能访问。
  • 访问主机的局域网IP服务:如果你的主机在局域网里的IP是192.168.1.100这类,默认NAT模式下模拟器可能访问不了,这时候可以把模拟器切换到桥接模式
    1. 打开AVD管理器,找到要设置的模拟器,点击「Edit this AVD」
    2. 进入「Show Advanced Settings」,找到「Network」部分
    3. 把「Network Mode」从默认的NAT改成Bridge,然后选择主机当前使用的网卡(比如WiFi或以太网)
    4. 重启模拟器,这时候模拟器会获取和主机同一网段的IP,直接用主机的局域网IP就能访问了。

如果是Genymotion模拟器,更简单:默认就是桥接模式,直接用主机的局域网IP就能访问,或者用10.0.3.2映射localhost。

二、访问主机所在的局域网网络

只要把模拟器切换到桥接模式(上面说的方法),模拟器就会成为局域网里的一个独立设备,获取和主机同一网段的IP地址,这时候就能直接访问局域网里的其他设备了——比如你局域网里的NAS、其他电脑、IoT设备,只要知道它们的IP,直接在模拟器里访问就行。

注意:如果你的主机开了防火墙,要确保允许模拟器所在的IP段访问相关端口,不然会被拦截。

三、扫描同一网络的设备

要扫描局域网内的设备,有几种方法:

1. 应用层实现(适合Android App)

你可以在Android应用里写代码扫描网段,步骤大概是:

  • 先获取模拟器当前的IP和子网掩码,计算出要扫描的IP范围(比如192.168.1.1192.168.1.255
  • InetAddress.isReachable(timeout)方法逐个ping这些IP,判断是否在线
  • 别忘了在AndroidManifest.xml里添加权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    
    注意:Android 6.0以上还要动态申请这些权限。

2. 命令行工具(适合调试)

如果只是想快速扫描,可以在模拟器的shell里用工具:

  • 先打开终端,输入adb shell进入模拟器控制台
  • ping命令测试单个IP:ping 192.168.1.101
  • 如果需要批量扫描,可以装nmap(部分模拟器自带,没有的话需要自己安装),比如执行nmap -sn 192.168.1.0/24,就能列出网段内的在线设备。
一些注意事项
  • 如果你用的是模拟器的「Cold Boot」(冷启动),可能需要重新设置网络模式,热启动有时候会保留旧的网络配置
  • 部分轻量模拟器可能不支持桥接模式,这时候可以试试把主机的服务绑定到0.0.0.0(允许所有IP访问),然后用主机的局域网IP让模拟器访问

内容的提问来源于stack exchange,提问作者Martynas Jurkus

火山引擎 最新活动