菜单

设备控制

相关源文件

本文档描述了 scrcpy 中的设备控制系统,该系统负责客户端应用程序和 Android 设备之间的双向通信。它涵盖了负责向设备发送命令以及接收来自设备的响应和事件的组件。

有关屏幕和输入管理的信息,请参阅 屏幕和输入管理。有关 Android 端控制实现的详细信息,请参阅 控制系统

概述

设备控制系统通过发送各种命令(如输入事件、剪贴板内容和屏幕旋转请求)使客户端能够远程控制 Android 设备。它还允许客户端接收设备事件,如剪贴板更改和硬件接口消息。

该系统包含两个主要组件:

  1. Controller - 将控制消息从客户端发送到设备
  2. Receiver - 处理来自设备的到客户端的消息

设备控制系统架构

来源:app/src/controller.h app/src/receiver.h

Controller 组件

Controller 负责将控制消息发送到 Android 设备。它管理消息队列,对消息进行序列化,并通过网络套接字传输它们。

Controller 结构

Controller 在 app/src/controller.h17-28中实现为 struct sc_controller,包含以下关键组件:

  • Message Queue - 用于存储控制消息的线程安全队列(queue
  • Control Socket - 用于与设备通信的套接字(control_socket
  • Thread Management - 用于线程安全操作的线程、互斥锁和条件变量
  • Receiver - 内嵌的接收器组件,用于处理设备响应

Controller 生命周期

Controller 生命周期序列

来源:app/src/controller.c20-67 app/src/controller.c186-218

消息队列管理

Controller 维护一个队列,其限制为 SC_CONTROL_MSG_QUEUE_LIMIT (60) 条消息。消息优先级如下:

  1. 如果队列未满,则接受所有消息
  2. 如果队列已满,则只接受不可丢弃的消息
  3. 当队列已满时,可丢弃的消息将被丢弃

消息队列由互斥锁保护,以确保并发访问时的线程安全。

来源:app/src/controller.c8 app/src/controller.c92-124

Receiver 组件

Receiver 处理来自 Android 设备的消息并进行相应的处理。它在一个单独的线程中运行,并将某些操作转发到主线程。

Receiver 结构

Receiver 在 app/src/receiver.h15-25中实现为 struct sc_receiver,包含以下关键组件:

  • Control Socket - Controller 使用的相同套接字(control_socket
  • Thread - 用于接收消息的专用线程
  • ACK Sync - 确认同步机制(acksync
  • UHID Devices - 用于处理硬件接口消息的 HID 设备管理(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

控制消息生命周期

控制消息从创建到传输遵循特定的生命周期:

  1. Creation - 控制消息由输入处理程序或其他客户端组件创建
  2. Queueing - 消息被添加到 Controller 的队列中
  3. Serialization - 消息被序列化为二进制格式
  4. Transmission - 序列化数据通过控制套接字发送到设备
  5. Cleanup - 传输后释放消息资源

对于不可丢弃的消息,即使队列已满,系统也会确保其传递。

来源:app/src/controller.c92-124 app/src/controller.c126-144

线程管理与同步

设备控制系统使用多个线程,这些线程需要仔细的同步。

线程架构

同步机制包括:

  1. Mutex (controller->mutex) - 保护消息队列免受并发访问
  2. Condition Variable (controller->msg_cond) - 当新消息到达时通知 Controller 线程
  3. Main Thread Tasks - 一些操作通过 sc_post_to_main_thread 转发到主线程

来源:app/src/controller.c43-57 app/src/controller.c146-184 app/src/receiver.c44-74

错误处理

控制系统包含多种错误处理机制:

  1. Socket Closure Detection - Controller 和 Receiver 均能检测套接字关闭情况并通知应用程序
  2. Message Overflow - 系统通过优先处理不可丢弃的消息来处理消息队列溢出
  3. Graceful Shutdown - 正确的清理流程可确保资源得到释放

发生错误时,Controller 和 Receiver 组件会调用各自的回调函数以通知应用程序。

来源:app/src/controller.c146-184 app/src/receiver.c180-217

与其他组件的关系

设备控制系统与 scrcpy 的其他几个组件进行交互:

组件交互
Input Manager创建要发送到设备的控制消息
Screen Display接收可能影响显示的通知
Clipboard System处理双向剪贴板同步
UHID Devices处理硬件接口设备消息

来源:app/src/controller.h app/src/receiver.h8-11