想在Mac上远程控制安卓设备?scrcpy几乎是免费方案里的最优解——延迟低、无需在设备上装应用,直接用ADB就能镜像屏幕。但把它塞进一个Tauri桌面应用里,事情就没那么简单了。
这篇文章聊聊我在HiyokoKit里集成scrcpy时遇到的具体问题,以及怎么解决的。
![]()
scrcpy是什么
![]()
简单来说,scrcpy是个开源工具,通过ADB协议把安卓设备的屏幕实时镜像到电脑,同时支持键盘鼠标控制。Mac用户想免费投屏安卓,这几乎是唯一兼顾速度和稳定性的选择。它不需要在手机上装任何客户端,插线或无线都能用。
从Rust启动scrcpy
Tauri的后端是Rust,所以得用std::process::Command来拉起scrcpy进程。我封装了一个ScrcpyProcess结构体,核心就三个方法:start、stop、is_running。
start方法组装命令行参数:设备序列号、最大分辨率、视频码率、窗口标题,还有--no-audio禁用音频。spawn()启动进程后,把Child句柄存起来。stop直接kill进程。is_running用try_wait检查子进程是否还在运行,用来更新UI状态。
代码不复杂,但有个坑:scrcpy是外部二进制,Tauri应用怎么保证用户机器上一定有?
打包scrcpy进应用
两种路子:要么要求用户自己装scrcpy和adb,要么打包进应用资源。我选了后者,体验更完整。
在tauri.conf.json的bundle.resources里配置:
"resources": ["bin/scrcpy", "bin/adb"]
运行时通过app_handle.path().resource_dir()拿到资源目录,拼出完整路径。这里要注意,Mac上得用universal binary,同时兼容Intel和Apple Silicon。
![]()
检测窗口关闭
scrcpy有个特性:用户关掉镜像窗口,进程就退出。但Tauri应用本身还在跑,UI状态得同步更新,不然按钮还是"停止投屏"实际上已经断了。
我开了一个后台tokio任务,每秒轮询is_running()。发现进程没了,就emit一个scrcpy-stopped事件到前端,UI收到后重置状态。简单粗暴,但够用。
多设备切换
用户可能同时插着多台安卓设备,scrcpy的--serial参数用来指定投哪一台。需要先跑adb devices解析输出,拿到设备序列号,再传给scrcpy。
解析逻辑是:跳过第一行"List of devices attached",找包含"device"字样的行,取第一列就是序列号。没找到就报错。这个流程做成异步的,不阻塞主线程。
实际体验
这套方案跑下来,延迟控制在几十毫秒,日常调试完全够用。Tauri的跨平台特性也让后续移植Windows版本省了不少事——核心Rust代码不用动,换个资源路径就行。
如果你在折腾类似的桌面工具,希望这些细节能帮你少踩几个坑。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.