菜单

核心应用

相关源文件

核心应用程序是scrcpy的中心组件,负责初始化、协调和管理所有实现设备屏幕镜像和控制的子系统。它作为应用程序的主要入口点,处理scrcpy会话从启动到关闭的整个生命周期。

本页涵盖了scrcpy应用程序的主要结构、初始化过程和事件处理。有关屏幕渲染等独立组件的详细信息,请参阅屏幕和输入管理;有关视频/音频处理的详细信息,请参阅视频和音频处理

系统架构

核心应用程序将scrcpy的所有组件绑定在一起,管理它们的生命周期并促进它们之间的通信。它主要在scrcpy.c中实现,其中包含主入口点函数scrcpy()和核心数据结构struct scrcpy

架构图

来源:app/src/main.c26-103 app/src/scrcpy.c48-91 app/src/scrcpy.c369-1057

核心数据结构

struct scrcpy包含了构成应用程序的所有组件

来源:app/src/scrcpy.c48-91

初始化过程

核心应用程序中的初始化过程负责设置屏幕镜像和设备控制所需的所有组件。

初始化流程

来源:app/src/scrcpy.c369-916 app/src/server.c518-570

应用程序入口点

核心应用程序的入口点是scrcpy()函数,它接受一个struct scrcpy_options参数,该参数包含所有用户指定的选项。该函数返回一个退出代码,指示成功或失败类型。

初始化过程包括

  1. SDL 初始化
  2. 服务器设置和启动
  3. 连接建立
  4. 组件初始化(视频/音频、录制器、控制器、屏幕)
  5. 事件循环启动

来源:app/src/scrcpy.c369-936 app/src/scrcpy.h19-20

关键组件

服务器管理

服务器组件(struct sc_server)处理与安卓设备的通信

  • 将服务器二进制文件推送到设备
  • 通过ADB启动服务器进程
  • 建立视频、音频和控制的套接字连接
  • 管理连接和断开连接事件

关键服务器函数

  • sc_server_init: 初始化服务器结构
  • sc_server_start: 在设备上启动服务器进程
  • sc_server_connect_to: 连接到服务器套接字
  • sc_server_stop: 停止服务器进程

来源:app/src/server.c518-742 app/src/server.h76-98

视频和音频处理

视频和音频处理涉及多个组件

  • 解复用器:从设备接收编码的视频和音频流
  • 解码器:将流解码为可显示的帧
  • 延迟缓冲区:可选缓冲区以减少抖动
  • 帧接收器:解码帧的目标(屏幕、录制器)

这些组件之间的关系在初始化期间配置

Server -> Demuxers -> Decoders -> [Delay Buffers] -> Frame Sinks (Screen, Recorder, V4L2)

来源:app/src/scrcpy.c566-621 app/src/scrcpy.c823-860

输入处理

输入处理通过以下方式管理

  • 控制器:向设备发送控制消息
  • 输入处理器:将本地输入转换为设备命令
    • 键盘处理器:处理键盘事件
    • 鼠标处理器:处理鼠标事件
    • 游戏手柄处理器:处理游戏手柄事件

应用程序支持多种输入模式

  • SDK:使用安卓SDK API
  • UHID:使用Linux的UHID内核模块
  • AOA:使用安卓开放附件协议

来源:app/src/scrcpy.c624-784

屏幕显示

屏幕组件(struct sc_screen)处理

  • 创建和管理显示窗口
  • 从解码器渲染帧
  • 捕获和处理输入事件
  • 管理窗口状态(全屏、旋转等)

在初始化期间,屏幕组件作为帧接收器连接到视频解码器

video_decoder.frame_source -> [video_buffer (optional)] -> screen.frame_sink

来源:app/src/scrcpy.c790-834

事件循环

事件循环流程

来源:app/src/scrcpy.c167-207

事件类型

核心应用程序处理两种类型的事件

  1. SDL事件:标准SDL事件,如键盘、鼠标、窗口和退出事件
  2. 自定义事件:为scrcpy定义的应用程序特定事件
    • 设备断开连接
    • 错误事件(解复用器、控制器、录制器)
    • 达到时间限制
    • 主线程运行请求

自定义事件以SC_EVENT_*前缀定义,并被推送到SDL事件队列。

来源:app/src/scrcpy.c167-207 app/src/events.h

事件处理回调

核心应用程序设置了多个回调以处理异步事件

回调目的
sc_server_on_connection_failed当连接到服务器失败时调用
sc_server_on_connected当连接到服务器成功时调用
sc_server_on_disconnected当服务器断开连接时调用
sc_recorder_on_ended当录制结束时调用
sc_video_demuxer_on_ended当视频流结束时调用
sc_audio_demuxer_on_ended当音频流结束时调用
sc_controller_on_ended当控制器结束时调用
sc_timeout_on_timeout达到时间限制时调用

这些回调通常将相应的事件推送到SDL事件队列,由主事件循环处理。

来源:app/src/scrcpy.c251-343 app/src/scrcpy.c468-472

终止和清理

当应用程序终止时(无论是由于用户请求、错误还是达到时间限制),它将执行以下操作:

  1. 停止所有活动组件
  2. 加入所有线程
  3. 释放所有资源
  4. 返回适当的退出代码

清理顺序经过精心安排,以确保正确关闭

  1. 停止超时
  2. 停止服务器(关闭套接字)
  3. 以正确的顺序加入并销毁组件以避免竞态条件
  4. 返回适当的退出代码

来源:app/src/scrcpy.c936-1057

退出码

核心应用程序可以返回三种可能的退出代码

退出码含义
SCRCPY_EXIT_SUCCESS0程序正常终止
SCRCPY_EXIT_FAILURE1未能建立连接
SCRCPY_EXIT_DISCONNECTED2运行期间设备断开连接

来源:app/src/scrcpy.h8-16

命令行选项

核心应用程序支持多种命令行选项,这些选项在cli.c中处理,并作为struct scrcpy_options传递给scrcpy()函数。这些选项控制应用程序行为的所有方面,包括

  • 显示配置
  • 视频和音频设置
  • 输入处理模式
  • 录制选项
  • 连接参数

有关可用选项的详细信息,请参阅安装与设置使用指南页面。

来源:app/src/cli.c1-1100 app/src/options.h230-330