DroidDeck剪贴板互通指南:Android与Steam会话之间文本互拷的实现与使用教程
【免费下载链接】DroidDeckDroidDeck brings the SteamOS experience to Android项目地址: https://gitcode.com/gh_mirrors/dr/DroidDeck
DroidDeck 剪贴板互通让 Android 系统剪贴板与 Steam 会话(Wayland/Xwayland 客户端)之间的文本可以无缝互拷:在手机上复制一段启动参数,切回 Steam 会话按 Ctrl+V 即可原样粘贴,支持中文、日文、Emoji 等多语言 UTF-8 文本,全程数据只留在应用私有目录,不进入会话日志。
功能一览:剪贴板互通能做什么
| 方向 | 支持情况 | 说明 |
|---|---|---|
| Android → Steam 会话 | ✅ 支持 | 复制后在会话内 Ctrl+V 粘贴,含游戏启动选项 |
| Steam 会话 → Android | ✅ 支持 | Wayland 客户端复制的文本自动同步回 Android |
| 图片 / 文件 | ❌ 不支持 | 仅共享纯文本(text/plain) |
| 超长文本 | ⚠️ 有上限 | Xwayland 通道上限 64 KiB,超出会清空而非截断粘贴 |
测试报告详见 android-clipboard.md,其中记录了在 AYN Thor 上对多行文本、Unicode、8 KiB 大块文本、剪贴板清空与替换等场景的完整验证。
三步搞定:Android 复制到 Steam 粘贴
整个过程无需任何额外配置,剪贴板同步会在会话可见时自动生效:
- 在 Android 应用中复制文本——长按选中后点“复制”,或用键盘的 Ctrl+C;
- 切回 DroidDeck 的 Steam 会话——会话窗口获得焦点后,剪贴板文本已自动进入会话的剪贴板选择区;
- 按 Ctrl+V 粘贴——会话的 PC 键盘支持“粘滞 Ctrl 键”,单指按 Ctrl、再按 V 即可完成粘贴,也可使用 Steam 屏幕键盘的 Paste 按钮。
几个实用细节:
- 📋 剪贴板读取跟随窗口焦点,副屏的第二显示会话同样适用:主屏停留在 Steam,在副屏应用里复制的文本照样能传过去;
- 🔄 如果会话内程序刚刚“占用”了剪贴板,你在 Android 端重新复制一次,Android 侧的文本会重新恢复为当前选择;
- ⌨️ 该机制自 0.3.1 版本起提供,发布说明见 0.3.1.md。
实现原理:文本是怎么在三层系统间流动的
DroidDeck 的剪贴板互通由三个部分协作完成,核心源码都在仓库中:
1️⃣ Android 层:监听剪贴板变化
SessionClipboard.kt 注册了 Android 剪贴板变化监听器。每当primaryClip变化,refresh()(第 53-62 行)取出纯文本并做两件事:
- 通过 WaylandCompositor.java 的
setClipboardText()推给 Wayland 合成器; - 把完整 UTF-8 文本先写入
.pending临时文件,再用Os.rename()原子替换到session/android-clipboard私有文件(publish(),第 64-80 行)——原子重命名保证 Xwayland 辅助进程永远不会读到“半条启动命令”。
2️⃣ Wayland 合成器层:把 Android 文本变成“主机选择”
wl_clipboard.c 实现了wl_data_device_manager和zwlr_data_control_manager_v1两个协议(仅选择区,拒绝拖放)。其内部把选择区的持有者分为三种:程序(CLIENT)、Android 文本(HOST)、无(NONE)。
- Android → 会话:
clipboard_host_text()(第 499-517 行)把 Android 文本设为 HOST 选择并广播,任何 Wayland 客户端请求粘贴时,非阻塞写入器把文本通过文件描述符回传给它; - 会话 → Android:当会话内程序设置了带文本 MIME 的选择,合成器通过管道向该程序取回文本(1 MiB 上限、3 秒超时,见第 31-33 行宏定义),再经 JNI 回调
onClipboardText写回 Android 的ClipboardManager。
3️⃣ Xwayland 桥接层:让 Gamescope 内的游戏也能粘贴
Gamescope 的 Wayland 后端不会把外层合成器的剪贴板选择转发给它内部的 Xwayland,所以 DroidDeck 用一个会话辅助进程补上这段桥。clipboard.c 编译为droiddeck-clipboard,随会话启动脚本拉起(见 droiddeck-session):
- 用inotify监听私有文件的原子替换(靠 inode 区分“同文本重复复制”);
- 运行时动态加载
libX11.so.6,把 Android 文本发布为 X11CLIPBOARD原子,支持UTF8_STRING、TEXT、STRING等目标; - 超过 64 KiB 的文本会被拒绝(低于 X11 属性请求上限),宁可清空也不粘贴被截断的命令;
- 通过
PR_SET_PDEATHSIG绑定父进程生命周期,会话退出时辅助进程自动退出。
由于 gamescope 会把任一 Xwayland 服务器上的选择复制到全部服务器,发布在:0的 Android 文本也能到达运行在:1的游戏进程。
安全与限制:这些细节值得了解
- 🔒隐私安全:剪贴板文本只保存在应用私有数据目录(
context.filesDir/session/),SessionClipboard.kt只共享字面文本、绝不解析内容 URI 或加载复制的文件,文本也永远不会出现在会话日志中; - 🧹空剪贴板:Android 端清空剪贴板时,会话侧选择区同步变为 NONE;
- 🌐编码处理:纯 ASCII 文本才会额外提供
STRING(Latin-1)目标,避免 UTF-8 文本被 Latin-1 解码损坏; - ⏱️防死锁:会话程序 5 秒内不来读请求的文本、或 3 秒内不写完,合成器会放弃该次传输并释放资源。
总结
DroidDeck 的剪贴板互通用“Android 监听 → Wayland 主机选择 → Xwayland 辅助发布”三级流水线,把手机剪贴板自然延伸进了 Steam 会话,复制、粘贴的手感与桌面一致。想要亲手验证,推荐照着 android-clipboard.md 的测试流程走一遍:在 Android 编辑器里复制一条启动命令,切回会话粘贴进 Steam 的启动选项,即可看到逐字节一致的结果。
【免费下载链接】DroidDeckDroidDeck brings the SteamOS experience to Android项目地址: https://gitcode.com/gh_mirrors/dr/DroidDeck
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考