当前位置: 首页 > article >正文

告别预编译:手把手教你从源码编译Scrcpy的Android Server端(含Meson配置详解)

从零构建Scrcpy Android Server端Meson与Gradle深度协作指南在Android投屏工具Scrcpy的生态中大多数用户都习惯于直接使用预编译的Server端APK。但当你需要修改投屏协议、优化视频编码参数或添加自定义功能时从源码完整编译Server端就成为必备技能。本文将揭示Scrcpy构建系统中Meson与Gradle的精妙协作机制带你突破预编译限制掌握从源码到产出的完整工具链。1. 编译环境深度配置1.1 工具链版本锁定Scrcpy对构建工具版本有严格要求版本不匹配会导致各种隐性问题。推荐使用以下组合# Android SDK sdkmanager platforms;android-29 build-tools;30.0.3 # NDK (Side by side模式) sdkmanager ndk;21.4.7075529 --install # Meson pip install meson0.61.5 # Ninja brew install ninja # macOS sudo apt install ninja-build # Ubuntu关键组件版本对照表组件最低版本推荐版本版本检测命令Android SDKAPI 28API 29sdkmanager --listNDK21.021.4.7075529ndk-build --versionMeson0.58.00.61.5meson --versionGradle6.1.17.0.2gradle --version提示建议在项目根目录创建.tool-versions文件使用asdf等版本管理工具锁定环境android-sdk 29.0.3 ndk 21.4.7075529 meson 0.61.51.2 环境变量关键配置在~/.bashrc或~/.zshrc中添加export ANDROID_HOME$HOME/Android/Sdk export NDK_HOME$ANDROID_HOME/ndk/21.4.7075529 export PATH$NDK_HOME:$ANDROID_HOME/platform-tools:$PATH验证环境有效性# 检查adb连接 adb devices # 验证NDK ndk-build --version # 确认Meson meson setup --help | grep cross-file2. 构建系统解密Meson与Gradle的协作2.1 构建流程全景图Scrcpy的构建过程呈现典型的双阶段特征Meson主导阶段解析根目录meson.build检查prebuilt_server选项调用build-wrapper.shGradle构建阶段执行server/build.gradle生成APK文件通过wrapper脚本重命名产物graph TD A[Meson主构建] --|prebuilt_server| B[调用build-wrapper.sh] B -- C[执行gradlew assemble] C -- D[生成server-debug.apk] D -- E[重命名为scrcpy-server]2.2 关键构建文件解析server/meson.build核心逻辑prebuilt_server get_option(prebuilt_server) if prebuilt_server # 源码编译路径 custom_target(scrcpy-server, command: [ find_program(./scripts/build-wrapper.sh), meson.current_source_dir(), OUTPUT, get_option(buildtype) ], output: scrcpy-server, install_dir: share/scrcpy) else # 预编译文件路径 custom_target(scrcpy-server-prebuilt, input: prebuilt_server, command: [cp, INPUT, OUTPUT], output: scrcpy-server, install_dir: share/scrcpy) endifbuild-wrapper.sh的智能处理#!/bin/bash PROJECT_ROOT$1 OUTPUT$2 BUILDTYPE$3 GRADLE_CMD./gradlew [ -f ../gradlew ] GRADLE_CMD../gradlew if [[ $BUILDTYPE debug ]]; then $GRADLE_CMD -p $PROJECT_ROOT assembleDebug cp $PROJECT_ROOT/build/outputs/apk/debug/server-debug.apk $OUTPUT else $GRADLE_CMD -p $PROJECT_ROOT assembleRelease cp $PROJECT_ROOT/build/outputs/apk/release/server-release-unsigned.apk $OUTPUT fi3. 实战禁用预编译的全流程3.1 修改install_release.sh原始脚本会下载预编译Server我们需要移除这部分逻辑#!/usr/bin/env bash set -e BUILDDIRbuild-auto - PREBUILT_SERVER_URLhttps://github.com/Genymobile/scrcpy/releases/download/v1.24/scrcpy-server-v1.24 - PREBUILT_SERVER_SHA256ae74a81ea79c0dc7250e586627c278c0a9a8c5de46c9fb5c38c167fb1a36f056 - echo [scrcpy] Downloading prebuilt server... - wget $PREBUILT_SERVER_URL -O scrcpy-server - echo [scrcpy] Verifying prebuilt server... - echo $PREBUILT_SERVER_SHA256 scrcpy-server | sha256sum --check echo [scrcpy] Building client... rm -rf $BUILDDIR meson $BUILDDIR --buildtyperelease --strip -Db_ltotrue \ - -Dprebuilt_serverscrcpy-server -Dprebuilt_server cd $BUILDDIR ninja echo [scrcpy] Installing (sudo)... sudo ninja install3.2 处理常见编译错误错误1NDK路径未找到FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring project :server. NDK not configured.解决方案# 在server/local.properties中添加 ndk.dir/path/to/ndk sdk.dir/path/to/sdk错误2Java版本不兼容Unsupported Java. Your build is currently configured to use Java 17...解决方法# 在server/gradle.properties中设置 android.jdkVersion11错误3Meson版本冲突Project specifies meson_version: 0.48 but found 0.47.升级Mesonpip install --upgrade meson4. 高级定制修改Server端功能4.1 修改视频编码参数在server/src/main/java/com/genymobile/scrcpy/ScreenEncoder.java中// 调整关键帧间隔 private static final int KEY_FRAME_RATE 5; // 原值10 // 修改码率控制 mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 8_000_000); // 原值4_000_0004.2 添加自定义控制协议在server/src/main/java/com/genymobile/scrcpy/ControlMessage.java中添加新消息类型public static final int TYPE_CUSTOM_COMMAND 0x20;在Client端同步修改对应枚举// app/src/control_msg.h enum control_msg_type { ... CONTROL_MSG_TYPE_CUSTOM_COMMAND 0x20, };4.3 构建产物验证编译完成后验证产物信息# 检查APK基本信息 aapt dump badging build/server/outputs/apk/release/server-release-unsigned.apk # 提取so文件验证 unzip -l build/server/outputs/apk/release/server-release-unsigned.apk | grep .so # 与预编译版本对比 diff (unzip -v1 prebuilt/scrcpy-server) (unzip -v1 build/server/outputs/apk/release/server-release-unsigned.apk)5. 持续集成方案5.1 GitHub Actions配置示例name: Android Server Build on: [push, pull_request] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Set up JDK 11 uses: actions/setup-javav3 with: java-version: 11 distribution: temurin - name: Install Android SDK uses: android-actions/setup-androidv2 - name: Install Build Tools run: | sdkmanager platforms;android-29 build-tools;30.0.3 sdkmanager ndk;21.4.7075529 - name: Build Server run: | cd server echo ndk.dir$ANDROID_HOME/ndk/21.4.7075529 local.properties ./gradlew assembleRelease - name: Archive Artifacts uses: actions/upload-artifactv3 with: name: scrcpy-server path: server/build/outputs/apk/release/server-release-unsigned.apk5.2 本地Docker构建环境FROM ubuntu:20.04 RUN apt-get update \ DEBIAN_FRONTENDnoninteractive apt-get install -y \ git wget unzip python3-pip ninja-build \ android-sdk android-ndk RUN pip3 install meson0.61.5 ENV ANDROID_HOME /usr/lib/android-sdk ENV NDK_HOME /usr/lib/android-ndk ENV PATH $ANDROID_HOME/cmdline-tools/latest/bin:$NDK_HOME:$PATH WORKDIR /scrcpy COPY . . CMD [bash, -c, meson build --buildtyperelease -Dprebuilt_server ninja -C build]构建命令docker build -t scrcpy-builder . docker run -v $(pwd)/output:/scrcpy/build scrcpy-builder6. 性能优化技巧6.1 加速增量编译在server/gradle.properties中添加org.gradle.paralleltrue org.gradle.cachingtrue org.gradle.daemontrue6.2 选择性依赖更新# 仅更新指定模块 ./gradlew :server:dependencies --update-dependency com.android.tools.build:gradle6.3 构建缓存配置# 设置Gradle缓存目录 export GRADLE_USER_HOME$HOME/.gradle-scrcpy # 清理缓存 ./gradlew cleanBuildCache7. 疑难问题解决方案7.1 符号表缺失问题当需要调试Native代码时需要保留调试符号# server/build.gradle android { buildTypes { release { - minifyEnabled true minifyEnabled false shrinkResources false ndk { debugSymbolLevel FULL } } } }7.2 多ABI支持处理默认Scrcpy只编译armeabi-v7a如需支持其他架构// server/build.gradle android { defaultConfig { ndk { abiFilters armeabi-v7a, arm64-v8a, x86, x86_64 } } }对应的Meson配置调整# 在交叉编译文件中指定ABI [properties] android_abi arm64-v8a7.3 版本号管理保持Client和Server版本同步# 根目录meson.build project(scrcpy, c, version: run_command( python3, -c, import re; print(re.search(rversionName\s\(.?)\, open(server/build.gradle).read()).group(1)), check: true ).stdout().strip(), ... )8. 安全加固建议8.1 签名配置创建签名密钥keytool -genkeypair -v \ -keystore scrcpy.jks \ -keyalg RSA -keysize 4096 \ -validity 10000 \ -alias scrcpy配置签名信息// server/build.gradle android { signingConfigs { release { storeFile file(../scrcpy.jks) storePassword System.getenv(STORE_PASSWORD) keyAlias scrcpy keyPassword System.getenv(KEY_PASSWORD) } } buildTypes { release { signingConfig signingConfigs.release } } }8.2 资源混淆// server/build.gradle buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile(proguard-android.txt), proguard-rules.pro } }在proguard-rules.pro中添加-keep class com.genymobile.scrcpy.** { *; }9. 扩展阅读9.1 关键源码文件文件路径核心功能server/src/main/scrcpy-server.cNative入口点server/src/main/java/.../Server.javaAndroid服务主逻辑app/src/video/decoder.c客户端视频解码实现app/src/control_msg.c控制协议序列化/反序列化9.2 调试技巧日志过滤adb logcat -s scrcpy性能分析# 采样CPU使用率 adb shell am profile start com.genymobile.scrcpy /sdcard/scrcpy.prof # 停止采样后拉取文件 adb pull /sdcard/scrcpy.prof内存分析adb shell dumpsys meminfo com.genymobile.scrcpy10. 结语构建系统的设计哲学Scrcpy的构建系统展现了现代跨平台项目的典型设计思路用Meson作为顶层构建协调器针对不同平台采用原生构建工具如Android的Gradle。这种架构既保持了跨平台的一致性又充分发挥了各平台工具链的优势。

相关文章:

告别预编译:手把手教你从源码编译Scrcpy的Android Server端(含Meson配置详解)

从零构建Scrcpy Android Server端:Meson与Gradle深度协作指南 在Android投屏工具Scrcpy的生态中,大多数用户都习惯于直接使用预编译的Server端APK。但当你需要修改投屏协议、优化视频编码参数或添加自定义功能时,从源码完整编译Server端就成为…...

FF14副本动画跳过插件终极指南:3分钟告别冗长等待

FF14副本动画跳过插件终极指南:3分钟告别冗长等待 【免费下载链接】FFXIV_ACT_CutsceneSkip 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_ACT_CutsceneSkip 你是否曾在《最终幻想14》国服副本中,看着那些无法跳过的动画感到无比焦虑&…...

FFmpeg Batch AV Converter 实战指南:告别命令行,拥抱高效视频批量处理

FFmpeg Batch AV Converter 实战指南:告别命令行,拥抱高效视频批量处理 【免费下载链接】ffmpeg_batch FFmpeg Batch AV Converter 项目地址: https://gitcode.com/gh_mirrors/ff/ffmpeg_batch FFmpeg Batch AV Converter是一款强大的图形界面视频…...

MaterialSkin架构解析:现代化WinForms界面重构的技术实现

MaterialSkin架构解析:现代化WinForms界面重构的技术实现 【免费下载链接】MaterialSkin Theming .NET WinForms, C# or VB.Net, to Googles Material Design Principles. 项目地址: https://gitcode.com/gh_mirrors/mat/MaterialSkin MaterialSkin是一个专为…...

深入Delphi二进制世界:用IDR揭开编译代码的神秘面纱

深入Delphi二进制世界:用IDR揭开编译代码的神秘面纱 【免费下载链接】IDR Interactive Delphi Reconstructor 项目地址: https://gitcode.com/gh_mirrors/id/IDR 你是否曾经面对一个Delphi编译的程序,却无法理解它的内部逻辑?或者需要…...

【紧急预警】Perplexity v3.2+图谱查询API行为突变:4类高危误用场景及24小时内修复方案

更多请点击: https://codechina.net 第一章:Perplexity知识图谱查询 Perplexity 是一款基于大语言模型的实时知识检索工具,其底层融合了多源结构化知识图谱与动态网页索引能力,支持对实体、关系及事件进行语义化查询。不同于传统…...

保姆级教程:用HACS给追觅扫地机装Home Assistant插件,实现iPhone家庭App远程分区清扫

零门槛实现追觅扫地机HomeKit分区控制:HACS插件全流程指南 在智能家居生态中,苹果HomeKit以其出色的隐私保护和流畅的跨设备联动体验,成为许多iPhone用户的首选。但对于使用追觅X10/X20等型号扫地机的用户来说,官方App并未提供与…...

RK3568平台OpenCV交叉编译实战:从源码到部署的完整指南

1. 项目概述:为什么要在RK3568上折腾OpenCV?最近在做一个基于瑞芯微RK3568芯片的边缘计算盒子项目,其中一个核心需求就是要在设备上跑实时的图像识别算法。算法框架选型时,我们团队内部有过一些讨论,最终还是决定用Ope…...

Scratch 画笔模块全解析:从零到一绘制动态轨迹

1. 初识Scratch画笔模块:数字画布的神奇魔法 第一次接触Scratch的画笔功能时,我仿佛回到了小时候拿着彩色粉笔在水泥地上涂鸦的快乐时光。这个看似简单的模块,实际上藏着让角色"留下痕迹"的魔法——就像蜗牛爬过会留下闪亮的黏液轨…...

避坑指南:OpenMV形状识别参数调不好?从霍夫圆检测到find_rects的实战经验分享

OpenMV形状识别实战:从参数调优到多场景适配的深度解析 当你在实验室里用OpenMV官方例程完美识别出圆形贴片时,是否曾信心满满地将设备搬到车间现场,却发现识别率断崖式下跌?这种"实验室王者,现场青铜"的困…...

离散数学自然推理系统通关秘籍:从零开始手把手教你搞定Educoder所有证明题

离散数学自然推理系统通关秘籍:从零到精通的实战指南 1. 自然推理系统入门基础 对于初次接触离散数学自然推理系统的学习者来说,那些复杂的符号和规则往往让人望而生畏。但请记住,每个专家都曾是初学者。自然推理系统本质上是一种形式化的逻…...

5分钟掌握Cherry MX键帽3D建模:打造你的专属机械键盘

5分钟掌握Cherry MX键帽3D建模:打造你的专属机械键盘 【免费下载链接】cherry-mx-keycaps 3D models of Chery MX keycaps 项目地址: https://gitcode.com/gh_mirrors/ch/cherry-mx-keycaps 你是否曾想过亲手设计一套完全属于自己的机械键盘键帽?…...

终极指南:SSDD数据集在SAR舰船检测中的完整应用方案

终极指南:SSDD数据集在SAR舰船检测中的完整应用方案 【免费下载链接】Official-SSDD SAR Ship Detection Dataset (SSDD): Official Release and Comprehensive Data Analysis 项目地址: https://gitcode.com/gh_mirrors/of/Official-SSDD SSDD(S…...

Folcolor:让你的Windows文件夹告别“黄脸婆“,用色彩提升3倍工作效率

Folcolor:让你的Windows文件夹告别"黄脸婆",用色彩提升3倍工作效率 【免费下载链接】Folcolor Windows explorer folder coloring utility 项目地址: https://gitcode.com/gh_mirrors/fo/Folcolor 想象一下这样的场景:你的电…...

IPXWrapper终极指南:让90年代经典游戏在现代Windows上重生联机对战

IPXWrapper终极指南:让90年代经典游戏在现代Windows上重生联机对战 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 对于许多怀旧游戏玩家来说,最大的遗憾莫过于那些经典的《星际争霸》、《帝国时代》、《…...

FutureTask.get()阻塞机制解析:基于AQS与状态机的线程协作

1. 项目概述:从异步编程的痛点说起在Java并发编程的日常开发中,我们经常遇到一个经典场景:主线程需要启动一个耗时的计算任务,但又不能干等着,希望在任务完成后能“拿到”那个结果。Thread类本身只负责执行&#xff0c…...

【实战指南】用DistroAV构建企业级网络视频协作系统:从零到专业部署

【实战指南】用DistroAV构建企业级网络视频协作系统:从零到专业部署 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi 你是否曾为传统视频制作中的复杂线缆连接…...

AutoMdxBuilder终极指南:3分钟零代码制作专业MDX词典的完整教程

AutoMdxBuilder终极指南:3分钟零代码制作专业MDX词典的完整教程 【免费下载链接】AutoMdxBuilder Automatically make mdx dictionaries 项目地址: https://gitcode.com/gh_mirrors/au/AutoMdxBuilder 还在为制作电子词典而烦恼吗?传统MDX词典制作…...

Flet按钮控件终极指南:从基础到高级的完整样式定制教程

Flet按钮控件终极指南:从基础到高级的完整样式定制教程 【免费下载链接】flet Build realtime web, mobile and desktop apps in Python only. No frontend experience required. 项目地址: https://gitcode.com/gh_mirrors/fl/flet Flet是一个革命性的Pytho…...

DB2数据字段拼接实战:从LISTAGG到XMLAGG的进阶应用与避坑指南

1. 从LISTAGG到XMLAGG:DB2字段拼接的进化之路 第一次在DB2里用LISTAGG函数时,那种丝滑的体验让我误以为找到了终极解决方案——直到某天凌晨三点,生产环境突然报警,日志里赫然写着"SQL0407N The result of a scalar fullsel…...

Windows风扇控制终极方案:从噪音困扰到静音高效的完整实战指南

Windows风扇控制终极方案:从噪音困扰到静音高效的完整实战指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tre…...

CD3E与CD3D靶点深度解析:分子机制、免疫缺陷病及TCE双抗的最新进展

关键词:CD3E、CD3D、T细胞衔接器、TCE双特异性抗体、TCR-CD3复合物、肿瘤免疫治疗、自身免疫疾病、严重联合免疫缺陷病引言CD3E和CD3D是T细胞受体相关CD3复合物的核心亚基,在T细胞发育、抗原识别和免疫激活中发挥着不可替代的作用。随着T细胞衔接器&…...

保姆级教程:从驱动安装到一键烧录,用JLink和JFlash给STM32烧程序(附常见连接失败解决方法)

从零玩转JLink与JFlash:STM32烧录全流程实战指南 第一次拿到JLink调试器时,我盯着那个黑色的小盒子看了足足五分钟——USB接口该插电脑哪一端?驱动安装失败怎么办?芯片型号选错会烧毁设备吗?作为过来人,我完…...

告别生产环境‘盲测’:手把手教你为uni-app应用打造一个本地日志收集与上传系统

告别生产环境‘盲测’:手把手教你为uni-app应用打造一个本地日志收集与上传系统 在移动应用开发中,最令人头疼的莫过于生产环境中那些"在我机器上好好的"的Bug。想象这样一个场景:你的uni-app应用在测试阶段表现完美,但…...

从协议到实战:深度剖析WiFi Deauth攻击的底层原理与Kali工具链应用

1. WiFi Deauth攻击的本质:从协议层理解管理帧 当你用手机连接咖啡厅的WiFi时,背后其实在进行一场精密的无线协议对话。802.11标准中定义了三种关键帧类型:数据帧负责传输网页内容,控制帧协调信道占用,而管理帧则是连…...

避开这些坑:Tessent Shell中MBIST流程的DRC检查与调试指南

避开这些坑:Tessent Shell中MBIST流程的DRC检查与调试指南 在芯片设计领域,可测试性设计(DFT)是确保产品质量的关键环节。而作为DFT的重要组成部分,存储器内建自测试(MBIST)的实现质量直接影响着…...

用Rsoft DiffractionMOD给光伏减反膜‘算个命’:手把手教你仿真矩形光栅的反射谱

用Rsoft DiffractionMOD给光伏减反膜‘算个命’:手把手教你仿真矩形光栅的反射谱 在光伏组件研发中,减反射膜的性能直接影响着光电转换效率。传统试错法需要反复镀膜测试,成本高周期长。本文将演示如何通过Rsoft DiffractionMOD模块&#xff…...

告别Python依赖!用SpringBoot+LangChain4j从零搭建企业级RAG知识库(附避坑指南)

告别Python依赖!用SpringBootLangChain4j从零搭建企业级RAG知识库(附避坑指南) 在AI技术快速落地的今天,检索增强生成(RAG)已成为企业知识管理的热门解决方案。然而,当大多数团队都在Python生态…...

量子变分算法优化:ADAPT-VQE与ASC协同技术解析

1. 量子变分算法优化背景与挑战 量子变分特征求解器(VQE)作为当前量子计算化学模拟的核心算法,其核心思想是通过参数化量子电路(PQC)制备试探波函数,并利用经典优化器调整参数以逼近目标哈密顿量的基态能量…...

不止于存储:用GD32F407的片内FLASH实现一个简易的“EEPROM”数据管理系统

超越传统存储:基于GD32F407片内FLASH的智能数据管理方案 在嵌入式系统开发中,非易失性数据存储一直是个既基础又关键的环节。传统方案往往直接外挂EEPROM芯片,但这种方式不仅增加硬件成本,还占用宝贵的IO资源。而GD32F407这类高性…...