ADB连接虚拟机的核心原理是借助TCP/IP网络调试协议,让宿主机与虚拟机内的ADB守护进程完成握手通信,从而获得shell控制权限并执行打开或操控虚拟机的命令。实际操作远比许多教程描述的简单,关键只在于找准IP、配对端口、开启调试开关。
如何用ADB打开虚拟机:完整操作路径
要顺利用ADB打开虚拟机,你不能只懂敲命令,下文把前置条件、连接细节和开机后的具体操作拆开讲清楚,按步骤照做即可。
ADB打开虚拟机的前置条件
很多人在第一步就栽了跟头,原因是虚拟机里压根没装ADB调试组件,或者网络模式设置不匹配,建立稳定连接前,请逐项确认以下条件:
- 虚拟机系统已安装ADB工具链,推荐使用Android SDK Platform-Tools,版本至少为30.0.0以上
- 虚拟机的网络模式设置为桥接模式或仅主机模式,NAT模式下宿主机无法直接访问虚拟机IP
- 虚拟机与宿主机处于同一局域网段,例如宿主机为192.168.1.10,虚拟机设置为192.168.1.20
- 系统已关闭防火墙,或在防火墙中放行TCP 5555端口
- 已获取虚拟机的root权限,部分深度定制的Android-x86系统默认关闭网络调试服务
一个额外提醒:如果你用的是VirtualBox或VMware这类传统虚拟机,需要在虚拟机设置里把网卡模式从“网络地址转换”改为“桥接网卡”,否则后面执行adb connect时会一直卡在无法连接的状态。
4步完成ADB连接虚拟机
完成连接动作不需要花哨技巧,以下是经过大量场景验证的最短路径:
第一步:查询虚拟机的IP地址
进入虚拟机系统,打开终端或Settings界面,执行:
ip addr show
或者直接查看“设置关于本机状态信息”里的IP地址,记录下这个IP,它就是后续adb connect的关键参数,小分辨率下看不清数据时,建议先用ifconfig命令重定向到文本文件读取出字。
第二步:开启虚拟机的ADB网络调试模式
在虚拟机的终端里执行:
setprop service.adb.tcp.port 5555 stop adbd start adbd
这个操作等价于在物理手机上打开“开发者选项网络调试”,它会重启ADB守护进程并使其监听5555端口,部分系统固件不支持动态修改属性,此时需要直接编辑build.prop文件,追加一行:
service.adb.tcp.port=5555
保存后重启虚拟机。
第三步:宿主机执行连接命令
回到宿主机终端(Windows是CMD,macOS或Linux是Shell),输入:
adb connect 192.168.1.20:5555
这里的IP地址替换成第一步记录的实际值,连接成功后,终端会回显connected to 192.168.1.20:5555。
第四步:验证并打开虚拟机中的应用
执行:
adb shell
你会在终端里看到虚拟机系统的命令提示符,例如root@x86:/ #,此刻你可执行以下指令打开虚拟机里的任意应用或服务:
# 打开某个已安装的APK包 adb shell am start -n com.android.settings/.Settings # 唤醒处于休眠状态的虚拟机屏幕 adb shell input keyevent KEYCODE_WAKEUP
把包名替换成目标应用即可,例如打开虚拟机的浏览器就换成com.android.browser/.BrowserActivity,所有操作即刻生效,无延迟,无弹窗。
ADB连接虚拟机失败怎么办
连接失败是高频问题,但根本原因往往集中在端口、服务状态和版本兼容三件事上,对照以下排查清单逐项核验,可解决绝大多数报错。
排查端口与网络连通性
先在宿主机上执行:
ping 192.168.1.20
若ping不同,说明虚拟机与宿主机物理链路不通,需检查网卡绑定和IP配置,若ping通但adb connect报错,问题大概率在端口:
# Windows下查看5555端口监听状态 netstat -ano | findstr 5555 # Linux/macOS下执行 lsof -i:5555
没有任何输出则说明虚拟机里的ADB守护进程没有启动或未监听该端口,重新执行第二步的setprop和start adbd命令。
检查虚拟机ADB调试模式的开启状态
部分精简版Android系统在重启后会重置网络调试属性,进入虚拟机终端,执行getprop service.adb.tcp.port,如果返回值不是5555,需要重新设置。
行业共识认为,持久化方案更可靠的是把属性写入/data/local.prop文件(需root权限),这样系统每次启动时会自动加载:
echo "service.adb.tcp.port=5555" > /data/local.prop chmod 644 /data/local.prop
宿主机ADB版本与兼容性处理
如果你同时对接过真机和多个虚拟机,宿主机ADB版本低会引发协议握手失败或长期卡在unable to connect,先在本机执行:
adb version
低于0.41版本的建议前往Android开发者官网下载最新Platform-Tools,高版本ADB会反向兼容旧协议,但旧版本与新虚拟机系统之间却经常出现通信时序错乱。
如果一种常见的尝试换一台宿主机去连接同一台虚拟机,有时会发现原来报错的原因竟是宿主机的USB驱动占用了ADB服务,快捷解决方式是指定ADB服务器的通信端口:
adb -P 5038 kill-server adb -P 5038 start-server adb connect 192.168.1.20:5555
ADB连接模拟器与真机的区别
许多初学者常把ADB操作真机的经验直接搬到虚拟机上运行,这种行为会带来大量逻辑冲突,两者在连接机制与命令细节上有三类显著差异:
- 虚拟机的ADB连接走的是纯网络通道,真机默认走USB通道且需在开发者选项里手动开启USB调试
- 模拟器(如Android Studio自带的AVD)有独立固定端口,例如AVD通常使用5554与5555,而VMware里的Android系统则是任意本地局域网IP
- 真机连接时若未授权调试会弹出确认对话框,虚拟机则完全由系统控制,没有任何用户交互确认机制
端口与连接方式的差异对照
| 对比维度 | 传统虚拟机(VMware/VirtualBox) | Android模拟器(AVD/Genymotion) | 真机 |
|---|---|---|---|
| 默认端口 | 自定义5555或5557 | 固定5555(奇数端口为Console) | USB直连或IP:5555 |
| 网络来源 | 桥接/仅主机模式 | 仅限宿主本机回环地址 | WiFi或USB |
| 授权机制 | 无需授权 | 无需授权 | 需弹窗确认 |
| 连接稳定度 | 受局域网环境影响较大 | 极高(仅本机通信) | 高 |
不同场景下的命令差异
在模拟器上,一行命令即可完成连接:adb emu avd name、adb emu kill都属于模拟器专属指令,而在虚拟机中,你需要直接操控Linux或Android系统守护进程,相当于半个系统管理者:
# 在虚拟机场景下,adb shell之后敲入的常见操作 adb shell am force-stop com.android.launcher # 强制停止虚拟机桌面 # 真机上这类操作往往需要root,而虚拟机内通常默认允许
虚拟机ADB调试端口设置的深度实践
选定端口和参数时要规划清楚,不合理的设置会使得ADB命令成功连接到虚拟机却无法打开指定应用,以下几个调优点值得逐一落实:
- 端口尽量避开各厂商默认占用的区段,例如5037是宿主机ADB Server的端口,不要设为同一数值
- 虚拟机内Android系统若使用旧内核,请关闭IPv6协议栈,ADB的TCP模式在纯IPv4环境下的响应速度明显更快
- 设置静态IP并与宿主机的路由表绑死,避免虚拟机重启后DHCP重分配导致连接地址失效
- 每次宿主机重启后,优先执行
adb kill-server再重新发起adb connect,防止socket缓存带来的串线
若你的虚拟机运行的是新近发布的Android版本且系统开启了SELinux强制模式,需要在虚拟机内临时关闭SELinux:
setenforce 0
否则setprop命令会受限制而出错,这在各安卓社区都有大量同类报错记录,执行完所有配置后,验证连接是否彻底通畅:
adb devices
输出列表里出现168.1.20:5555 device即代表一切就绪。
常见问题解答
在Windows宿主机连接虚拟机时提示cannot connect to 192.168.1.20:5555,如何定位原因?
这类报错通常是TCP端口不可达导致,先在虚拟机终端里确认ADB进程是否活着:执行ps -A | grep adbd,如果有输出且显示-tcp参数则说明守护进程已监听,接着查路由表ip route,确认虚拟机网关与宿主机IP在同一子网内,Windows的防火墙入站规则中若存在“阻止所有传入连接”策略,需额外将adb.exe或5555端口加入放行列表,如果虚拟机本身使用的是仅主机模式网卡,请手动为宿主机的VirtualBox Host-Only Network接口配置与虚拟机同网段的静态IP,例如虚拟机IP为192.168.56.101,宿主机网卡就设为192.168.56.1,至此,连接即可恢复。
虚拟机ADB连接成功后打开应用提示Activity not started,是什么原因?
此现象多见于目标应用包名或Activity名称不准确,从Android 10开始,部分系统应用不再允许隐式Intent启动,解决方式是先执行adb shell dumpsys package <包名> | grep -A 3 "android.intent.action.MAIN"获取准确的启动Activity全限定名,再显式传入该名称发起启动命令,若应用仍拒绝启动,请检查虚拟机内的显示分辨率与屏幕密度参数,adb shell wm size所显示的数值若过低,部分应用会因界面适配问题而静默退出,此时用adb shell wm size 1080x1920重置分辨率后重试。
ADB连接模拟器与真机时,是否存在价格或激活费用上的差异?
不存在,ADB工具链是Android SDK中的免费组件,由谷歌公开提供,无论连接虚拟机、模拟器还是物理真机都不产生任何许可证费用,云真机与云手机这类商用服务之所以收费,是因其提供了额外的远程机房设备占用、带宽调度与实例管理能力,这部分定价完全来自资源租赁而非ADB技术本身,个人在本机通过VMware或VirtualBox安装Android镜像,在虚拟机ADB调试端口设置正确且网络通畅的前提下,投入成本仅为电能与硬件占用费。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/928477.html


评论列表(1条)
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是执行部分,给了我很多新的思路。感谢分享这么好的内容!