[Bildschirmprojektion] Scrcpy-Quellcode-Analyse 1 (Kompilierung)

Scrcpy-Quellcode-Analysereihe
[Screencasting] Scrcpy-Quellcode-Analyse 1 (Zusammenstellung)
[Screencasting] Scrcpy-Quellcode-Analyse 2 (Client – ​​Verbindungsphase)
[Screencasting] Scrcpy-Quellcode-Analyse 3 (Client – ​​Screencasting-Phase)
[Screencasting] 】Srcpy-Quelle Code-Analyse vier (letztes Kapitel – Server-Kapitel)

1. Einführung in Scrcpy

Scrcpy ist eine kompakte Bildschirmspiegelungssoftware für Android-Geräte. Es kann plattformübergreifend funktionieren und Funktionen wie Bildschirmprojektion, Anti-Kontrolle, Ziehen und Hochladen von Dateien auf Windows-, Linux- und MacOS-Geräten für Android-Geräte ausführen. Es ist Open Source und kostenlos. Der Name Scrcpy hat seinen Ursprung darin, dass es in der C-Sprache eine Funktion zum Kopieren von Zeichenfolgen gibt strcpy()und der Projektionsbildschirm eine Kopie von Screen ist, weshalb er Scrcpy heißt.

Scrcpy wird derzeit von Genymobile entwickelt und gewartet, dem gleichen Unternehmen, das den berühmten Open-Source-Simulator Genymotion entwickelt hat.

Die Projektadresse lautet: https://github.com/Genymobile/scrcpy . Sie können den Quellcode selbst herunterladen.

2. Einführung in den Projektkatalog

2.1 Stammverzeichnis

Das Projektstammverzeichnis von Scycpy ist in der folgenden Abbildung dargestellt:
Fügen Sie hier eine Bildbeschreibung ein
Auf den ersten Blick sieht es aus wie ein Android-Projekt, es gibt jedoch einige Unterschiede. Tatsächlich basiert das Scrcpy-Projekt auf dem Meson-Kompilierungssystem.

Freunde, die mit Meson nicht vertraut sind, können meinen anderen Artikel über die Einführung von Meson lesen – „Meson Compilation System“ . Wenn die Zeit knapp ist und Sie nicht mehr über Meson wissen möchten, können Sie Meson wie folgt verstehen: Meson ist wie GCC, das eine Reihe von Konfigurationen in der Konfigurationsdatei durchführt, z. B. auf Header-Dateien, Bibliotheken usw. angewiesen ist. , um eine ausführbare Datei zu kompilieren.

Das Wichtigste an einem Meson-Projekt ist seine Build-Beschreibungsdatei, die meson.buildder in einem Gradle-Projekt ähnelt build.gradle. Es gibt entsprechende meson.buildDateien im Projektstammverzeichnis und im Untermodulverzeichnis. Wir können sehen, dass sich im Stammverzeichnis des Projekts eine Datei befindet 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'])

Sie können sehen, dass das Projekt zwei Projekte kompiliert: App und Server. Da Scrcpy eine Bildschirmprojektionssoftware ist, kann es als C/S-Software verstanden werden. Die Clientseite läuft zur Anzeige auf unserem Computer. Der Server läuft auf einem Android-Telefon und dient der Bereitstellung von Daten.

Im obigen Projektverzeichnis ist das App-Verzeichnis also die Clientseite, also der Code auf der Computerseite. Das Serververzeichnis ist die Serverseite, also der Code auf dem Mobiltelefon.

2.2 App-Verzeichnis

Fügen Sie hier eine Bildbeschreibung ein
Wir geben das App-Verzeichnis ein, wie zuvor eingeführt, es enthält auch eine meson.buildDatei, der Inhalt der Datei ist lang, der wichtigere Teil ist:

# 配置代码集
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: [])
...

Es ist ersichtlich, dass der Client eine Reihe von C-Codes kompiliert, um eine ausführbare Datei mit dem Namen scrcpy zu generieren.

2.3 Serververzeichnis

Fügen Sie hier eine Bildbeschreibung ein
Wenn wir in das Serververzeichnis gehen, können wir sehen, dass dort auch eine meson.buildDatei vorhanden ist. Gleichzeitig können wir feststellen, dass es sich im Wesentlichen auch um ein Android-Projekt mit build.gradleDateien handelt.

Wie am Anfang dieses Abschnitts erwähnt, haben wir festgestellt, dass das Stammverzeichnis des Projekts dem Android-Projekt etwas ähnelt, weshalb. Das Scrcpy-Projekt ist eigentlich ein Android-Gradle-Projekt. Der Server ist eines der Module, das eine APK kompiliert und auf dem Android-Gerät als Server läuft.

Schauen wir uns also an, wie die Kompilierung ausgelöst wird. Schauen wir uns zunächst meson.builddie Datei an:

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

Ignorieren Sie irrelevante Details und schauen Sie direkt auf die große Struktur. meson.buildEs gibt nur eine große Entscheidung im Serververzeichnis , prebuilt_serverob die Kompilierung ausgeführt oder die vorkompilierte Datei direkt verwendet werden soll, je nachdem, ob das Attribut leer ist. Schauen wir es uns separat an:

2.3.1 Kompilierung ausführen

Führen Sie beim Kompilieren ./scrcpys/build-wrapper.shdie Datei aus:

...
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

Als Freunde, die mit der Android-Entwicklung vertraut sind, sind sie damit sehr vertraut und verwenden schließlich gradlewdas kompilierte Serverprojekt, um es zu generieren .apk. Kopieren Sie dann die generierte APK-Datei BUILDDIR/server/scrcpy-server. Beachten Sie, dass das APK-Suffix hier weg ist und es zu scrcpy-servereiner Datei wird. Bei der Installation wird es dann installiert /usr/local/share/scrcpy/scrcpy-server.

2.3.2 Verwendung vorkompilierter Dateien

Wenn das Attribut prebuilt_servernicht leer ist, wird die vorkompilierte Datei verwendet und keine Kompilierung durchgeführt. Im Quellcode wird auch erwähnt, dass die Verwendung vorkompilierter Dateien der Bequemlichkeit von Computern ohne Android SDK-Umgebung dient.

Wo ist diese Eigenschaft festgelegt? Woher stammen die vorkompilierten Dateien? Wir springen zu install_release.shder Datei , die später auch die Eingangsdatei für unsere Kompilierung ist:

#!/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

Oh, es stellt sich heraus, dass die vorkompilierten Dateien aus dem Internet heruntergeladen wurden und die Eigenschaften beim Kompilieren von meson festgelegt wurden prebuilt_server. Ebenso werden vorkompilierte Dateien nach kopiert BUILDDIR/server/scrcpy-serverund dann bei der Installation installiert /usr/local/share/scrcpy/scrcpy-server.

Jetzt wissen wir meson.build, was die Dateien in den App- und Serververzeichnissen zur Kompilierungszeit tun. Wie wird die Kompilierung ausgelöst?

Nachdem wir nun install_release.shalles gesehen haben, analysieren wir diese Datei unten.

2.4 install_release.sh-Datei

Das Meson-Kompilierungssystem basiert auf Python3 und hängt von Ninja ab. Meson und Ninja ergänzen sich. Meson kümmert sich um den Aufbau der Projektabhängigkeiten und Ninja übernimmt die Kompilierung.

Normalerweise sind die Schritte der Meson-Kompilierung relativ fest:

  1. Führen Sie Meson BUILDDIR aus – geben Sie das Kompilierungsverzeichnis BUILDDIR an und erstellen Sie das Meson-Projekt. Das heißt, alle temporären Dateien und während der Kompilierung generierten Objektdateien befinden sich in BUILDDIR.
  2. Geben Sie das Verzeichnis BUILDDIR ein;
  3. Führen Sie Ninja zum Kompilieren und Installieren aus.

Schauen wir nun noch einmal zurück, um zu sehen, install_release.shob die Struktur klarer und verständlicher ist:

  1. Geben Sie das Kompilierungsverzeichnis an build-auto.
  2. Laden Sie die vorkompilierte Datei des Servers aus dem Internet herunter;
  3. Führen Sie die Meson-Projektkonfiguration durch, geben Sie das Kompilierungsverzeichnis an und legen Sie prebuilt_serverEigenschaften fest.
  4. Geben Sie build-autodas Verzeichnis ein, führen Sie Ninja zum Kompilieren und Installieren aus.

install_release.shDiese Datei ist die Eingabedatei für die gesamte Kompilierung und leitet die Kompilierung und Installation des gesamten Projekts ein.

3. Kompilieren, installieren und ausführen

Die Zusammenstellung des Projekts ist sehr einfach:

  1. Abhängigkeiten herunterladen
    # 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.shFühren Sie das zu kompilierende Stammverzeichnis aus
    ./install_release.sh
    
  3. deinstallieren
    sudo ninja -Cbuild-auto uninstall
    

Ausführlichere Informationen und Kompilierungsschritte für andere Plattformen (wie Win und MacOS) finden Sie im offiziellen Dokument: https://github.com/Genymobile/scrcpy/blob/master/BUILD.md

Im kompilierten Skript wird Ninja für die automatische Installation verwendet. Schließen Sie nach erfolgreicher Installation das Android-Gerät an den Computer an und führen Sie es aus, um es auszuführen. ./scrcpyBei Erfolg wird die Bildschirmprojektionsoberfläche angezeigt.

3.1 Verwenden Sie keine vorkompilierten Dateien

Bei der Projektkompilierung werden standardmäßig vorkompilierte Dateien verwendet. Wenn wir das Serverprojekt selbst kompilieren möchten, müssen wir nur die folgenden zwei Stellen auskommentieren:

#!/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

Kompilieren Sie erneut und unser Serverprojekt wird kompiliert.

4. Zusammenfassung

In diesem Artikel haben wir die Projektstruktur und das Kompilierungssystem des Scrcpy-Projekts untersucht. Die beteiligten Punkte sind das Scrcpy-Projektverzeichnis, das Meson-Kompilierungssystem, die Projektkompilierungsmethode und die vorkompilierte Dateilogik. Zu Beginn des nächsten Artikels werden wir uns weiterhin mit der Client-Seite befassen, bei der es sich um die Codelogik der PC-Seite handelt.

Supongo que te gusta

Origin blog.csdn.net/ZivXu/article/details/128659839
Recomendado
Clasificación