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)
Scrcpy-Zusammenstellung
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:
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.build
der in einem Gradle-Projekt ähnelt build.gradle
. Es gibt entsprechende meson.build
Dateien 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
Wir geben das App-Verzeichnis ein, wie zuvor eingeführt, es enthält auch eine meson.build
Datei, 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
Wenn wir in das Serververzeichnis gehen, können wir sehen, dass dort auch eine meson.build
Datei vorhanden ist. Gleichzeitig können wir feststellen, dass es sich im Wesentlichen auch um ein Android-Projekt mit build.gradle
Dateien 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.build
die 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.build
Es gibt nur eine große Entscheidung im Serververzeichnis , prebuilt_server
ob 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.sh
die 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 gradlew
das 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-server
einer 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_server
nicht 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.sh
der 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-server
und 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.sh
alles 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:
- 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.
- Geben Sie das Verzeichnis BUILDDIR ein;
- Führen Sie Ninja zum Kompilieren und Installieren aus.
Schauen wir nun noch einmal zurück, um zu sehen, install_release.sh
ob die Struktur klarer und verständlicher ist:
- Geben Sie das Kompilierungsverzeichnis an
build-auto
. - Laden Sie die vorkompilierte Datei des Servers aus dem Internet herunter;
- Führen Sie die Meson-Projektkonfiguration durch, geben Sie das Kompilierungsverzeichnis an und legen Sie
prebuilt_server
Eigenschaften fest. - Geben Sie
build-auto
das Verzeichnis ein, führen Sie Ninja zum Kompilieren und Installieren aus.
install_release.sh
Diese 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:
- 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
install_release.sh
Führen Sie das zu kompilierende Stammverzeichnis aus./install_release.sh
- 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. ./scrcpy
Bei 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.