菜单

构建系统

相关源文件

本页面介绍了 scrcpy 使用的构建系统,涵盖了客户端和服务器组件。有关特定客户端和服务器实现细节的信息,请参阅 客户端组件服务器组件

Scrcpy 采用双组件构建系统,其中客户端应用程序(C 代码)使用 Meson 构建,服务器组件(Java 代码)使用 Gradle 或手动构建脚本构建。

概述

来源: meson.build app/meson.build server/build.gradle server/build_without_gradle.sh meson_options.txt cross_win32.txt cross_win64.txt

构建工具

Meson

Meson 是 scrcpy 的主要构建系统。它用于构建客户端应用程序,还可以触发服务器构建过程。Meson 处理依赖项管理、配置和特定于平台的构建设置。

Gradle

Gradle 用于构建服务器组件,即 Android 应用程序。它管理 Android SDK 依赖项、Java 编译,并将服务器打包成 JAR 文件。

手动构建脚本

对于没有 Gradle 的环境,scrcpy 提供了一个手动构建脚本(build_without_gradle.sh),可以直接使用 Android SDK 工具编译服务器组件。

来源: meson.build server/build.gradle server/build_without_gradle.sh meson_options.txt cross_win32.txt cross_win64.txt

项目配置

项目配置通过 meson_options.txt 中定义的 Meson 选项进行控制。主要选项包括:

选项类型默认描述
compile_app布尔值true构建客户端应用程序
compile_server布尔值true构建服务器组件
prebuilt_server字符串(无)预构建服务器 JAR 文件的路径
portable布尔值false使用可执行文件同目录下的服务器 JAR
static布尔值false使用静态依赖项
server_debugger布尔值false运行服务器并附加调试器
v4l2布尔值true在支持时启用 V4L2 功能 (Linux)
usb布尔值true在支持时启用 HID/OTG 功能

来源: meson_options.txt meson.build

客户端构建过程

客户端的构建过程由 Meson 管理,并在 app/meson.build 中定义。

源文件

客户端由多个 C 源文件组成,按功能组织:

  • 核心应用程序文件(main.c, scrcpy.c
  • ADB 通信(adb/*.c
  • 音视频处理(decoder.c, demuxer.c, audio_player.c
  • 屏幕显示和输入处理(screen.c, input_manager.c
  • 实用函数(util/*.c
  • 特定平台实现(sys/win/*.csys/unix/*.c

来源: app/meson.build1-66

依赖项

客户端依赖于几个外部库:

  • FFmpeg 库 (libavformat, libavcodec, libavutil, libswresample)
  • SDL2 (≥ 2.0.5)
  • 可选:libusb (用于 USB 功能)
  • 可选:libavdevice (用于 V4L2 支持)

如果启用了 static 选项,这些依赖项可以静态链接。

来源: app/meson.build115-129

特定平台配置

构建系统处理特定于平台的差异

  • Windows:添加 Windows 资源,包含其他库 (mingw32, ws2_32)
  • macOS:设置 macOS 特定标志 (_DARWIN_C_SOURCE)
  • Linux:在启用时包含 V4L2 支持

来源: app/meson.build74-91 app/meson.build131-134

服务端构建过程

服务器组件在 Android 设备上运行,可以与 Gradle 一起构建,也可以手动构建。

Gradle 构建

服务器在 build.gradle 中配置,设置如下:

  • 应用程序 ID:com.genymobile.scrcpy
  • 最低 SDK:21 (Android 5.0)
  • 目标 SDK:35 (Android 15)
  • 版本代码和名称与客户端匹配

Gradle 构建系统会编译 Java 源代码,处理 AIDL 文件,并将它们打包成 JAR 文件,然后推送到 Android 设备。

来源: server/build.gradle1-30

手动构建

对于没有 Gradle 的环境,build_without_gradle.sh 脚本提供了一种替代构建方法。

  1. 生成带有版本信息的 BuildConfig
  2. 编译 AIDL 文件为 Java
  3. 使用 Android 平台 JAR 编译 Java 源代码
  4. 使用 dx (Android < 31) 或 d8 (Android >= 31) 对类文件进行 Dex 操作
  5. 创建服务器 JAR 文件

脚本需要:

  • ANDROID_HOME 环境变量已设置
  • 已安装 Android SDK 和平台及构建工具

来源: server/build_without_gradle.sh1-116

交叉编译

Scrcpy 为从 Linux 环境交叉编译 Windows 客户端应用程序提供了配置文件。

Windows 交叉编译

交叉编译配置(cross_win32.txtcross_win64.txt)定义了:

  • 工具链二进制文件(编译器、链接器等)
  • 目标机器详细信息(系统、架构)

要使用这些配置,您需要:

  • 在 Linux 上安装 MinGW-w64 工具链
  • Windows 版本的依赖项(FFmpeg, SDL2 等)

构建方法是:

meson setup --cross-file cross_win64.txt build_win64
ninja -C build_win64

来源: cross_win32.txt cross_win64.txt

Windows 特定资源

在为 Windows 构建时,构建系统会包含特定于 Windows 的资源:

  • 图标资源
  • 应用程序清单(用于 DPI 感知)
  • 版本信息

这些在 app/scrcpy-windows.rcapp/scrcpy-windows.manifest 中定义,并会被编译和链接到最终的可执行文件中。

来源: app/scrcpy-windows.rc app/scrcpy-windows.manifest

测试

构建系统支持在调试模式下编译和运行测试。

  • 测试在 tests/ 目录中定义。
  • 每个测试都构建为一个单独的可执行文件。
  • 测试仅在调试模式下构建,因为它们依赖于断言。

来源:app/meson.build213-281