如何在同一Android设备上连接本地ADB守护进程实现虚拟控制器?
实现建议
本地ADB守护进程连接方案
Android设备上的ADB守护进程(adbd)支持两种本地连接方式,你可以基于WebADB的协议适配对应路径:
- TCP回环连接:开启ADB调试后,adbd会监听回环地址
127.0.0.1:5555。你可以直接修改WebADB的连接目标为该地址,无需大幅改动传输层代码。缺点是需要用户在开发者选项中开启「USB调试」及「无线调试」(部分Android版本要求),或引导用户执行adb tcpip 5555命令启用TCP模式。 - Unix域套接字连接:adbd默认监听
/dev/socket/adb套接字,这是本地进程与adbd通信的原生通道。你需要修改WebADB的AdbDaemonTransport实现,将原TCP Socket替换为Android的LocalSocket,调用connect(new LocalSocketAddress("/dev/socket/adb"))完成连接。注意:非root设备下,普通APP无权限直接访问该套接字(权限为system:adb组专属),仅root后的设备可使用此方案。
WebADB代码适配要点
针对你提到的transport.ts代码,核心调整如下:
- 若采用TCP回环:仅需将连接的IP地址从外部主机改为
127.0.0.1,端口保持5555即可复用原有TCP传输逻辑。 - 若采用Unix域套接字:
- 实现适配Android
LocalSocket的传输层方法,替换原TCP的connect、read、write操作,对应调用LocalSocket的输入输出流方法。 - 若设备已root,可在连接前通过
su -c chmod 777 /dev/socket/adb临时修改套接字权限,或切换到adb组进程执行连接。
- 实现适配Android
输入命令下发逻辑
成功连接adbd后,直接复用WebADB的命令执行框架,发送shell:input系列命令实现触控模拟:
- 手柄按键对应单点触控:发送
shell:input tap <x> <y>,其中<x>``<y>为游戏按钮的屏幕坐标。 - 摇杆移动对应滑动手势:发送
shell:input swipe <x1> <y1> <x2> <y2> <duration>,根据摇杆偏移量计算起始/结束坐标,duration控制滑动速度。
备选方案:无障碍服务
如果ADB路径遇到权限瓶颈,可考虑Android无障碍服务方案:
- 无障碍服务无需系统APP权限,仅需用户在设置中授予权限即可模拟触控输入。
- 将手柄输入转换为
GestureDescription对象,通过AccessibilityService.dispatchGesture()发送触控事件,实现逻辑更简洁,用户体验无需依赖ADB调试。
内容的提问来源于stack exchange,提问作者johnpeng47
相关产品推荐
相关产品推荐

