国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【投屏】Scrcpy源碼分析一(編譯篇)

這篇具有很好參考價(jià)值的文章主要介紹了【投屏】Scrcpy源碼分析一(編譯篇)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Scrcpy源碼分析系列
【投屏】Scrcpy源碼分析一(編譯篇)
【投屏】Scrcpy源碼分析二(Client篇-連接階段)
【投屏】Scrcpy源碼分析三(Client篇-投屏階段)
【投屏】Scrcpy源碼分析四(最終章 - Server篇)

1. Scrcpy介紹

Scrcpy是一款小巧的Android設(shè)備投屏軟件??梢钥缙脚_(tái),在Windows、Linux、MacOS上對(duì)Android設(shè)備進(jìn)行投屏、反控、文件拖入上傳等功能,開源且免費(fèi)。Scrcpy這個(gè)名字的由來是C語言有個(gè)字符串拷貝的函數(shù)叫strcpy() ,投屏就是Screen的拷貝,所以叫Scrcpy。

Scrcpy目前有Genymobile公司進(jìn)行開發(fā)和維護(hù),就是那個(gè)開發(fā)了著名的開源模擬器Genymotion的公司。

項(xiàng)目地址是:https://github.com/Genymobile/scrcpy,可以自行下載源碼。

2. 工程目錄簡(jiǎn)介

2.1 根目錄

Scycpy的工程根目錄如下圖所示:
scrcpy 源碼分析,投屏,android,音視頻
乍看起來,像是Android工程,但又有點(diǎn)區(qū)別。其實(shí)Scrcpy工程是基于Meson編譯系統(tǒng)進(jìn)行構(gòu)建的。

對(duì)Meson不熟悉的小伙伴,可以看我的另一篇關(guān)于Meson簡(jiǎn)介的文章 -《Meson編譯系統(tǒng)》。如果時(shí)間緊張對(duì)Meson不想深入了解的小伙伴,這樣理解Meson就好:Meson就好比GCC,在配置文件中進(jìn)行一系列配置,比如依賴頭文件、庫等,編譯出一個(gè)可執(zhí)行文件。

Meson工程最重要的就是它的構(gòu)建描述文件,即meson.build,類似Gradle工程中的build.gradle。在工程根目錄和子模塊目錄下都有各自的meson.build文件。我們可以看到在工程中根目錄中有一個(gè)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'])

可以看到工程編譯兩個(gè)項(xiàng)目,app和server。既然Scrcpy是一個(gè)投屏軟件,那么可以理解是一個(gè)C/S軟件。Client端運(yùn)行在我們的電腦上,用于展示。Server端運(yùn)行在Android手機(jī),用于提供數(shù)據(jù)。

所以上面的工程目錄中,app目錄就是Client端,即電腦端的代碼。server目錄就是Server端,即手機(jī)上的代碼。

2.2 app目錄

scrcpy 源碼分析,投屏,android,音視頻
我們進(jìn)到app目錄,正如前面介紹,它也有一個(gè)meson.build文件,文件內(nèi)容較長(zhǎng),比較重要的部分是:

# 配置代碼集
src = [
    'src/main.c',
    'src/adb/adb.c',
    ...
]
...
# 設(shè)置編譯語言是C語言
cc = meson.get_compiler('c')
...
# 配置生成的目標(biāo)名稱
executable('scrcpy', src,
           dependencies: dependencies,
           include_directories: src_dir,
           install: true,
           c_args: [])
...

可以看到,client端就是編譯一系列的C代碼,生成名為scrcpy的可執(zhí)行文件。

2.3 server目錄

scrcpy 源碼分析,投屏,android,音視頻
我們進(jìn)到server目錄中,可以看到也有一個(gè)meson.build文件。同時(shí)我們可以發(fā)現(xiàn),其本質(zhì)也是一個(gè)Android工程,有build.gradle文件。

正如本節(jié)開頭提到的,我們發(fā)現(xiàn)工程的根目錄和Android工程有點(diǎn)像也就是這個(gè)原因。Scrcpy的工程其實(shí)也是一個(gè)Android的Gradle工程,server是其中一個(gè)module,其會(huì)編譯出一個(gè)apk,作為server端運(yùn)行在Android設(shè)備端。

那么讓我們來看一下是如何觸發(fā)編譯的,首先還是看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

省略無關(guān)細(xì)節(jié),直接看大的結(jié)構(gòu)。server目錄的meson.build只有一個(gè)大的判斷,根據(jù)屬性prebuilt_server是否為空來決定是執(zhí)行編譯 或者 直接使用預(yù)編譯文件。我們分開來看:

2.3.1 執(zhí)行編譯

如果執(zhí)行編譯的話,就執(zhí)行./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開發(fā)的小伙伴就很熟悉了,最終使用gradlew編譯server工程,生成.apk。然后將生成的apk文件拷貝成BUILDDIR/server/scrcpy-server,注意在此處apk后綴已經(jīng)沒有了,變成了scrcpy-server文件。然后在安裝時(shí),會(huì)被安裝至/usr/local/share/scrcpy/scrcpy-server。

2.3.2 使用預(yù)編譯文件

如果屬性prebuilt_server不為空,則使用預(yù)編譯的文件,不執(zhí)行編譯。源碼中也有提到,使用預(yù)編譯文件是為了方便沒有Android SDK環(huán)境的電腦。

那么這個(gè)屬性是在哪設(shè)置的呢?預(yù)編譯文件又是從哪來的呢?我們跳到根目錄的 install_release.sh文件,這也是后面我們執(zhí)行編譯的入口文件:

#!/usr/bin/env bash
set -e

# 設(shè)置meson編譯目錄
BUILDDIR=build-auto

# 下載server端的預(yù)編譯文件
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

# 進(jìn)行meson編譯,并設(shè)置prebuilt_server屬性
echo "[scrcpy] Building client..."
rm -rf "$BUILDDIR"
meson "$BUILDDIR" --buildtype=release --strip -Db_lto=true \
	# 看這里,設(shè)置了prebuilt_server屬性
    -Dprebuilt_server=scrcpy-server
cd "$BUILDDIR"
ninja

# 執(zhí)行安裝
echo "[scrcpy] Installing (sudo)..."
sudo ninja install

哦,原來預(yù)編譯的文件是從網(wǎng)上下的,同時(shí)在meson編譯時(shí)設(shè)置了prebuilt_server屬性。同樣,預(yù)編譯文件會(huì)被拷貝成BUILDDIR/server/scrcpy-server,然后在安裝時(shí),會(huì)被安裝至/usr/local/share/scrcpy/scrcpy-server。

現(xiàn)在我們知道了app和server目錄的meson.build文件在編譯時(shí)都做了什么。那么是如何觸發(fā)編譯的呢?

既然我們都已經(jīng)看到install_release.sh了,那么我們下面就分析這個(gè)文件吧。

2.4 install_release.sh文件

Meson編譯系統(tǒng)基于Python3實(shí)現(xiàn),并依賴Ninja。Meson和Ninja相互配合。Meson 負(fù)責(zé)構(gòu)建項(xiàng)目依賴關(guān)系,Ninja 進(jìn)行編譯。

通常Meson編譯的步驟比較固定:

  1. 執(zhí)行 meson BUILDDIR - 指定編譯目錄BUILDDIR,并進(jìn)行meson工程項(xiàng)目構(gòu)>建。也就是編譯期間所有的臨時(shí)文件和生成的目標(biāo)文件都會(huì)在BUILDDIR中;
  2. 進(jìn)入目錄BUILDDIR;
  3. 執(zhí)行ninja進(jìn)行編譯和安裝。

現(xiàn)在我們?cè)倩仡^看install_release.sh是不是結(jié)構(gòu)就比較清晰易懂了:

  1. 指定編譯目錄build-auto
  2. 從網(wǎng)上下載server的預(yù)編譯文件;
  3. 進(jìn)行meson工程配置,指定編譯目錄,設(shè)置prebuilt_server屬性;
  4. 進(jìn)入build-auto目錄,執(zhí)行ninja進(jìn)行編譯和安裝。

install_release.sh這個(gè)文件是整個(gè)編譯的入口文件,由它來發(fā)起整個(gè)工程的編譯和安裝。

3. 編譯&安裝&執(zhí)行

項(xiàng)目的編譯十分簡(jiǎn)單:

  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. 執(zhí)行根目錄的install_release.sh進(jìn)行編譯即可
    ./install_release.sh
    
  3. 卸載
    sudo ninja -Cbuild-auto uninstall
    

更詳細(xì)的信息和其他平臺(tái)(比如Win和MacOS)的編譯步驟,可以參考官方文檔:https://github.com/Genymobile/scrcpy/blob/master/BUILD.md

編譯腳本中會(huì)用ninja自動(dòng)安裝,執(zhí)行安裝成功后,把安卓設(shè)備插上電腦,執(zhí)行./scrcpy 就可以運(yùn)行了,成功的話投屏界面就出來啦。

3.1 不使用預(yù)編譯文件

工程編譯默認(rèn)是使用預(yù)編譯文件的,如果我們要自己編譯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 \
	# 設(shè)置prebuilt_server屬性也注釋掉
    # -Dprebuilt_server=scrcpy-server
cd "$BUILDDIR"
ninja

echo "[scrcpy] Installing (sudo)..."
sudo ninja install

再編譯一次,就會(huì)編譯我們的server工程了。

4. 小結(jié)

這一篇我們探究了Scrcpy項(xiàng)目的工程結(jié)構(gòu)和編譯系統(tǒng)。涉及的點(diǎn)有Scrcpy的工程目錄、Meson編譯系統(tǒng)、工程編譯方法和預(yù)編譯文件邏輯。下一篇開始我們會(huì)繼續(xù)探究Client端,也就是PC端的代碼邏輯了。文章來源地址http://www.zghlxwxcb.cn/news/detail-528374.html

到了這里,關(guān)于【投屏】Scrcpy源碼分析一(編譯篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【95 6K?】Scrcpy:一款免費(fèi)、強(qiáng)大且實(shí)用的Android鏡像投屏控制軟件

    【95 6K?】Scrcpy:一款免費(fèi)、強(qiáng)大且實(shí)用的Android鏡像投屏控制軟件

    隨著科技的不斷發(fā)展,我們的生活中出現(xiàn)了越來越多的智能設(shè)備。尤其是智能手機(jī),已經(jīng)成為了我們?nèi)粘I钪胁豢苫蛉钡囊徊糠?。然而,有時(shí)候我們需要在電腦上操作手機(jī),例如進(jìn)行應(yīng)用程序的調(diào)試、游戲掛機(jī)等。這時(shí),擁有一款功能強(qiáng)大且豐富的投屏軟件來滿足我們的眾

    2024年02月22日
    瀏覽(20)
  • Scrcpy手機(jī)投屏

    Scrcpy手機(jī)投屏

    Scrcpy投屏(電腦操作手機(jī))@TOC Android設(shè)備至少需要5.0以上版本(即API 21) 確保在電腦設(shè)備上啟動(dòng)了adb調(diào)試 在某些設(shè)備上,還需要啟動(dòng)其他選項(xiàng)以使用建買盤和鼠標(biāo)。鏈接: 其它選項(xiàng) adb調(diào)試的開啟一般是多次點(diǎn)擊手機(jī)系統(tǒng)的版本號(hào),比如vivoS15pro:設(shè)置-系統(tǒng)管理-關(guān)于手機(jī)-版本

    2024年02月09日
    瀏覽(34)
  • scrcpy 手機(jī)投屏與控制

    scrcpy 手機(jī)投屏與控制

    這是一款手機(jī)投屏到電腦的軟件, 但是是依靠命令使用的 ( github上的沒有UI屏幕控制 ) 下載連接: https://github.com/Genymobile/scrcpy?tab=readme-ov-file 已 windows 系統(tǒng)為例, 我下載的是 2.3.1 版本的, 選擇 zip 格式即可. 32/64位根據(jù)電腦情況選擇即可. 下載完成后, 自行解壓到自己想放的目錄下

    2024年04月16日
    瀏覽(20)
  • Scrcpy視頻同步源碼分析

    https://github.com/Genymobile/scrcpy ????????Scrcpy是genymobile開源的一款手機(jī)鏡像軟件,通過對(duì)手機(jī)音視頻的采集和同步,可以實(shí)現(xiàn)在PC平臺(tái)上控制手機(jī)的功能。 官方解釋:此應(yīng)用程序鏡像通過 USB 或 TCP/IP 連接的 Android 設(shè)備(視頻和音頻),并允許使用計(jì)算機(jī)的鍵盤和鼠標(biāo)控制設(shè)備

    2024年02月12日
    瀏覽(20)
  • ADB 連接后,使用scrcpy投屏電腦

    ADB 連接后,使用scrcpy投屏電腦

    將三個(gè)ADB文件復(fù)制后,放到C:WindowsSystem32下,同時(shí)也復(fù)制一份放到C:WindowsSysWOW64下 ADB文件: 他這里有提供百度網(wǎng)盤連接下載這幾個(gè)文件 【adb安裝】簡(jiǎn)單的一批的adb安裝,少走彎路_嗶哩嗶哩_bilibili 然后,cmd命令,?輸入adb,出現(xiàn)版本號(hào),出現(xiàn)一大堆的代碼說明,說明安裝成功

    2024年02月09日
    瀏覽(18)
  • scrcpy 投屏電腦能正常顯示,但是沒法用鼠標(biāo)操作

    scrcpy 投屏電腦能正常顯示,但是沒法用鼠標(biāo)操作

    使用介紹: scrcpy投屏教程、scrcpy無線投屏、scrcpy命令大全

    2024年02月12日
    瀏覽(28)
  • 分享一個(gè)開源的windows安卓投屏工具,scrcpy

    分享一個(gè)開源的windows安卓投屏工具,scrcpy

    安裝adb - ADB是一個(gè)Android Debug Bridge,用于與Android設(shè)備進(jìn)行通信。如果您已經(jīng)安裝了Android Studio,則可以從其中運(yùn)行adb。否則,您可以從ADB官方網(wǎng)站下載并手動(dòng)安裝。 安裝SDL庫 - Scrcpy使用SDL庫來呈現(xiàn)Android設(shè)備的屏幕。您可以使用系統(tǒng)包管理器來安裝SDL庫,例如,在Ubuntu上,您可

    2023年04月18日
    瀏覽(54)
  • 三秒教會(huì)你如何使用scrcpy手機(jī)無線投屏到電腦

    scrcpy 是一款免費(fèi)開源的投屏軟件,可以將安卓手機(jī)屏幕投放在 Windows、macOS、GNU/Linux 上,并可以直接使用鼠標(biāo)在投屏窗口中進(jìn)行交互和錄制。此應(yīng)用程序鏡像通過 USB 或TCP/IP連接的 Android 設(shè)備(視頻和音頻),并允許使用計(jì)算機(jī)的鍵盤和鼠標(biāo)控制設(shè)備。它不需要任何 根訪問權(quán)

    2024年02月07日
    瀏覽(28)
  • 開源、跨平臺(tái)安卓摸魚(投屏)軟件 Scrcpy 中文使用指南

    開源、跨平臺(tái)安卓摸魚(投屏)軟件 Scrcpy 中文使用指南

    廢話不說,先上鏈接:GitHub上的Scrcpy Scrcpy 可以將手機(jī)畫面投射到電腦上,讓你可以在電腦上對(duì)手機(jī)進(jìn)行操控。Scrcpy 通過 USB 或 Wi-Fi 與安卓手機(jī)相連,不需要在手機(jī)上安裝任何 app,也不需要取得 ROOT 權(quán)限。 簡(jiǎn)單地說,就是可以讓你在電腦上控制手機(jī)!它支持鼠標(biāo)控制、鍵盤

    2024年02月12日
    瀏覽(39)
  • aardio嵌入外部窗口(以scrcpy手機(jī)投屏窗口為例)

    aardio嵌入外部窗口(以scrcpy手機(jī)投屏窗口為例)

    scrcpy是一個(gè)安卓手機(jī)投屏到電腦的開源組件。手機(jī)在開發(fā)者選項(xiàng)中打開USB調(diào)試開關(guān),使用數(shù)據(jù)線連接到電腦,運(yùn)行scrcpy.exe,就可以在電腦上查看手機(jī)屏幕,可以使用鼠標(biāo)、鍵盤進(jìn)行操作,并且提供了一系列命令行和快捷鍵,方便二次開發(fā)。我下載的是scrcpy-win32-v1.25,你也可以

    2024年02月12日
    瀏覽(50)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包