Android Studio远程连接模拟器调试

需求

Android Studio 高版本已经可以使用 Pair Devices Using Wi-fi 功能连接同一局域网下的真机设备了,低版本也可以使用Android adb wifi 插件完成无线调试,还是比较方便的。但是,如何连接同一局域网下的模拟器,实现远程调试呢?这是本文需要解决的问题。

由于个人开发条件受限,模拟器运行内存消耗不小,在一个机器上开发调试设备压力比较大,切换窗口查看也不是很方便。平时工作时,是两台设备使用Mouse without Borders 共享键鼠,但毕竟是两个主机,交互有些不方便。在一台机器上开发,在另一台机器上运行模拟器调试,就是我的需求了。

ADB端口说明

模拟器运行时会有一个启动控制台,第一个模拟器控制台默认端口是5554,对应的ADB连接端口是5555。两个端口号默认相邻,ADB端口比控制台端口大1。对应关系举例如下:

模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
依此类推

知道了端口关系,才能输对连接命令。

远程连接步骤

这里将运行AndroidStudio的主机称为开发端,将运行模拟器的主机称为调试端。

启动模拟器

启动模拟器之前需要安装模拟器,这里使用Android Studio AVD Manager 事先生成好的模拟器。因为不需要启动Android Studio,所以这里直接使用命令行的方式启动模拟器。

找到Android Sdk安装目录,我的是:

C:\Users\user\AppData\Local\Android\Sdk\

和模拟器文件所在目录,我的是:

C:\Users\user\.android\avd

模拟器目录下会有模拟器的名称,启动命令中会用到。
启动命令如下:

.\emulator\emulator.exe -avd Pixel_XL_API_31

emulator.exe在 android Sdk 目录下的emulator目录里。-avd 参数指定要启动的模拟器名称。

启动后,保持控制台窗口开启,不然会关闭模拟器。输入Ctrl+C可手动关闭模拟器。

如果启动失败需要查看端口是否被其他程序占用,默认启动的第一个模拟器需要 5554,5555两个端口都可用。

由于模拟器启动占用了控制台,我们需要另开控制台执行后续命令。

查看端口占用:

Netstat -ano|findstr "5554"

ADB连接

模拟器运行之后,需要连接ADB,完成桥接。然后在开发端连接调试端的ADB接口。

模拟器启动时一般会自动启动ADB服务。

ADB可执行程序所在位置在Android Sdk目录下的platform-tools目录下。

查看启动的模拟器名称和控制台端口:

.\platform-tools\adb.exe devices

可以看到输出结果为:

List of devices attached
emulator-5554

表明,模拟器控制台端口为5554,那么可知adb连接端口为5555。

端口映射

现在adb已经连接了模拟器,端口为5555,但是仅能在本地访问。要想在开发端连接模拟器,还需要将端口映射到外网。

相关命令如下:

添加端口转发:
netsh interface portproxy add v4tov4 5555 127.0.0.1 5555

查看端口转发情况:
netsh interface portproxy show all

删除端口转发:
netsh interface portproxy delete v4tov4 listenport=5555 listenaddress=* protocol=tcp

正常情况下执行第一条命令即可。

要想外网访问,还需要设置防火墙以放行5555端口。

找到 Windows Defender 高级安全功能。
在这里插入图片描述
点击入站规则 - 新建规则

在这里插入图片描述
选择端口,下一步,输入放行端口 5555,其他默认,最后一步名称自取。比如:ADB远程调试5555。

远程连接

以上设置都是在调试端完成,目的就是开放模拟器的ADB连接端口5555。然后在开发端 Android Studio Terminal 窗口输入:

adb connect 192.168.0.110:5555

192.168.0.110是调试端的ip地址,这样即可完成连接。

查看连接的设备状态:

adb devices

补充(2023.10.22)

端口占用问题

通常很少会修改办公电脑常用服务的默认端口,一般不会有服务占用这里的 5555 端口。但有一个常见的例外 Hyper-V。该服务会在系统的“TCP动态端口范围”内随机占用端口。有时候可能会占用到我们需要的端口。

以下命令可以查看TCP动态端口范围:

netsh int ipv4 show dynamicport tcp

查看已占用端口:

netsh int ipv4 show excludedportrange protocol=tcp

我们可以将TCP动态端口范围调整下,以防涵盖开发的常用端口。

设置TCP动态端口范围(管理员运行):

netsh int ipv4 set dynamic tcp start=49152 num=16384
netsh int ipv6 set dynamic tcp start=49152 num=16384

启动多个模拟器

为了方便,我们可以在防火墙入站规则那里多放行几个端口,比如5555-5599。
然后在端口转发时,添加多个映射:

netsh interface portproxy add v4tov4 5555 127.0.0.1 5555
netsh interface portproxy add v4tov4 5557 127.0.0.1 5557
netsh interface portproxy add v4tov4 5559 127.0.0.1 5559

模拟器多次启动时会自动增加端口号,导致我们需要反复添加上面的端口映射。我们可以让模拟器固定在某个端口启动:

.\emulator\emulator.exe -port 5554 -avd Pixel_XL_API_30
.\emulator\emulator.exe -port 5556 -avd Pixel_6_API_23
.\emulator\emulator.exe -port 5558 -avd Pixel_6_Pro_API_25

使用 -port 指定端口号。
开发端连接模拟器时,使用端口号区分。

adb connect 192.168.0.110:5555
adb connect 192.168.0.110:5557
adb connect 192.168.0.110:5559

其他问题

虽然原理很简单,但是执行命令时仍然会出现这样那样的问题,让简单的的事情变得复杂。

比如,模拟器启动之后,运行adb devices,有时候会提示 device offline。
再比如,运行命令检查端口时,Netstat -ano|findstr “5555” ,发现有个iphelper 进行占用了端口。

其实这些问题的根本原因都是端口被占用,也不是其他进程的问题,只是反复运行上面的命令或者模拟器重启后引起的。

这里提供完整的步骤,每次启动模拟器时,按顺序执行命令即可解决上面的问题。

以端口 5555 举例,其他类比。涉及路径,端口等请参考自己的开发环境。

  1. 先删除端口转发
netsh interface portproxy delete v4tov4 listenport=5555 listenaddress=* protocol=tcp
  1. 检查端口是否占用
Netstat -ano|findstr "5555"

如果发现有大量 TIME_WAIT 或者 CLOSE_WAIT 状态的进程占用端口,表示模拟器或者adb刚刚关闭,端口未释放,稍等一会儿再运行,直到没有任何进程占用端口。等待时间一般为4分钟。

  1. 启动adb
C:\Users\user\AppData\Local\Android\Sdk\platform-tools\adb.exe devices
  1. 新开dos启动模拟器
C:\Users\user\AppData\Local\Android\Sdk\emulator\emulator.exe -port 5554 -avd Pixel_2_API_23

注意端口号 -1

  1. 添加端口转发
netsh interface portproxy add v4tov4 5555 127.0.0.1 5555
  1. 开发端连接模拟器
adb connect 192.168.0.108:5555

启用多个模拟器,也是按照上面的步骤一个一个启动。

### 使用 Android Studio 进行远程设备连接开发调试 #### 通过Wi-Fi连接真机设备 对于高版本的Android Studio,内置了`Pair Devices Using Wi-fi`的功能来简化这一过程。用户只需确保待连接的移动设备与电脑处于相同的局域网络环境中,接着按照界面上给出的操作指引完成配对即可[^1]。 如果使用的不是最新版,则可以通过安装特定插件如`Android adb wifi`来达成相似效果。这类方案同样依赖于稳定的无线网络环境,并且要求目标装置已激活USB调试模式并初步建立了有线链接作为信任基础[^2]。 ```bash adb tcpip 5555 adb connect 设备IP地址:5555 ``` 上述命令用于切换ADB至TCP/IP模式并通过指定端口尝试建立连接。这里的“设备IP地址”应当替换为实际要访问的目标机器在网络内的唯一标识符[^3]。 #### 对应模拟器的处理方式 针对在同一局域网内运行的AVD(Android Virtual Device),虽然官方文档主要围绕实体终端展开讨论,但实际上只要遵循相同的原则——即先让模拟器实例能够被主机识别再进一步配置其联网属性——也能顺利实施远程接入。 具体来说,在启动所需测试的应用程序前,需确认虚拟设备本身支持网络共享特性并且正确设置了静态IP或其他形式可预测的寻址机制以便后续定位[^4]。 为了增强用户体验以及便于观察应用程序行为变化情况,推荐配合使用诸如scrcpy这样的第三方开源项目。它允许开发者不仅限于发送指令给远端系统,更能实时获取屏幕反馈甚至接管触控事件流,极大地方便了跨地点协作场景下的问题排查工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PeterGamp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值