菜单

服务端构建过程

相关源文件

本文档介绍了 scrcpy 服务器组件的构建过程,该组件运行在 Android 设备上。有关构建运行在您计算机上的客户端组件的信息,请参阅客户端构建流程

概述

scrcpy 服务器是一个 Android 应用程序,它捕获设备屏幕,对其进行编码,然后将其发送到运行在计算机上的客户端。服务器可以使用以下任一方法构建:

  1. Gradle(标准 Android 构建系统)
  2. 手动构建脚本(build_without_gradle.sh

这两种方法都生成一个服务器二进制文件,在连接期间由客户端应用程序推送到 Android 设备。

来源:server/build.gradle server/build_without_gradle.sh

Gradle 构建流程

Gradle 是 scrcpy 服务器的主要构建方法。它负责编译 Java 源代码,生成必要文件,并将服务器打包成 APK。

Gradle 配置

服务器的 Gradle 配置指定了

  • Android API 兼容性(最低 SDK 21,目标 SDK 35)
  • 版本信息(版本代码 30200,版本名称“3.2”)
  • 应用程序 ID“com.genymobile.scrcpy”
  • 构建功能(BuildConfig 生成和 AIDL 支持)

来源:server/build.gradle1-30

构建配置详情

服务器配置了以下属性:

属性目的
applicationIdcom.genymobile.scrcpy唯一标识应用程序
minSdkVersion21支持的最低 Android 版本(5.0 Lollipop)
targetSdkVersion35目标 Android 版本(14)
versionCode30200内部版本号
versionName"3.2"用户可见的版本字符串

来源:server/build.gradle3-13

手动构建流程

手动构建脚本 build_without_gradle.sh 提供了一种无需 Gradle 构建系统即可构建服务器的替代方法。这对于没有 Gradle 的环境或自定义构建场景很有用。

手动构建概述

脚本执行以下操作:

  1. 生成带有版本信息的 BuildConfig Java 文件
  2. 处理 AIDL 文件以生成 Java 接口
  3. 使用 javac 编译 Java 源文件
  4. 使用 dx 或 d8(取决于平台版本)将 Java 字节码转换为 DEX 格式
  5. 将 DEX 文件打包成 JAR

来源:server/build_without_gradle.sh1-116

环境设置

该脚本需要设置某些环境变量:

可变默认描述
ANDROID_PLATFORM35要构建的 Android API 级别
ANDROID_BUILD_TOOLS35.0.0使用的 Android build tools 版本
ANDROID_HOME(系统)Android SDK 安装路径
BUILD_DIRbuild_manual构建输出目录

来源:server/build_without_gradle.sh17-22

源文件组织

手动构建处理以下 Java 源目录:

com/genymobile/scrcpy/*.java
com/genymobile/scrcpy/audio/*.java
com/genymobile/scrcpy/control/*.java
com/genymobile/scrcpy/device/*.java
com/genymobile/scrcpy/opengl/*.java
com/genymobile/scrcpy/util/*.java
com/genymobile/scrcpy/video/*.java
com/genymobile/scrcpy/wrappers/*.java

该脚本还处理 AIDL 接口文件:

  • android/content/IOnPrimaryClipChangedListener.aidl
  • android/view/IDisplayWindowListener.aidl

来源:server/build_without_gradle.sh48-68

DEX 编译过程

该脚本根据 Android 平台版本使用不同的 DEX 编译方法:

  • 对于 API 31 以下的平台

    • 使用 dx 工具将 Java 字节码转换为 DEX
    • 打包成 JAR 文件
  • 对于 API 31 及以上平台

    • 使用 d8 工具(较新的 Android DEX 编译器)
    • 创建一个 ZIP 文件,该文件将被重命名为服务器二进制文件

来源:server/build_without_gradle.sh88-111

与项目构建系统的集成

服务器构建过程通过主 meson.build 文件集成到整体 scrcpy 构建系统中。它包含一个条件指令,根据 compile_server 选项来编译服务器。

来源:meson.build1-19

服务器清单

服务器使用极简的 Android manifest 文件,因为它不是标准的 Android 应用程序。它不定义 Activity、Service 或 Receiver,因为服务器通过 `app_process` 命令直接通过 ADB 启动。

来源:server/src/main/AndroidManifest.xml1-3

版本控制

服务器版本与客户端版本同步(当前为 3.2)。此版本在多个位置定义:

  • build.gradle 中作为 versionName
  • build_without_gradle.sh 中作为 SCRCPY_VERSION_NAME
  • 在根目录的 meson.build 中作为项目版本

保持这些版本同步对于确保客户端和服务器组件之间的兼容性至关重要。

来源:server/build.gradle11 server/build_without_gradle.sh15 meson.build2