本文档描述了 scrcpy 中的设备控制系统,该系统负责客户端应用程序和 Android 设备之间的双向通信。它涵盖了负责向设备发送命令以及接收来自设备的响应和事件的组件。
有关屏幕和输入管理的信息,请参阅 屏幕和输入管理。有关 Android 端控制实现的详细信息,请参阅 控制系统。
设备控制系统通过发送各种命令(如输入事件、剪贴板内容和屏幕旋转请求)使客户端能够远程控制 Android 设备。它还允许客户端接收设备事件,如剪贴板更改和硬件接口消息。
该系统包含两个主要组件:
设备控制系统架构
来源:app/src/controller.h app/src/receiver.h
Controller 负责将控制消息发送到 Android 设备。它管理消息队列,对消息进行序列化,并通过网络套接字传输它们。
Controller 在 app/src/controller.h17-28中实现为 struct sc_controller,包含以下关键组件:
queue)control_socket)Controller 生命周期序列
来源:app/src/controller.c20-67 app/src/controller.c186-218
Controller 维护一个队列,其限制为 SC_CONTROL_MSG_QUEUE_LIMIT (60) 条消息。消息优先级如下:
消息队列由互斥锁保护,以确保并发访问时的线程安全。
来源:app/src/controller.c8 app/src/controller.c92-124
Receiver 处理来自 Android 设备的消息并进行相应的处理。它在一个单独的线程中运行,并将某些操作转发到主线程。
Receiver 在 app/src/receiver.h15-25中实现为 struct sc_receiver,包含以下关键组件:
control_socket)acksync)uhid_devices)Receiver 处理几种类型的设备消息:
| 消息类型 | 目的 | 处理器 |
|---|---|---|
DEVICE_MSG_TYPE_CLIPBOARD | 从设备接收剪贴板文本 | task_set_clipboard |
DEVICE_MSG_TYPE_ACK_CLIPBOARD | 确认剪贴板同步 | 直接处理 |
DEVICE_MSG_TYPE_UHID_OUTPUT | 硬件接口设备输出 | task_uhid_output |
收到剪贴板或 UHID 消息时,会将其发布到主线程进行处理,以保持与 SDL 操作的线程安全。
来源:app/src/receiver.c76-154 app/src/receiver.c44-74
客户端和设备之间的双向消息流如下图所示:
双向消息流
来源:app/src/controller.c92-124 app/src/controller.c126-144 app/src/receiver.c156-178
控制消息从创建到传输遵循特定的生命周期:
对于不可丢弃的消息,即使队列已满,系统也会确保其传递。
来源:app/src/controller.c92-124 app/src/controller.c126-144
设备控制系统使用多个线程,这些线程需要仔细的同步。
线程架构
同步机制包括:
controller->mutex) - 保护消息队列免受并发访问controller->msg_cond) - 当新消息到达时通知 Controller 线程sc_post_to_main_thread 转发到主线程来源:app/src/controller.c43-57 app/src/controller.c146-184 app/src/receiver.c44-74
控制系统包含多种错误处理机制:
发生错误时,Controller 和 Receiver 组件会调用各自的回调函数以通知应用程序。
来源:app/src/controller.c146-184 app/src/receiver.c180-217
设备控制系统与 scrcpy 的其他几个组件进行交互:
| 组件 | 交互 |
|---|---|
| Input Manager | 创建要发送到设备的控制消息 |
| Screen Display | 接收可能影响显示的通知 |
| Clipboard System | 处理双向剪贴板同步 |
| UHID Devices | 处理硬件接口设备消息 |
刷新此 Wiki
最后索引时间2025年4月17日(5900e9)