move to prebuild docker image
Build RustDesk Android / Build RustDesk Android ARM64 (push) Successful in 13m13s

This commit is contained in:
2026-09-09 22:14:45 +03:00
parent cbeaa9bb10
commit 72ca26f35f
+117 -318
View File
@@ -10,71 +10,63 @@ on:
env:
RUSTDESK_VERSION: "1.4.9"
RUST_VERSION: "1.75"
CARGO_NDK_VERSION: "3.1.2"
CARGO_EXPAND_VERSION: "1.0.95"
FLUTTER_RUST_BRIDGE_VERSION: "1.80.1"
BRIDGE_FLUTTER_VERSION: "3.22.3"
ANDROID_FLUTTER_VERSION: "3.24.5"
ANDROID_NDK_VERSION: "28.2.13676358"
VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b"
ANDROID_BUILD_TOOLS_VERSION: "34.0.0"
jobs:
build-android:
name: Build RustDesk Android ARM64
runs-on: ubuntu-24.04
runs-on: rustdesk-android
steps:
# -----------------------------------------------------------------------
# System dependencies
# Verify prebuilt builder image
# -----------------------------------------------------------------------
- name: Install system dependencies
- name: Verify builder environment
run: |
set -euxo pipefail
sudo apt-get update
echo "=== Java ==="
java -version
sudo apt-get install -y \
ca-certificates \
clang \
cmake \
curl \
gcc \
gcc-multilib \
g++ \
g++-multilib \
git \
libayatana-appindicator3-dev \
libasound2-dev \
libc6-dev \
libclang-dev \
libunwind-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgtk-3-dev \
libpam0g-dev \
libpulse-dev \
libva-dev \
libxcb-randr0-dev \
libxcb-shape0-dev \
libxcb-xfixes0-dev \
libxdo-dev \
libxfixes-dev \
llvm-dev \
nasm \
ninja-build \
openjdk-17-jdk-headless \
pkg-config \
tree \
unzip \
wget \
xz-utils
echo
echo "=== Rust ==="
rustc --version
cargo --version
rustup target list --installed
echo
echo "=== Cargo tools ==="
cargo ndk --version
cargo expand --version
flutter_rust_bridge_codegen --version
echo
echo "=== Android SDK / NDK ==="
echo "ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT}"
echo "ANDROID_NDK_HOME=${ANDROID_NDK_HOME}"
sdkmanager --version
test -d "${ANDROID_NDK_HOME}"
test -x "${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}/apksigner"
echo
echo "=== Flutter bridge ==="
test -x "${FLUTTER_BRIDGE_HOME}/bin/flutter"
"${FLUTTER_BRIDGE_HOME}/bin/flutter" --version
echo
echo "=== Flutter Android ==="
test -x "${FLUTTER_ANDROID_HOME}/bin/flutter"
"${FLUTTER_ANDROID_HOME}/bin/flutter" --version
echo
echo "=== vcpkg ==="
test -x "${VCPKG_ROOT}/vcpkg"
"${VCPKG_ROOT}/vcpkg" version
test -d "${VCPKG_ROOT}/installed/arm64-android"
echo
echo "Builder environment OK"
# -----------------------------------------------------------------------
# RustDesk source
@@ -84,6 +76,8 @@ jobs:
run: |
set -euxo pipefail
rm -rf rustdesk
git clone \
--branch "${RUSTDESK_VERSION}" \
--depth 1 \
@@ -97,6 +91,7 @@ jobs:
echo "RustDesk commit:"
git rev-parse HEAD
echo
echo "RustDesk tag:"
git describe --tags --always
@@ -106,7 +101,6 @@ jobs:
# -----------------------------------------------------------------------
# Custom RustDesk ID server + public key
#
# Relay is NOT modified.
# -----------------------------------------------------------------------
@@ -130,6 +124,7 @@ jobs:
cd rustdesk
python3 <<'PY'
import json
import os
import re
from pathlib import Path
@@ -153,16 +148,21 @@ jobs:
if not server_key:
raise SystemExit("RUSTDESK_KEY is empty")
# json.dumps() produces a correctly escaped quoted string which is
# also valid as a Rust string literal for these values.
id_server_literal = json.dumps(id_server)
server_key_literal = json.dumps(server_key)
text, id_count = re.subn(
r'pub const RENDEZVOUS_SERVERS:\s*&\[&str\]\s*=\s*&\[[^\n]*\];',
f'pub const RENDEZVOUS_SERVERS: &[&str] = &["{id_server}"];',
f'pub const RENDEZVOUS_SERVERS: &[&str] = &[{id_server_literal}];',
text,
count=1,
)
text, key_count = re.subn(
r'pub const RS_PUB_KEY:\s*&str\s*=\s*"[^"]*";',
f'pub const RS_PUB_KEY: &str = "{server_key}";',
f'pub const RS_PUB_KEY: &str = {server_key_literal};',
text,
count=1,
)
@@ -193,14 +193,12 @@ jobs:
if grep -q 'rs-ny\.rustdesk\.com' \
libs/hbb_common/src/config.rs; then
echo "ERROR: Default RustDesk ID server is still present"
exit 1
fi
if ! grep -q 'pub const RS_PUB_KEY' \
libs/hbb_common/src/config.rs; then
echo "ERROR: RS_PUB_KEY was not found"
exit 1
fi
@@ -209,149 +207,39 @@ jobs:
echo "Relay configuration untouched: yes"
# -----------------------------------------------------------------------
# Rust
# -----------------------------------------------------------------------
- name: Install Rust
run: |
set -euxo pipefail
curl \
--proto '=https' \
--tlsv1.2 \
-sSf \
https://sh.rustup.rs \
| sh -s -- \
-y \
--default-toolchain "${RUST_VERSION}"
source "${HOME}/.cargo/env"
rustc --version
cargo --version
rustup target add aarch64-linux-android
# -----------------------------------------------------------------------
# Android SDK + NDK
# -----------------------------------------------------------------------
- name: Install Android SDK
uses: android-actions/setup-android@v3
- name: Install Android packages
run: |
set -euxo pipefail
yes | sdkmanager --licenses >/dev/null || true
sdkmanager \
"platform-tools" \
"platforms;android-34" \
"build-tools;34.0.0" \
"ndk;${ANDROID_NDK_VERSION}"
echo \
"ANDROID_NDK_HOME=${ANDROID_SDK_ROOT}/ndk/${ANDROID_NDK_VERSION}" \
>> "${GITHUB_ENV}"
echo \
"ANDROID_NDK_ROOT=${ANDROID_SDK_ROOT}/ndk/${ANDROID_NDK_VERSION}" \
>> "${GITHUB_ENV}"
echo \
"ANDROID_NDK=${ANDROID_SDK_ROOT}/ndk/${ANDROID_NDK_VERSION}" \
>> "${GITHUB_ENV}"
echo "Android SDK:"
echo "${ANDROID_SDK_ROOT}"
echo
echo "Android NDK:"
ls -la \
"${ANDROID_SDK_ROOT}/ndk/${ANDROID_NDK_VERSION}"
echo
echo "Android build tools:"
ls -la \
"${ANDROID_SDK_ROOT}/build-tools/34.0.0"
# -----------------------------------------------------------------------
# Flutter 3.22.3 for flutter-rust-bridge generation
# -----------------------------------------------------------------------
- name: Install Flutter for bridge generation
run: |
set -euxo pipefail
mkdir -p "${HOME}/flutter-sdks"
curl \
-L \
"https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${BRIDGE_FLUTTER_VERSION}-stable.tar.xz" \
-o /tmp/flutter-bridge.tar.xz
tar \
-xf /tmp/flutter-bridge.tar.xz \
-C "${HOME}/flutter-sdks"
mv \
"${HOME}/flutter-sdks/flutter" \
"${HOME}/flutter-sdks/flutter-${BRIDGE_FLUTTER_VERSION}"
"${HOME}/flutter-sdks/flutter-${BRIDGE_FLUTTER_VERSION}/bin/flutter" \
config \
--no-analytics
"${HOME}/flutter-sdks/flutter-${BRIDGE_FLUTTER_VERSION}/bin/flutter" \
--version
# -----------------------------------------------------------------------
# Generate Flutter/Rust bridge
# Generate Flutter/Rust bridge with Flutter 3.22.3.
#
# RustDesk 1.4.9 temporarily needs extended_text 13.0.0 for this stage.
# We restore 14.0.0 immediately afterwards for the Android build.
# -----------------------------------------------------------------------
- name: Generate Flutter Rust bridge
run: |
set -euxo pipefail
source "${HOME}/.cargo/env"
export PATH="${FLUTTER_BRIDGE_HOME}/bin:${CARGO_HOME}/bin:${PATH}"
export PATH="${HOME}/flutter-sdks/flutter-${BRIDGE_FLUTTER_VERSION}/bin:${PATH}"
cargo install \
cargo-expand \
--version "${CARGO_EXPAND_VERSION}" \
--locked
cargo install \
flutter_rust_bridge_codegen \
--version "${FLUTTER_RUST_BRIDGE_VERSION}" \
--features uuid \
--locked
echo "Bridge Flutter:"
flutter --version
cd rustdesk
# -------------------------------------------------------------------
# Flutter 3.22.3 cannot resolve extended_text 14.0.0.
#
# Upstream RustDesk downgrades it to 13.0.0 ONLY while generating
# flutter-rust-bridge files.
#
# Android itself is built with Flutter 3.24.5 and MUST use
# extended_text 14.0.0.
# -------------------------------------------------------------------
if ! grep -q 'extended_text: 14.0.0' flutter/pubspec.yaml; then
echo "ERROR: Expected extended_text 14.0.0 before bridge generation"
grep -n "extended_text:" flutter/pubspec.yaml || true
exit 1
fi
sed -i \
's/extended_text: 14.0.0/extended_text: 13.0.0/g' \
flutter/pubspec.yaml
echo
echo "Bridge dependency:"
grep -n "extended_text:" flutter/pubspec.yaml
pushd flutter
flutter pub get
popd
flutter_rust_bridge_codegen \
@@ -370,15 +258,9 @@ jobs:
test -f flutter/macos/Runner/bridge_generated.h
test -f flutter/ios/Runner/bridge_generated.h
# -------------------------------------------------------------------
# IMPORTANT:
# Restore original RustDesk Flutter dependencies after bridge
# generation.
#
# This reproduces upstream RustDesk CI behaviour where bridge and
# Android builds run in separate jobs/checkouts.
# -------------------------------------------------------------------
# Restore the original Android dependency versions. Upstream performs
# bridge and Android builds from separate checkouts; we reproduce that
# behaviour inside one job.
git checkout -- \
flutter/pubspec.yaml \
flutter/pubspec.lock
@@ -396,105 +278,31 @@ jobs:
echo
echo "Flutter Rust bridge generated successfully"
echo "extended_text restored to 14.0.0 for Android build"
# -----------------------------------------------------------------------
# Flutter 3.24.5 for Android build
# Android native dependencies.
#
# They are prebuilt in rustdesk-android-builder:1.4.9-r1. Running the
# upstream manifest command here verifies the exact RustDesk 1.4.9 state
# and should reuse /opt/vcpkg/installed/arm64-android.
# -----------------------------------------------------------------------
- name: Install Android Flutter
- name: Verify Android native dependencies
run: |
set -euxo pipefail
curl \
-L \
"https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${ANDROID_FLUTTER_VERSION}-stable.tar.xz" \
-o /tmp/flutter-android.tar.xz
tar \
-xf /tmp/flutter-android.tar.xz \
-C "${HOME}/flutter-sdks"
mv \
"${HOME}/flutter-sdks/flutter" \
"${HOME}/flutter-sdks/flutter-${ANDROID_FLUTTER_VERSION}"
export PATH="${HOME}/flutter-sdks/flutter-${ANDROID_FLUTTER_VERSION}/bin:${PATH}"
flutter config \
--no-analytics
flutter config \
--android-sdk "${ANDROID_SDK_ROOT}"
flutter --version
flutter doctor -v || true
cd \
"${HOME}/flutter-sdks/flutter-${ANDROID_FLUTTER_VERSION}"
git apply \
"${GITHUB_WORKSPACE}/rustdesk/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff"
# -----------------------------------------------------------------------
# vcpkg
# -----------------------------------------------------------------------
- name: Install vcpkg
run: |
set -euxo pipefail
sudo rm -rf /opt/vcpkg
sudo git clone \
https://github.com/microsoft/vcpkg.git \
/opt/vcpkg
sudo git \
-C /opt/vcpkg \
checkout "${VCPKG_COMMIT_ID}"
sudo chown \
-R "$(id -u):$(id -g)" \
/opt/vcpkg
/opt/vcpkg/bootstrap-vcpkg.sh \
-disableMetrics
echo \
"VCPKG_ROOT=/opt/vcpkg" \
>> "${GITHUB_ENV}"
/opt/vcpkg/vcpkg version
# -----------------------------------------------------------------------
# Android native dependencies
# -----------------------------------------------------------------------
- name: Build Android dependencies
run: |
set -euxo pipefail
source "${HOME}/.cargo/env"
export PATH="${HOME}/flutter-sdks/flutter-${ANDROID_FLUTTER_VERSION}/bin:${PATH}"
export VCPKG_ROOT=/opt/vcpkg
export ANDROID_NDK_HOME="${ANDROID_SDK_ROOT}/ndk/${ANDROID_NDK_VERSION}"
export ANDROID_NDK_ROOT="${ANDROID_NDK_HOME}"
export ANDROID_NDK="${ANDROID_NDK_HOME}"
cd rustdesk
echo "VCPKG_ROOT=${VCPKG_ROOT}"
echo "ANDROID_NDK_HOME=${ANDROID_NDK_HOME}"
if ! ./flutter/build_android_deps.sh arm64-v8a; then
echo
echo "Android dependency build failed."
echo "Android dependency verification/build failed."
echo "Dumping vcpkg logs:"
echo
find "${VCPKG_ROOT}/" \
find "${VCPKG_ROOT}" \
-name "*.log" \
-type f \
| while read -r logfile; do
@@ -506,32 +314,30 @@ jobs:
exit 1
fi
test -d "${VCPKG_ROOT}/installed/arm64-android"
echo
echo "Android native dependencies OK"
# -----------------------------------------------------------------------
# Rust native Android library
# Build Rust native Android library
# -----------------------------------------------------------------------
- name: Build RustDesk native library
run: |
set -euxo pipefail
source "${HOME}/.cargo/env"
export VCPKG_ROOT=/opt/vcpkg
export ANDROID_NDK_HOME="${ANDROID_SDK_ROOT}/ndk/${ANDROID_NDK_VERSION}"
export ANDROID_NDK_ROOT="${ANDROID_NDK_HOME}"
export ANDROID_NDK="${ANDROID_NDK_HOME}"
cargo install \
cargo-ndk \
--version "${CARGO_NDK_VERSION}" \
--locked
rustup target add \
aarch64-linux-android
cd rustdesk
rustc --version
cargo --version
cargo ndk --version
if ! rustup target list --installed | grep -qx 'aarch64-linux-android'; then
echo "ERROR: aarch64-linux-android Rust target is missing from builder image"
exit 1
fi
./flutter/ndk_arm64.sh
test -f \
@@ -545,13 +351,13 @@ jobs:
# -----------------------------------------------------------------------
# Permanent Android release signing
#
# key.properties:
# flutter/android/key.properties
# Required Gitea Actions secrets:
# ANDROID_KEYSTORE_BASE64
# ANDROID_KEYSTORE_PASSWORD
# ANDROID_KEY_ALIAS
#
# keystore:
# flutter/android/app/rustdesk-release.jks
#
# RustDesk's app/build.gradle resolves storeFile relative to app/.
# key.properties: flutter/android/key.properties
# keystore: flutter/android/app/rustdesk-release.jks
# -----------------------------------------------------------------------
- name: Configure Android release signing
@@ -585,18 +391,16 @@ jobs:
| base64 --decode \
> app/rustdesk-release.jks
chmod 600 \
app/rustdesk-release.jks
chmod 600 app/rustdesk-release.jks
cat > key.properties <<EOF
cat > key.properties <<EOF2
storePassword=${ANDROID_KEYSTORE_PASSWORD}
keyPassword=${ANDROID_KEYSTORE_PASSWORD}
keyAlias=${ANDROID_KEY_ALIAS}
storeFile=rustdesk-release.jks
EOF
EOF2
chmod 600 \
key.properties
chmod 600 key.properties
if [ ! -s app/rustdesk-release.jks ]; then
echo "ERROR: Restored keystore is empty"
@@ -616,25 +420,17 @@ jobs:
echo "Android release signing configured successfully."
# -----------------------------------------------------------------------
# Flutter Android APK
# Build signed ARM64 APK with Flutter 3.24.5 from builder image
# -----------------------------------------------------------------------
- name: Build signed APK
run: |
set -euxo pipefail
source "${HOME}/.cargo/env"
export PATH="${FLUTTER_ANDROID_HOME}/bin:${CARGO_HOME}/bin:${PATH}"
export PATH="${HOME}/flutter-sdks/flutter-${ANDROID_FLUTTER_VERSION}/bin:${PATH}"
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH="${JAVA_HOME}/bin:${PATH}"
export VCPKG_ROOT=/opt/vcpkg
export ANDROID_NDK_HOME="${ANDROID_SDK_ROOT}/ndk/${ANDROID_NDK_VERSION}"
export ANDROID_NDK_ROOT="${ANDROID_NDK_HOME}"
export ANDROID_NDK="${ANDROID_NDK_HOME}"
echo "Android Flutter:"
flutter --version
cd rustdesk
@@ -666,6 +462,7 @@ jobs:
pushd flutter
echo
echo "Checking Android Flutter dependencies..."
if ! grep -q 'extended_text: 14.0.0' pubspec.yaml; then
@@ -675,9 +472,12 @@ jobs:
fi
flutter clean
flutter pub get
echo
echo "Resolved extended_text:"
flutter pub deps | grep -A2 -B2 extended_text || true
flutter build apk \
--release \
--target-platform android-arm64 \
@@ -713,8 +513,7 @@ jobs:
set -euxo pipefail
APK="rustdesk/output/rustdesk-${RUSTDESK_VERSION}-custom-arm64.apk"
APKSIGNER="${ANDROID_SDK_ROOT}/build-tools/34.0.0/apksigner"
APKSIGNER="${ANDROID_SDK_ROOT}/build-tools/${ANDROID_BUILD_TOOLS_VERSION}/apksigner"
if [ ! -x "${APKSIGNER}" ]; then
echo "ERROR: apksigner not found:"