【投屏】Scrcpy源码分析一(编译篇)
Scrcpy源码分析系列
【投屏】Scrcpy源码分析一(编译篇)
【投屏】Scrcpy源码分析二(Client篇-连接阶段)
【投屏】Scrcpy源码分析三(Client篇-投屏阶段)
【投屏】Scrcpy源码分析四(最终章 - Server篇)
Scrcpy-编译篇
- 1. Scrcpy介绍
- 2. 工程目录简介
- 2.1 根目录
- 2.2 app目录
- 2.3 server目录
- 2.3.1 执行编译
- 2.3.2 使用预编译文件
- 2.4 install_release.sh文件
- 3. 编译&安装&执行
- 3.1 不使用预编译文件
- 4. 小结
1. Scrcpy介绍
Scrcpy是一款小巧的Android设备投屏软件。可以跨平台,在Windows、Linux、MacOS上对Android设备进行投屏、反控、文件拖入上传等功能,开源且免费。Scrcpy这个名字的由来是C语言有个字符串拷贝的函数叫strcpy()
,投屏就是Screen的拷贝,所以叫Scrcpy。
Scrcpy目前有Genymobile公司进行开发和维护,就是那个开发了著名的开源模拟器Genymotion的公司。
项目地址是:https://github.com/Genymobile/scrcpy,可以自行下载源码。
2. 工程目录简介
2.1 根目录
Scycpy的工程根目录如下图所示:
乍看起来,像是Android工程,但又有点区别。其实Scrcpy工程是基于Meson编译系统进行构建的。
对Meson不熟悉的小伙伴,可以看我的另一篇关于Meson简介的文章 -《Meson编译系统》。如果时间紧张对Meson不想深入了解的小伙伴,这样理解Meson就好:Meson就好比GCC,在配置文件中进行一系列配置,比如依赖头文件、库等,编译出一个可执行文件。
Meson工程最重要的就是它的构建描述文件,即meson.build
,类似Gradle工程中的build.gradle
。在工程根目录和子模块目录下都有各自的meson.build
文件。我们可以看到在工程中根目录中有一个meson.build
文件:
# 工程基本配置
project('scrcpy', 'c',version: '1.25',meson_version: '>= 0.48',default_options: ['c_std=c11','warning_level=2','b_ndebug=if-release',])# 添加编译子目录app
if get_option('compile_app')subdir('app')
endif# 添加编译子目录server
if get_option('compile_server')subdir('server')
endifrun_target('run', command: ['scripts/run-scrcpy.sh'])
可以看到工程编译两个项目,app和server。既然Scrcpy是一个投屏软件,那么可以理解是一个C/S软件。Client端运行在我们的电脑上,用于展示。Server端运行在Android手机,用于提供数据。
所以上面的工程目录中,app目录就是Client端,即电脑端的代码。server目录就是Server端,即手机上的代码。
2.2 app目录
我们进到app目录,正如前面介绍,它也有一个meson.build
文件,文件内容较长,比较重要的部分是:
# 配置代码集
src = ['src/main.c','src/adb/adb.c',...
]
...
# 设置编译语言是C语言
cc = meson.get_compiler('c')
...
# 配置生成的目标名称
executable('scrcpy', src,dependencies: dependencies,include_directories: src_dir,install: true,c_args: [])
...
可以看到,client端就是编译一系列的C代码,生成名为scrcpy的可执行文件。
2.3 server目录
我们进到server目录中,可以看到也有一个meson.build
文件。同时我们可以发现,其本质也是一个Android工程,有build.gradle
文件。
正如本节开头提到的,我们发现工程的根目录和Android工程有点像也就是这个原因。Scrcpy的工程其实也是一个Android的Gradle工程,server是其中一个module,其会编译出一个apk,作为server端运行在Android设备端。
那么让我们来看一下是如何触发编译的,首先还是看meson.build
文件:
prebuilt_server = get_option('prebuilt_server')
if prebuilt_server == ''custom_target('scrcpy-server',output: 'scrcpy-server',command: [find_program('./scripts/build-wrapper.sh'), meson.current_source_dir(), '@OUTPUT@', get_option('buildtype')],install_dir: 'share/scrcpy')
else...custom_target('scrcpy-server-prebuilt',input: prebuilt_server,output: 'scrcpy-server',command: ['cp', '@INPUT@', '@OUTPUT@'],install_dir: 'share/scrcpy')
endif
省略无关细节,直接看大的结构。server目录的meson.build
只有一个大的判断,根据属性prebuilt_server
是否为空来决定是执行编译 或者 直接使用预编译文件。我们分开来看:
2.3.1 执行编译
如果执行编译的话,就执行./scrcpys/build-wrapper.sh
文件:
...
GRADLE=${GRADLE:-$PROJECT_ROOT/../gradlew}if [[ "$BUILDTYPE" == debug ]]
then"$GRADLE" -p "$PROJECT_ROOT" assembleDebugcp "$PROJECT_ROOT/build/outputs/apk/debug/server-debug.apk" "$OUTPUT"
else"$GRADLE" -p "$PROJECT_ROOT" assembleReleasecp "$PROJECT_ROOT/build/outputs/apk/release/server-release-unsigned.apk" "$OUTPUT"
fi
看到这,熟悉Android开发的小伙伴就很熟悉了,最终使用gradlew
编译server工程,生成.apk
。然后将生成的apk文件拷贝成BUILDDIR/server/scrcpy-server
,注意在此处apk后缀已经没有了,变成了scrcpy-server
文件。然后在安装时,会被安装至/usr/local/share/scrcpy/scrcpy-server
。
2.3.2 使用预编译文件
如果属性prebuilt_server
不为空,则使用预编译的文件,不执行编译。源码中也有提到,使用预编译文件是为了方便没有Android SDK环境的电脑。
那么这个属性是在哪设置的呢?预编译文件又是从哪来的呢?我们跳到根目录的 install_release.sh
文件,这也是后面我们执行编译的入口文件:
#!/usr/bin/env bash
set -e# 设置meson编译目录
BUILDDIR=build-auto# 下载server端的预编译文件
PREBUILT_SERVER_URL=https://github.com/Genymobile/scrcpy/releases/download/v1.24/scrcpy-server-v1.24
PREBUILT_SERVER_SHA256=ae74a81ea79c0dc7250e586627c278c0a9a8c5de46c9fb5c38c167fb1a36f056echo "[scrcpy] Downloading prebuilt server..."
wget "$PREBUILT_SERVER_URL" -O scrcpy-server
echo "[scrcpy] Verifying prebuilt server..."
echo "$PREBUILT_SERVER_SHA256 scrcpy-server" | sha256sum --check# 进行meson编译,并设置prebuilt_server属性
echo "[scrcpy] Building client..."
rm -rf "$BUILDDIR"
meson "$BUILDDIR" --buildtype=release --strip -Db_lto=true \# 看这里,设置了prebuilt_server属性-Dprebuilt_server=scrcpy-server
cd "$BUILDDIR"
ninja# 执行安装
echo "[scrcpy] Installing (sudo)..."
sudo ninja install
哦,原来预编译的文件是从网上下的,同时在meson编译时设置了prebuilt_server
属性。同样,预编译文件会被拷贝成BUILDDIR/server/scrcpy-server
,然后在安装时,会被安装至/usr/local/share/scrcpy/scrcpy-server
。
现在我们知道了app和server目录的meson.build
文件在编译时都做了什么。那么是如何触发编译的呢?
既然我们都已经看到install_release.sh
了,那么我们下面就分析这个文件吧。
2.4 install_release.sh文件
Meson编译系统基于Python3实现,并依赖Ninja。Meson和Ninja相互配合。Meson 负责构建项目依赖关系,Ninja 进行编译。
通常Meson编译的步骤比较固定:
- 执行 meson BUILDDIR - 指定编译目录BUILDDIR,并进行meson工程项目构>建。也就是编译期间所有的临时文件和生成的目标文件都会在BUILDDIR中;
- 进入目录BUILDDIR;
- 执行ninja进行编译和安装。
现在我们再回头看install_release.sh
是不是结构就比较清晰易懂了:
- 指定编译目录
build-auto
; - 从网上下载server的预编译文件;
- 进行meson工程配置,指定编译目录,设置
prebuilt_server
属性; - 进入
build-auto
目录,执行ninja进行编译和安装。
install_release.sh
这个文件是整个编译的入口文件,由它来发起整个工程的编译和安装。
3. 编译&安装&执行
项目的编译十分简单:
- 下载依赖库
# for Debian/Ubuntu sudo apt install ffmpeg libsdl2-2.0-0 adb wget \gcc git pkg-config meson ninja-build libsdl2-dev \libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev \libusb-1.0-0 libusb-1.0-0-dev
- 执行根目录的
install_release.sh
进行编译即可./install_release.sh
- 卸载
sudo ninja -Cbuild-auto uninstall
更详细的信息和其他平台(比如Win和MacOS)的编译步骤,可以参考官方文档:https://github.com/Genymobile/scrcpy/blob/master/BUILD.md
编译脚本中会用ninja自动安装,执行安装成功后,把安卓设备插上电脑,执行./scrcpy
就可以运行了,成功的话投屏界面就出来啦。
3.1 不使用预编译文件
工程编译默认是使用预编译文件的,如果我们要自己编译server工程,只需要把下面两处注释掉即可:
#!/usr/bin/env bash
set -eBUILDDIR=build-auto# 下载逻辑全部注释掉
#PREBUILT_SERVER_URL=https://github.com/Genymobile/scrcpy/releases/download/v1.24/scrcpy-server-v1.24
#PREBUILT_SERVER_SHA256=ae74a81ea79c0dc7250e586627c278c0a9a8c5de46c9fb5c38c167fb1a36f056
# echo "[scrcpy] Downloading prebuilt server..."
# wget "$PREBUILT_SERVER_URL" -O scrcpy-server
# echo "[scrcpy] Verifying prebuilt server..."
# echo "$PREBUILT_SERVER_SHA256 scrcpy-server" | sha256sum --checkecho "[scrcpy] Building client..."
rm -rf "$BUILDDIR"
meson "$BUILDDIR" --buildtype=release --strip -Db_lto=true \# 设置prebuilt_server属性也注释掉# -Dprebuilt_server=scrcpy-server
cd "$BUILDDIR"
ninjaecho "[scrcpy] Installing (sudo)..."
sudo ninja install
再编译一次,就会编译我们的server工程了。
4. 小结
这一篇我们探究了Scrcpy项目的工程结构和编译系统。涉及的点有Scrcpy的工程目录、Meson编译系统、工程编译方法和预编译文件逻辑。下一篇开始我们会继续探究Client端,也就是PC端的代码逻辑了。
【投屏】Scrcpy源码分析一(编译篇)相关推荐
- 【投屏】Scrcpy源码分析三(Client篇-投屏阶段)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- 【投屏】Scrcpy源码分析四(最终章 - Server篇)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- 【投屏】Scrcpy源码分析二(Client篇-连接阶段)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- C++版Android实时投屏软件系统源码,安卓手机投屏软件源码,无需root权限
QtScrcpy QtScrcpy 可以通过 USB / 网络连接Android设备,并进行显示和控制.无需root权限. 同时支持 GNU/Linux ,Windows 和 MacOS 三大主流桌面 ...
- hadoop作业初始化过程详解(源码分析第三篇)
(一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...
- Kubernetes Node Controller源码分析之配置篇
2019独角兽企业重金招聘Python工程师标准>>> Author: xidianwangtao@gmail.com Kubernetes Node Controller源码分析之 ...
- JUC源码分析-线程池篇(五):ForkJoinPool - 2
通过上一篇(JUC源码分析-线程池篇(四):ForkJoinPool - 1)的讲解,相信同学们对 ForkJoinPool 已经有了一个大概的认识,本篇我们将通过分析源码的方式来深入了解 ForkJ ...
- photoshop-v.1.0.1源码分析第三篇–FilterInterface.p
photoshop-v.1.0.1源码分析第三篇–FilterInterface.p 总体预览 一.源码预览 二.语法解释 三.结构预览 四:语句分析 五:思维导图 六:疑留问题 一.源码预览 {Ph ...
- hadoop之MapReduce框架TaskTracker端心跳机制分析(源码分析第六篇)
1.概述 MapReduce框架中的master/slave心跳机制是整个集群运作的基础,是沟通TaskTracker和JobTracker的桥梁.TaskTracker周期性地调用心跳RPC函数,汇 ...
最新文章
- linux并发控制之自旋锁
- Mockito cannot mock/spy because : - final class 问题
- 大数据架构如何挑选机器.
- 2016年第12本:成功就靠专注一件事
- 【词云】wordcloud安装与使用
- java系列8:一个标准的类
- LD-sketch源码阅读
- SQL Server 数据库身份认证以及包含数据库
- 反射获取Class对象的三种方式
- SpringBoot-DDD领域驱动设计的概念
- C语言_99 乘法表
- 不平衡电网电压下虚拟同步发电机VSG控制策略-实现不平衡电压下控制三相电流平衡
- IT路要如何走?——老程序员的10个忠告 .
- 信用社计算机考试真题,农村信用社计算机考试试题.doc
- 二值化最佳阈值选取方法以及matlab实现
- 单商户商城系统功能拆解39—分销应用—分销等级
- 计算机网络-HTTP协议
- 自己的博客——liming blog 黎明的CSDN博客
- 【理解】经典角点检测算法--Harris角点
- 在Proteus 中51单片机常用器件名称和图片
热门文章
- 信息学奥赛一本通:1199:全排列
- asp.net oracle 问号,asp.net 中文部分显示问号
- 拓嘉辰丰电商:拼多多“快团团”买赠常见玩法
- 勒索变种有不变的特征吗?有相应的防护手段吗?
- 代码随想录训练营day30
- 有什么方法可以将音乐格式转为mp3?借助这几款软件轻松实现
- 解决error:java:不支持发行版本
- android腾讯云im刷新会话列表,融云 IM SDK 集成 --- 刷新会话界面和会话列表界面...
- 2022年湖北省高新技术企业申报材料以及认定条件汇总!
- 面试汇总-Spring-IOC和AOP