主机访问Android模拟器网络服务方法

本文详细描述了如何在AndroidStudio的模拟器上克服网络限制,包括模拟器的网络地址空间、端口映射的方法(通过控制台和ADB工具)、以及如何利用10.0.2.2访问本地开发机。还提及了10.0.2.2的漏洞历史和安全注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x00 背景

因为公司的一个手机app的开发需求,要尝试链接手机开启的web服务。于是在Android Studio的Android模拟器上尝试连接,发现谷歌给模拟器做了网络限制,不能直接连接。当然这个限制似乎从很久以前就存在了。一直没有注意到。

0x01 Android 网络地址空间

模拟器的每个实例都在虚拟路由器或防火墙服务后面运行,这样便将其与开发机器网络接口和设置以及互联网隔离开来。所以

  1. 无法直接从PC访问到模拟器;
  2. 也无法从模拟器直接访问开发机器PC;
  3. 也无法直接从这个模拟器访问到另一个模拟器;

每个实例的虚拟路由器管理 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 服务器
10.0.2.15所模拟设备的网络或以太网接口
127.0.0.1所模拟设备的环回接口

如果要实现从这个模拟器访问到另一个模拟器的场景,可以参考官网的说明–互连模拟器实例【传送门】。这里大概说明下原理:就是先让模拟器A和模拟器B都分别连到开发主机,用开发主机做中转。
这里有个重点:
在Android模拟器上访问10.0.2.2地址就可以访问到开发主机的localhost了。

0x02 模拟器端口映射到本地(开发机)

端口映射有两种方法:

  1. 通过模拟器控制台设置重定向
  2. Android 调试桥 (adb) 工具

2.1 通过模拟器控制台设置重定向

第一步, 通过命令行连接到模拟器控制台,启动的第一个模拟器实例的控制台端口号为 5554。
在这里插入图片描述
第二步, 登录授权,输入 auth <auth_token> 命令。
<auth_token>已经在上面命令的倒数第二行提供路径,我这里是:

/Users/用户名/.emulator_console_auth_token

打开文件可以看到一行token,复制过来,带入到命令中执行即可:

auth rsEGo86el0Kwomvp

成功授权后返回OK

第三步,端口映射
执行如下命令,将Android模拟器的6000端口映射到开发主机的5000端口,这样开发主机即可访问到模拟器开的6000端口服务了。

redir add tcp:5000:6000

使用 redir 命令来处理重定向。

如需添加重定向,请使用以下命令:

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

其中,<protocol> 是 tcp 或 udp,<host-port><guest-port> 用来设置自己的PC机器与Android 模拟器的系统之间的映射。

第四步,删除端口映射
redir del: 删除一条转发规则,命令格式如下:

redir <protocol>:<hostport>

举例:

redir del tcp:5000

第五步,退出控制台,使用quit或者exit命令

2.2 通过 adb 设置重定向

Android 调试桥 (adb) 工具提供端口转发功能,这是设置网络重定向的另一种方法。官方说明【传送门

可以使用 forward 命令设置任意端口转发,将特定主机端口上的请求转发到设备上的其他端口。以下示例设置了主机端口 6100 到Android 模拟器端口 7100 的转发:

adb forward tcp:6100 tcp:7100

以下示例设置了主机端口 6100 到 local:logd 的转发:

adb forward tcp:6100 local:logd

请注意,除了停止 adb 服务器,adb 目前不提供移除重定向的方法。

上面这句话是官网抄来的,半天没有理解说的是什么。懂了似乎又没懂。懂了的可以跳过本段。这里翻译下:端口映射的规则一旦使用,没办法像删除路由那样删除映射规则。唯一的办法就是关掉adb服务。

停止 adb 服务器
如需停止 adb 服务器,请使用 adb kill-server 命令。然后,您可以通过发出其他任何 adb 命令来重启服务器。

0x03 模拟器访问本地(开发机)

如开篇所讲,本地PC的地址会被映射成10.0.2.2,用localhost或者127.0.0.1是访问不到的。在模拟器的浏览器访问试试。
在这里插入图片描述

0x04 tips

  1. 想要进一步了解Andrioid 控制台操作命令的同学可以移步到官网【传送门】;
  2. 10.0.2.2这个本地ip映射的机制至少在Android emulator2.0版本就存在了,大约是2009年,可能在1.0版本就在了。没错,很早就这样了。
  3. 10.0.2.2曾经有一个从浏览器就能开起反弹shell的漏洞(CVE-2010-1807),有趣的是这本来是苹果safari的任意代码执行漏洞,在安卓也能用,配合这个ip:10.0.2.2就能从开发主机访问到模拟器的shell了。【传送门

0x05 参考文献

https://developer.android.com/studio/run/emulator-networking?hl=zh-cn
https://m.imooc.com/wiki/androidstudio-emulatorconsole
https://developer.aliyun.com/article/270580
https://blog.csdn.net/learner_lps/article/details/52451464

Android Studio 模拟器网络配置对于开发者来说是非常重要的功能之一,它允许你在模拟环境中测试应用在网络条件下的表现。以下是关于 Android Studio 模拟器网络的一些关键点: ### 1. **默认网络设置** - 默认情况下,Android 模拟器会自动连接到主机(即运行 Android Studio 的计算机)的网络环境,并共享其 IP 地址。这意味着如果你的电脑可以访问互联网,那么模拟器通常也可以。 ### 2. **修改网络属性** - 如果你需要自定义模拟器网络属性(如延迟、带宽等),可以在 AVD (Android Virtual Device) 管理器中编辑设备配置。通过添加 `network.speed` `network.latency` 属性来模拟不同的网络状况。 ### 3. **Wi-Fi 或移动数据切换** - 在某些场景下,你可能需要模拟 Wi-Fi 蜂窝数据之间的切换。你可以使用命令行工具或直接在模拟器界面上操作来进行这种切换。 ### 4. **调试日志查看** - 使用 ADB 命令可以帮助你检查模拟器当前的网络状态,例如: ```bash adb shell ping www.google.com ``` 这条命令可以验证模拟器是否能够成功解析域名并建立连接。 ### 5. **常见问题及解决办法** - **无法上网**:确保你的主机已经正常联网;尝试重启模拟器或清空缓存; - **DNS 解析失败**:有时可能是由于 DNS 设置不当导致的问题,可以通过手动指定 DNS 来解决问题。 ### 示例命令 如果你想调整网络速度以模拟低速连接,可以在启动模拟器之前使用以下命令: ```bash emulator -avd <your_avd_name> -qemu -netdelay none -netspeed full ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值