【投屏】Scrcpy源码分析一(编译篇)

这篇具有很好参考价值的文章主要介绍了【投屏】Scrcpy源码分析一(编译篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Scrcpy源码分析系列
【投屏】Scrcpy源码分析一(编译篇)
【投屏】Scrcpy源码分析二(Client篇-连接阶段)
【投屏】Scrcpy源码分析三(Client篇-投屏阶段)
【投屏】Scrcpy源码分析四(最终章 - Server篇)

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的工程根目录如下图所示:
scrcpy 源码分析,投屏,android,音视频
乍看起来,像是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')
endif

run_target('run', command: ['scripts/run-scrcpy.sh'])

可以看到工程编译两个项目,app和server。既然Scrcpy是一个投屏软件,那么可以理解是一个C/S软件。Client端运行在我们的电脑上,用于展示。Server端运行在Android手机,用于提供数据。

所以上面的工程目录中,app目录就是Client端,即电脑端的代码。server目录就是Server端,即手机上的代码。

2.2 app目录

scrcpy 源码分析,投屏,android,音视频
我们进到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目录

scrcpy 源码分析,投屏,android,音视频
我们进到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" assembleDebug
    cp "$PROJECT_ROOT/build/outputs/apk/debug/server-debug.apk" "$OUTPUT"
else
    "$GRADLE" -p "$PROJECT_ROOT" assembleRelease
    cp "$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=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 --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编译的步骤比较固定:

  1. 执行 meson BUILDDIR - 指定编译目录BUILDDIR,并进行meson工程项目构>建。也就是编译期间所有的临时文件和生成的目标文件都会在BUILDDIR中;
  2. 进入目录BUILDDIR;
  3. 执行ninja进行编译和安装。

现在我们再回头看install_release.sh是不是结构就比较清晰易懂了:

  1. 指定编译目录build-auto
  2. 从网上下载server的预编译文件;
  3. 进行meson工程配置,指定编译目录,设置prebuilt_server属性;
  4. 进入build-auto目录,执行ninja进行编译和安装。

install_release.sh这个文件是整个编译的入口文件,由它来发起整个工程的编译和安装。

3. 编译&安装&执行

项目的编译十分简单:

  1. 下载依赖库
    # 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
    
  2. 执行根目录的install_release.sh进行编译即可
    ./install_release.sh
    
  3. 卸载
    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 -e

BUILDDIR=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 --check

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

再编译一次,就会编译我们的server工程了。

4. 小结

这一篇我们探究了Scrcpy项目的工程结构和编译系统。涉及的点有Scrcpy的工程目录、Meson编译系统、工程编译方法和预编译文件逻辑。下一篇开始我们会继续探究Client端,也就是PC端的代码逻辑了。文章来源地址https://www.toymoban.com/news/detail-528374.html

到了这里,关于【投屏】Scrcpy源码分析一(编译篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【95 6K⭐】Scrcpy:一款免费、强大且实用的Android镜像投屏控制软件

    随着科技的不断发展,我们的生活中出现了越来越多的智能设备。尤其是智能手机,已经成为了我们日常生活中不可或缺的一部分。然而,有时候我们需要在电脑上操作手机,例如进行应用程序的调试、游戏挂机等。这时,拥有一款功能强大且丰富的投屏软件来满足我们的众

    2024年02月22日
    浏览(37)
  • Scrcpy手机投屏

    Scrcpy投屏(电脑操作手机)@TOC Android设备至少需要5.0以上版本(即API 21) 确保在电脑设备上启动了adb调试 在某些设备上,还需要启动其他选项以使用建买盘和鼠标。链接: 其它选项 adb调试的开启一般是多次点击手机系统的版本号,比如vivoS15pro:设置-系统管理-关于手机-版本

    2024年02月09日
    浏览(56)
  • scrcpy 手机投屏与控制

    这是一款手机投屏到电脑的软件, 但是是依靠命令使用的 ( github上的没有UI屏幕控制 ) 下载连接: https://github.com/Genymobile/scrcpy?tab=readme-ov-file 已 windows 系统为例, 我下载的是 2.3.1 版本的, 选择 zip 格式即可. 32/64位根据电脑情况选择即可. 下载完成后, 自行解压到自己想放的目录下

    2024年04月16日
    浏览(31)
  • Scrcpy视频同步源码分析

    https://github.com/Genymobile/scrcpy         Scrcpy是genymobile开源的一款手机镜像软件,通过对手机音视频的采集和同步,可以实现在PC平台上控制手机的功能。 官方解释:此应用程序镜像通过 USB 或 TCP/IP 连接的 Android 设备(视频和音频),并允许使用计算机的键盘和鼠标控制设备

    2024年02月12日
    浏览(50)
  • ADB 连接后,使用scrcpy投屏电脑

    将三个ADB文件复制后,放到C:WindowsSystem32下,同时也复制一份放到C:WindowsSysWOW64下 ADB文件: 他这里有提供百度网盘连接下载这几个文件 【adb安装】简单的一批的adb安装,少走弯路_哔哩哔哩_bilibili 然后,cmd命令, 输入adb,出现版本号,出现一大堆的代码说明,说明安装成功

    2024年02月09日
    浏览(36)
  • scrcpy 投屏电脑能正常显示,但是没法用鼠标操作

    使用介绍: scrcpy投屏教程、scrcpy无线投屏、scrcpy命令大全

    2024年02月12日
    浏览(39)
  • 分享一个开源的windows安卓投屏工具,scrcpy

    安装adb - ADB是一个Android Debug Bridge,用于与Android设备进行通信。如果您已经安装了Android Studio,则可以从其中运行adb。否则,您可以从ADB官方网站下载并手动安装。 安装SDL库 - Scrcpy使用SDL库来呈现Android设备的屏幕。您可以使用系统包管理器来安装SDL库,例如,在Ubuntu上,您可

    2023年04月18日
    浏览(41)
  • 开源、跨平台安卓摸鱼(投屏)软件 Scrcpy 中文使用指南

    废话不说,先上链接:GitHub上的Scrcpy Scrcpy 可以将手机画面投射到电脑上,让你可以在电脑上对手机进行操控。Scrcpy 通过 USB 或 Wi-Fi 与安卓手机相连,不需要在手机上安装任何 app,也不需要取得 ROOT 权限。 简单地说,就是可以让你在电脑上控制手机!它支持鼠标控制、键盘

    2024年02月12日
    浏览(61)
  • aardio嵌入外部窗口(以scrcpy手机投屏窗口为例)

    scrcpy是一个安卓手机投屏到电脑的开源组件。手机在开发者选项中打开USB调试开关,使用数据线连接到电脑,运行scrcpy.exe,就可以在电脑上查看手机屏幕,可以使用鼠标、键盘进行操作,并且提供了一系列命令行和快捷键,方便二次开发。我下载的是scrcpy-win32-v1.25,你也可以

    2024年02月12日
    浏览(73)
  • 三秒教会你如何使用scrcpy手机无线投屏到电脑

    scrcpy 是一款免费开源的投屏软件,可以将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠标在投屏窗口中进行交互和录制。此应用程序镜像通过 USB 或TCP/IP连接的 Android 设备(视频和音频),并允许使用计算机的键盘和鼠标控制设备。它不需要任何 根访问权

    2024年02月07日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包