From b7729d5a4c6e4b21641b004f4ebfb9eeabe94068 Mon Sep 17 00:00:00 2001 From: gusadmin Date: Tue, 14 Jul 2026 17:42:08 +0300 Subject: [PATCH] =?UTF-8?q?Android:=20build-android.sh=20(=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20APK=20arm64-v8a)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Зеркалит build-windows: клон@пин -> preconfigure -> build_android_deps (vcpkg-android) -> FRB codegen (--llvm-path автоопределение) -> ndk_arm64 cargo-ndk -> jniLibs(.so+libc++) -> flutter build apk -> dist/. Co-Authored-By: Claude Opus 4.8 --- scripts/build-android.sh | 80 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 scripts/build-android.sh diff --git a/scripts/build-android.sh b/scripts/build-android.sh new file mode 100644 index 0000000..fb93517 --- /dev/null +++ b/scripts/build-android.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +# Собирает преднастроенный RustDesk APK (arm64-v8a) под self-hosted сервер. Linux/VM 118. +# Тулчейн — provision-android.sh (пишет ~/dev/rd-android.env). Логика зеркалит build-windows.ps1. +# +# Конфиг сервера: env RUSTDESK_SERVER/RUSTDESK_PUB_KEY (CI secrets) или config/server.env. +# Клон rustdesk: RUSTDESK_SRC_DIR (по умолч. ~/rd-build/rustdesk). +set -euo pipefail +ROOT="$(cd "$(dirname "$0")/.." && pwd)" + +# --- пины --- +declare -A P +while IFS='=' read -r k v; do [[ "$k" =~ ^[A-Z] ]] && P[$k]="${v%$'\r'}"; done < "$ROOT/upstream.txt" +TAG="${P[RUSTDESK_TAG]}"; REPO="${P[RUSTDESK_REPO]}"; RUST_V="${P[RUST_VERSION]}" +echo "== RustDesk android build == tag=$TAG (arm64-v8a)" + +# --- тулчейн-env --- +[ -f "$HOME/dev/rd-android.env" ] || { echo "нет ~/dev/rd-android.env — прогони provision-android.sh" >&2; exit 1; } +# shellcheck disable=SC1090 +source "$HOME/dev/rd-android.env" +export ANDROID_NDK="$ANDROID_NDK_HOME" # build_android_deps.sh использует $ANDROID_NDK +command -v cargo >/dev/null || { echo "нет cargo в PATH" >&2; exit 1; } +command -v flutter >/dev/null || { echo "нет flutter в PATH" >&2; exit 1; } + +# --- конфиг сервера --- +if [ -z "${RUSTDESK_SERVER:-}" ] || [ -z "${RUSTDESK_PUB_KEY:-}" ]; then + if [ -f "$ROOT/config/server.env" ]; then set -a; . "$ROOT/config/server.env"; set +a; fi +fi +: "${RUSTDESK_SERVER:?не задан RUSTDESK_SERVER}"; : "${RUSTDESK_PUB_KEY:?не задан RUSTDESK_PUB_KEY}" + +# --- клон/сброс до пина --- +SRC="${RUSTDESK_SRC_DIR:-$HOME/rd-build/rustdesk}" +if [ ! -d "$SRC/.git" ]; then + mkdir -p "$(dirname "$SRC")" + git clone --branch "$TAG" --depth 1 --recurse-submodules --shallow-submodules "$REPO" "$SRC" +else + git -C "$SRC" checkout -- .; git -C "$SRC" submodule foreach --recursive 'git checkout -- .' >/dev/null +fi +( cd "$SRC" && rustup override set "$RUST_V" >/dev/null && rustup component add rustfmt >/dev/null 2>&1 || true ) + +# --- preconfigure: вшить сервер+ключ --- +RUSTDESK_SERVER="$RUSTDESK_SERVER" RUSTDESK_PUB_KEY="$RUSTDESK_PUB_KEY" bash "$ROOT/scripts/preconfigure.sh" "$SRC" + +cd "$SRC" + +# --- vcpkg-зависимости под android arm64 (ffmpeg/aom/… из исходников — ДОЛГО) --- +echo "[deps] build_android_deps.sh arm64-v8a ..." +./flutter/build_android_deps.sh arm64-v8a + +# --- flutter_rust_bridge codegen --- +echo "[codegen] flutter_rust_bridge ..." +( cd flutter && flutter pub get >/dev/null ) +LLVM_ROOT="$(dirname "$(dirname "$(find /usr/lib -name 'libclang.so*' 2>/dev/null | head -1)")")" +RUSTC_BOOTSTRAP=1 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 \ + ${LLVM_ROOT:+--llvm-path "$LLVM_ROOT"} +[ -f src/bridge_generated.rs ] && [ -f flutter/lib/generated_bridge.dart ] && [ -f flutter/lib/generated_bridge.freezed.dart ] \ + || { echo "codegen неполный: нет dart-моста" >&2; exit 1; } + +# --- rust .so под arm64 через cargo-ndk --- +echo "[rust] ndk_arm64.sh (cargo ndk) ..." +./flutter/ndk_arm64.sh + +# --- jniLibs: librustdesk.so + libc++_shared.so --- +JNI=flutter/android/app/src/main/jniLibs/arm64-v8a +mkdir -p "$JNI" +cp ./target/aarch64-linux-android/release/liblibrustdesk.so "$JNI/librustdesk.so" +cp "$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so" "$JNI/" + +# --- APK --- +echo "[apk] flutter build apk --release --target-platform android-arm64 --split-per-abi ..." +( cd flutter && flutter build apk --release --target-platform android-arm64 --split-per-abi ) + +# --- вынести артефакт --- +DIST="$ROOT/dist"; mkdir -p "$DIST" +APK="flutter/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk" +OUT="$DIST/rustdesk-$TAG-arm64.apk" +cp "$SRC/$APK" "$OUT" +echo "ГОТОВО: $OUT ($(du -h "$OUT" | cut -f1))"