This commit is contained in:
@@ -0,0 +1,724 @@
|
|||||||
|
name: Build RustDesk Android
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- ".gitea/workflows/android.yml"
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-android:
|
||||||
|
name: Build RustDesk Android ARM64
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# System dependencies
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
- name: Install system dependencies
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
sudo apt-get update
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# RustDesk source
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
- name: Clone RustDesk
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
git clone \
|
||||||
|
--branch "${RUSTDESK_VERSION}" \
|
||||||
|
--depth 1 \
|
||||||
|
--recurse-submodules \
|
||||||
|
--shallow-submodules \
|
||||||
|
https://github.com/rustdesk/rustdesk.git \
|
||||||
|
rustdesk
|
||||||
|
|
||||||
|
cd rustdesk
|
||||||
|
|
||||||
|
echo "RustDesk commit:"
|
||||||
|
git rev-parse HEAD
|
||||||
|
|
||||||
|
echo "RustDesk tag:"
|
||||||
|
git describe --tags --always
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Submodules:"
|
||||||
|
git submodule status
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# Custom RustDesk ID server + public key
|
||||||
|
#
|
||||||
|
# Relay is NOT modified.
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
- name: Configure custom ID server and key
|
||||||
|
env:
|
||||||
|
CUSTOM_ID_SERVER: ${{ secrets.RUSTDESK_ID_SERVER }}
|
||||||
|
CUSTOM_SERVER_KEY: ${{ secrets.RUSTDESK_KEY }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if [ -z "${CUSTOM_ID_SERVER}" ]; then
|
||||||
|
echo "ERROR: RUSTDESK_ID_SERVER secret is empty"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${CUSTOM_SERVER_KEY}" ]; then
|
||||||
|
echo "ERROR: RUSTDESK_KEY secret is empty"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd rustdesk
|
||||||
|
|
||||||
|
python3 <<'PY'
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
path = Path("libs/hbb_common/src/config.rs")
|
||||||
|
|
||||||
|
if not path.exists():
|
||||||
|
raise SystemExit(
|
||||||
|
"libs/hbb_common/src/config.rs does not exist. "
|
||||||
|
"Check that submodules were cloned correctly."
|
||||||
|
)
|
||||||
|
|
||||||
|
text = path.read_text(encoding="utf-8")
|
||||||
|
|
||||||
|
id_server = os.environ["CUSTOM_ID_SERVER"].strip()
|
||||||
|
server_key = os.environ["CUSTOM_SERVER_KEY"].strip()
|
||||||
|
|
||||||
|
if not id_server:
|
||||||
|
raise SystemExit("RUSTDESK_ID_SERVER is empty")
|
||||||
|
|
||||||
|
if not server_key:
|
||||||
|
raise SystemExit("RUSTDESK_KEY is empty")
|
||||||
|
|
||||||
|
text, id_count = re.subn(
|
||||||
|
r'pub const RENDEZVOUS_SERVERS:\s*&\[&str\]\s*=\s*&\[[^\n]*\];',
|
||||||
|
f'pub const RENDEZVOUS_SERVERS: &[&str] = &["{id_server}"];',
|
||||||
|
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}";',
|
||||||
|
text,
|
||||||
|
count=1,
|
||||||
|
)
|
||||||
|
|
||||||
|
if id_count != 1:
|
||||||
|
raise SystemExit(
|
||||||
|
"Failed to patch RENDEZVOUS_SERVERS. "
|
||||||
|
"RustDesk source layout may have changed."
|
||||||
|
)
|
||||||
|
|
||||||
|
if key_count != 1:
|
||||||
|
raise SystemExit(
|
||||||
|
"Failed to patch RS_PUB_KEY. "
|
||||||
|
"RustDesk source layout may have changed."
|
||||||
|
)
|
||||||
|
|
||||||
|
path.write_text(text, encoding="utf-8")
|
||||||
|
|
||||||
|
print(f"ID server configured: {id_server}")
|
||||||
|
print("Server public key configured successfully")
|
||||||
|
PY
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Checking patched configuration..."
|
||||||
|
|
||||||
|
grep -n "RENDEZVOUS_SERVERS" \
|
||||||
|
libs/hbb_common/src/config.rs
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
echo "RS_PUB_KEY patched: yes"
|
||||||
|
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
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
- name: Generate Flutter Rust bridge
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
source "${HOME}/.cargo/env"
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
cd rustdesk
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
's/extended_text: 14.0.0/extended_text: 13.0.0/g' \
|
||||||
|
flutter/pubspec.yaml
|
||||||
|
|
||||||
|
pushd flutter
|
||||||
|
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
cp \
|
||||||
|
./flutter/macos/Runner/bridge_generated.h \
|
||||||
|
./flutter/ios/Runner/bridge_generated.h
|
||||||
|
|
||||||
|
test -f src/bridge_generated.rs
|
||||||
|
test -f src/bridge_generated.io.rs
|
||||||
|
test -f flutter/lib/generated_bridge.dart
|
||||||
|
test -f flutter/lib/generated_bridge.freezed.dart
|
||||||
|
test -f flutter/macos/Runner/bridge_generated.h
|
||||||
|
test -f flutter/ios/Runner/bridge_generated.h
|
||||||
|
|
||||||
|
echo "Flutter Rust bridge generated successfully"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# Flutter 3.24.5 for Android build
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
- name: Install Android Flutter
|
||||||
|
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
|
||||||
|
|
||||||
|
if ! ./flutter/build_android_deps.sh arm64-v8a; then
|
||||||
|
echo
|
||||||
|
echo "Android dependency build failed."
|
||||||
|
echo "Dumping vcpkg logs:"
|
||||||
|
echo
|
||||||
|
|
||||||
|
find "${VCPKG_ROOT}/" \
|
||||||
|
-name "*.log" \
|
||||||
|
-type f \
|
||||||
|
| while read -r logfile; do
|
||||||
|
echo "===== ${logfile} ====="
|
||||||
|
cat "${logfile}" || true
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# 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
|
||||||
|
|
||||||
|
./flutter/ndk_arm64.sh
|
||||||
|
|
||||||
|
test -f \
|
||||||
|
target/aarch64-linux-android/release/liblibrustdesk.so
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Native library:"
|
||||||
|
ls -lh \
|
||||||
|
target/aarch64-linux-android/release/liblibrustdesk.so
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# Permanent Android release signing
|
||||||
|
#
|
||||||
|
# key.properties:
|
||||||
|
# flutter/android/key.properties
|
||||||
|
#
|
||||||
|
# keystore:
|
||||||
|
# flutter/android/app/rustdesk-release.jks
|
||||||
|
#
|
||||||
|
# RustDesk's app/build.gradle resolves storeFile relative to app/.
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
- name: Configure Android release signing
|
||||||
|
env:
|
||||||
|
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
|
||||||
|
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
|
||||||
|
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if [ -z "${ANDROID_KEYSTORE_BASE64}" ]; then
|
||||||
|
echo "ERROR: ANDROID_KEYSTORE_BASE64 secret is empty"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${ANDROID_KEYSTORE_PASSWORD}" ]; then
|
||||||
|
echo "ERROR: ANDROID_KEYSTORE_PASSWORD secret is empty"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${ANDROID_KEY_ALIAS}" ]; then
|
||||||
|
echo "ERROR: ANDROID_KEY_ALIAS secret is empty"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd rustdesk/flutter/android
|
||||||
|
|
||||||
|
echo "Restoring Android release keystore..."
|
||||||
|
|
||||||
|
printf '%s' "${ANDROID_KEYSTORE_BASE64}" \
|
||||||
|
| base64 --decode \
|
||||||
|
> app/rustdesk-release.jks
|
||||||
|
|
||||||
|
chmod 600 \
|
||||||
|
app/rustdesk-release.jks
|
||||||
|
|
||||||
|
cat > key.properties <<EOF
|
||||||
|
storePassword=${ANDROID_KEYSTORE_PASSWORD}
|
||||||
|
keyPassword=${ANDROID_KEYSTORE_PASSWORD}
|
||||||
|
keyAlias=${ANDROID_KEY_ALIAS}
|
||||||
|
storeFile=rustdesk-release.jks
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod 600 \
|
||||||
|
key.properties
|
||||||
|
|
||||||
|
if [ ! -s app/rustdesk-release.jks ]; then
|
||||||
|
echo "ERROR: Restored keystore is empty"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Checking keystore..."
|
||||||
|
|
||||||
|
keytool \
|
||||||
|
-list \
|
||||||
|
-keystore app/rustdesk-release.jks \
|
||||||
|
-storepass "${ANDROID_KEYSTORE_PASSWORD}" \
|
||||||
|
-alias "${ANDROID_KEY_ALIAS}" \
|
||||||
|
>/dev/null
|
||||||
|
|
||||||
|
echo "Keystore is valid."
|
||||||
|
echo "Android release signing configured successfully."
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# Flutter Android APK
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
- name: Build signed APK
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
source "${HOME}/.cargo/env"
|
||||||
|
|
||||||
|
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}"
|
||||||
|
|
||||||
|
cd rustdesk
|
||||||
|
|
||||||
|
mkdir -p \
|
||||||
|
flutter/android/app/src/main/jniLibs/arm64-v8a
|
||||||
|
|
||||||
|
cp \
|
||||||
|
target/aarch64-linux-android/release/liblibrustdesk.so \
|
||||||
|
flutter/android/app/src/main/jniLibs/arm64-v8a/librustdesk.so
|
||||||
|
|
||||||
|
cp \
|
||||||
|
"${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so" \
|
||||||
|
flutter/android/app/src/main/jniLibs/arm64-v8a/libc++_shared.so
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
's/org.gradle.jvmargs=-Xmx1024M/org.gradle.jvmargs=-Xmx2g/g' \
|
||||||
|
flutter/android/gradle.properties
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "JNI libraries:"
|
||||||
|
ls -lh \
|
||||||
|
flutter/android/app/src/main/jniLibs/arm64-v8a/
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Signing files:"
|
||||||
|
ls -lh \
|
||||||
|
flutter/android/key.properties \
|
||||||
|
flutter/android/app/rustdesk-release.jks
|
||||||
|
|
||||||
|
pushd flutter
|
||||||
|
|
||||||
|
flutter clean
|
||||||
|
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
flutter build apk \
|
||||||
|
--release \
|
||||||
|
--target-platform android-arm64 \
|
||||||
|
--split-per-abi
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
test -f \
|
||||||
|
flutter/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
|
||||||
|
|
||||||
|
mkdir -p output
|
||||||
|
|
||||||
|
cp \
|
||||||
|
flutter/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk \
|
||||||
|
"output/rustdesk-${RUSTDESK_VERSION}-custom-arm64.apk"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Built APK:"
|
||||||
|
ls -lh \
|
||||||
|
"output/rustdesk-${RUSTDESK_VERSION}-custom-arm64.apk"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "SHA256:"
|
||||||
|
sha256sum \
|
||||||
|
"output/rustdesk-${RUSTDESK_VERSION}-custom-arm64.apk"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# Verify APK release signature
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
- name: Verify APK signature
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
APK="rustdesk/output/rustdesk-${RUSTDESK_VERSION}-custom-arm64.apk"
|
||||||
|
|
||||||
|
APKSIGNER="${ANDROID_SDK_ROOT}/build-tools/34.0.0/apksigner"
|
||||||
|
|
||||||
|
if [ ! -x "${APKSIGNER}" ]; then
|
||||||
|
echo "ERROR: apksigner not found:"
|
||||||
|
echo "${APKSIGNER}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "${APK}" ]; then
|
||||||
|
echo "ERROR: APK not found:"
|
||||||
|
echo "${APK}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Verifying APK signature..."
|
||||||
|
echo
|
||||||
|
|
||||||
|
"${APKSIGNER}" verify \
|
||||||
|
--verbose \
|
||||||
|
--print-certs \
|
||||||
|
"${APK}"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "APK signature verification successful."
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# APK checksum
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
- name: Create checksum
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
cd rustdesk/output
|
||||||
|
|
||||||
|
sha256sum \
|
||||||
|
"rustdesk-${RUSTDESK_VERSION}-custom-arm64.apk" \
|
||||||
|
> "rustdesk-${RUSTDESK_VERSION}-custom-arm64.apk.sha256"
|
||||||
|
|
||||||
|
cat \
|
||||||
|
"rustdesk-${RUSTDESK_VERSION}-custom-arm64.apk.sha256"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
# Upload Gitea Actions artifact
|
||||||
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
- name: Upload APK
|
||||||
|
uses: actions/upload-artifact@v4.6.2
|
||||||
|
with:
|
||||||
|
name: rustdesk-${{ env.RUSTDESK_VERSION }}-custom-arm64
|
||||||
|
path: |
|
||||||
|
rustdesk/output/rustdesk-${{ env.RUSTDESK_VERSION }}-custom-arm64.apk
|
||||||
|
rustdesk/output/rustdesk-${{ env.RUSTDESK_VERSION }}-custom-arm64.apk.sha256
|
||||||
|
if-no-files-found: error
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
rustdesk-release.jks.base64
|
||||||
|
rustdesk-release.jks
|
||||||
|
rustdesk-release.pass
|
||||||
Reference in New Issue
Block a user