如何使用ADB端口转发?Android Studio调试插件开发相关问询
嘿,我来帮你理清楚ADB端口转发的逻辑,以及怎么在你的Android Studio调试插件里落地~
首先得明确ADB的核心架构:开发机上跑着adb server后台进程,设备上有adbd守护进程,端口转发本质上是让ADB作为中间层,帮你打通开发机和设备之间的端口通信,完全不用你自己去处理USB传输的底层细节。
两种端口转发模式的原理
ADB提供两种转发方式,对应不同的通信方向:
正向转发(Port Forwarding)
命令格式:adb forward tcp:<开发机端口> tcp:<设备端口>
作用是把开发机指定端口的请求,通过ADB转发到设备的对应端口。举个例子:你在设备上启动一个ServerSocket监听8888端口,执行这条命令后,开发机上的客户端程序连接localhost:8888,ADB就会自动把数据通过USB传到设备的8888端口,被设备的ServerSocket接收。反向转发(Reverse Port Forwarding)
命令格式:adb reverse tcp:<开发机端口> tcp:<设备端口>
这个是反向打通通道:把设备指定端口的请求,转发到开发机的对应端口。比如你在开发机上启动ServerSocket监听9999端口,执行命令后,设备上的客户端连接localhost:9999,设备的adbd会把数据通过USB传到开发机的9999端口,被开发机的ServerSocket接收。
你的疑问:是否需要两端都启动ServerSocket?
答案是不需要,完全看你选择的转发模式:
- 如果用正向转发:只需要在设备端启动
ServerSocket,开发机这边直接做客户端,连接开发机的转发端口就行,ADB会帮你完成数据中转。 - 如果用反向转发:只需要在开发机端启动
ServerSocket,设备端做客户端连接设备的转发端口,数据会自动通过ADB传到开发机。
针对你插件场景的推荐方案
你的需求是:插件在开发机启动服务器,设备端向指定端口发送数据。这种情况用反向转发最适合,步骤大概是这样:
- 插件启动时,在开发机上启动
ServerSocket,监听一个固定端口(比如10000)。 - 执行ADB反向转发命令:
adb reverse tcp:10000 tcp:10000(这里设备端用的端口和开发机一致,也可以自定义不同端口,只要对应上就行)。 - 设备端的应用作为客户端,连接设备的
localhost:10000,发送文件、请求、日志等数据,这些数据会通过ADB的反向转发通道,直接传到开发机插件的ServerSocket上。
额外注意点
- 转发通道会一直维持,直到你重启ADB,或者执行
adb reverse --remove-all清除所有反向转发规则,所以插件关闭时可以自动执行清除命令,避免残留。 - 在插件里调用ADB命令,可以用Java的
Runtime.getRuntime().exec()或者ProcessBuilder来实现,记得处理命令执行的输出和异常情况。 - 测试阶段可以先用手动执行ADB命令,配合telnet或nc工具验证通信是否正常,再集成到插件逻辑里。
内容的提问来源于stack exchange,提问作者noobEinstien

