As everyone knows, RustDesk is a free, open source, and cross-platform remote desktop software, source: RustDesk.
However, because this project uses various cross-compilation techniques, compiling it yourself is very unlikely to succeed. To ensure a 100% success rate for manual compilation, this guide uses a fixed build environment for a once-and-for-all solution.
Download and install Ubuntu 24.04.4
You can use either a virtual machine or a physical machine (virtual machine is recommended), but whichever you choose, you must have GitHub access (global access is recommended).
Ubuntu 24.04.4 Download Link
1. Install essential development packages
sudo apt update
sudo apt install -y autoconf automake build-essential clang cmake g++-multilib gcc-multilib git curl wget tree unzip zip xz-utils libasound2-dev libclang-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libgtk-3-dev libpulse-dev libssl-dev libstdc++-12-dev libtool libx11-dev libxcb-randr0-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxcb1-dev libxdo-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev llvm-dev nasm yasm ninja-build openjdk-17-jdk pkg-config
Return: Running kernel seems to be up-to-date.
2. Hold essential base packages
sudo apt-mark hold clang cmake ninja-build nasm openjdk-17-jdk-headless libgtk-3-dev
Return: clang set on hold.
cmake set on hold.
ninja-build set on hold.
nasm set on hold.
openjdk-17-jdk-headless set on hold.
libgtk-3-dev set on hold.
3. Install Rust toolchain
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.75.0
Return: Rust is installed now. Great!
4. Set Rust environment variables
source "$HOME/.cargo/env"
source ~/.bashrc
5. Install and confirm rustfmt component
rustup component add rustfmt
Return: component rustfmt is up to date
6. Install Rust cross-compilation libraries
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android
Return: rust-std installed
7. Install cargo-ndk
cargo install cargo-ndk --version 3.1.2 --locked
Return: Installed package cargo-ndk v3.1.2
8. Install flutter_rust_bridge_codegen
cargo install flutter_rust_bridge_codegen --version 1.80.1 --features "uuid" --locked
Return: Installed package flutter_rust_bridge_codegen v1.80.1
9. Download flutter
cd ~
wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.24.5-stable.tar.xz
Return: ‘flutter_linux_3.24.5-stable.tar.xz’ saved
10. Unzip flutter
tar xvf flutter_linux_3.24.5-stable.tar.xz
rm flutter_linux_3.24.5-stable.tar.xz
11. Set flutter environment variables
echo 'export PATH="$HOME/flutter/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
12. Initialize flutter
flutter --version
Return: Welcome to Flutter
Some content is set to hidden and will be revealed after you reply!
[reply]
13. Extract and apply some patch files
git clone https://github.com/rustdesk/rustdesk.git --depth 1 --branch 1.4.6 /tmp/rustdesk-temp
cd /tmp/rustdesk-temp
cp .github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff ~/flutter/
cd ~/flutter
git apply flutter_3.24.4_dropdown_menu_enableFilter.diff
cd ~
rm -rf /tmp/rustdesk-temp
14. Install android ndk
mkdir -p ~/android-ndk
cd ~/android-ndk
wget https://dl.google.com/android/repository/android-ndk-r28c-linux.zip
unzip android-ndk-r28c-linux.zip
Return: finishing deferred symbolic links
15. Set android ndk environment variables
echo 'export ANDROID_NDK_HOME="$HOME/android-ndk/android-ndk-r28c"' >> ~/.bashrc
source ~/.bashrc
echo 'export PATH="$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
16. Install commandlinetools
cd ~
wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
mkdir -p ~/android-sdk/cmdline-tools
unzip commandlinetools-linux-11076708_latest.zip -d ~/android-sdk/cmdline-tools/
mv ~/android-sdk/cmdline-tools/cmdline-tools ~/android-sdk/cmdline-tools/latest
17. Set commandlinetools environment variables
echo 'export ANDROID_HOME="$HOME/android-sdk"' >> ~/.bashrc
source ~/.bashrc
echo 'export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH"' >> ~/.bashrc
source ~/.bashrc
18. Accept sdk licenses
yes | sdkmanager --licenses
Return: All SDK package licenses accepted
19. Install required SDKs
sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" "ndk;28.2.13676358"
Return: [=======================================] 100% Unzipping… platform-tools/sqlit
20. Confirm license
flutter doctor --android-licenses
Return: All SDK package licenses accepted.
21. Initialize flutter
flutter doctor
Return: [✓] Flutter (Channel stable, 3.24.5
22. Install vcpkg
mkdir -p ~/vcpkg
cd ~/vcpkg
git clone https://github.com/microsoft/vcpkg.git .
git checkout 120deac3062162151622ca4860575a33844ba10b
Return: Note: switching to ‘120deac3062162151622ca4860575a33844ba10b’.
23. Set vcpkg environment variables
echo 'export VCPKG_ROOT="$HOME/vcpkg"' >> ~/.bashrc
source ~/.bashrc
24. Initialize vcpkg
./bootstrap-vcpkg.sh -disableMetrics
Return: vcpkg package management program version 2025-07-21-d4b65a2b83ae6c3526acd1c6f3b51aff2a884533
25. Download RustDesk source code
cd ~
git clone --recursive --depth 1 --branch 1.4.6 https://github.com/rustdesk/rustdesk.git
Return: Submodule path ‘libs/hbb_common’: checked out ‘48c37de3e6c4e399af6f51ca20e8e3e1fd037976’
26. Bridge preparation
cd ~/rustdesk/flutter
flutter clean
flutter pub get
27. Generate bridge files (this may take a long time)
cd ~/rustdesk
flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart --c-output ./flutter/macos/Runner/bridge_generated.h
Return: Now go and use it ![]()
Build stage, for self-study and debugging only. Please use responsibly!
To prevent abuse, here we compile only the arm32 version.
28. Compile dependencies
./flutter/build_android_deps.sh armeabi-v7a
Return: [Finished] Move arm-neon-android to arm-android
29. Compile 75x files
./flutter/ndk_arm.sh
Return: Finished release [optimized] target(s)
30. Copy compiled libraries
mkdir -p flutter/android/app/src/main/jniLibs/armeabi-v7a
cp target/armv7-linux-androideabi/release/liblibrustdesk.so flutter/android/app/src/main/jniLibs/armeabi-v7a/librustdesk.so
cp $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so flutter/android/app/src/main/jniLibs/armeabi-v7a/
31. Enter build directory
cd ~/rustdesk/flutter
32. Fix build options
sed -i "s/org.gradle.jvmargs=-Xmx1024M/org.gradle.jvmargs=-Xmx2g/g" ./android/gradle.properties
sed -i "s/signingConfigs.release/signingConfigs.debug/g" ./android/app/build.gradle
33. Confirm dependencies again
flutter pub get
Return: Got dependencies!
finish: Officially build the APK
flutter build apk --release --split-per-abi --target-platform android-arm --obfuscate --split-debug-info=split-debug-info
Return: ✓ Built build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk
[/reply]
This post is probably the only 100% successful, no hidden defects, pure text build tutorial on the whole internet.
Finally, best wishes to everyone for successful compiling. This tutorial is for learning and exploration only—do not use it for other purposes, and always follow proper standards.
You are free to repost this tutorial, but please credit the source. Thank you!
Good luck to all