123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565 |
- #!/bin/bash
- set -x
- #
- # Script to build F-Droid release of RustDesk
- #
- # Copyright (C) 2024, The RustDesk Authors
- # 2024, Vasyl Gello <vasek.gello@gmail.com>
- #
- # The script is invoked by F-Droid builder system ste-by-step.
- #
- # It accepts the following arguments:
- #
- # - versionName from https://github.com/rustdesk/rustdesk/releases/download/fdroid-version/rustdesk-version.txt
- # - versionCode from https://github.com/rustdesk/rustdesk/releases/download/fdroid-version/rustdesk-version.txt
- # - Android architecture to build APK for: armeabi-v7a arm64-v8av x86 x86_64
- # - The build step to execute:
- #
- # + sudo-deps: as root, install needed Debian packages into builder VM
- # + prebuild: patch sources and do other stuff before the build
- # + build: perform actual build of APK file
- #
- # Parse command-line arguments
- VERNAME="${1}"
- VERCODE="${2}"
- ANDROID_ABI="${3}"
- BUILDSTEP="${4}"
- if [ -z "${VERNAME}" ] || [ -z "${VERCODE}" ] || [ -z "${ANDROID_ABI}" ] ||
- [ -z "${BUILDSTEP}" ]; then
- echo "ERROR: Command-line arguments are all required to be non-empty!" >&2
- exit 1
- fi
- # Set various architecture-specific identifiers
- case "${ANDROID_ABI}" in
- arm64-v8a)
- FLUTTER_TARGET=android-arm64
- NDK_TARGET=aarch64-linux-android
- RUST_TARGET=aarch64-linux-android
- RUSTDESK_FEATURES='flutter,hwcodec'
- ;;
- armeabi-v7a)
- FLUTTER_TARGET=android-arm
- NDK_TARGET=arm-linux-androideabi
- RUST_TARGET=armv7-linux-androideabi
- RUSTDESK_FEATURES='flutter,hwcodec'
- ;;
- x86_64)
- FLUTTER_TARGET=android-x64
- NDK_TARGET=x86_64-linux-android
- RUST_TARGET=x86_64-linux-android
- RUSTDESK_FEATURES='flutter'
- ;;
- x86)
- FLUTTER_TARGET=android-x86
- NDK_TARGET=i686-linux-android
- RUST_TARGET=i686-linux-android
- RUSTDESK_FEATURES='flutter'
- ;;
- *)
- echo "ERROR: Unknown Android ABI '${ANDROID_ABI}'!" >&2
- exit 1
- ;;
- esac
- # Check ANDROID_SDK_ROOT and sdkmanager present on PATH
- if [ ! -d "${ANDROID_SDK_ROOT}" ] || ! command -v sdkmanager 1>/dev/null; then
- echo "ERROR: Can not find Android SDK!" >&2
- exit 1
- fi
- # Export necessary variables
- export PATH="${PATH}:${HOME}/flutter/bin:${HOME}/depot_tools"
- export VCPKG_ROOT="${HOME}/vcpkg"
- # Now act depending on build step
- # NOTE: F-Droid maintainers require explicit declaration of dependencies
- # as root via `Builds.sudo` F-Droid metadata directive:
- # https://gitlab.com/fdroid/fdroiddata/-/merge_requests/15343#note_1988918695
- case "${BUILDSTEP}" in
- prebuild)
- # prebuild: patch sources and do other stuff before the build
- #
- # Extract required versions for NDK, Rust, Flutter from
- # '.github/workflows/flutter-build.yml'
- #
- CARGO_NDK_VERSION="$(yq -r \
- .env.CARGO_NDK_VERSION \
- .github/workflows/flutter-build.yml)"
- FLUTTER_VERSION="$(yq -r \
- .env.ANDROID_FLUTTER_VERSION \
- .github/workflows/flutter-build.yml)"
- if [ -z "${FLUTTER_VERSION}" ]; then
- FLUTTER_VERSION="$(yq -r \
- .env.FLUTTER_VERSION \
- .github/workflows/flutter-build.yml)"
- fi
- FLUTTER_RUST_BRIDGE_VERSION="$(yq -r \
- .env.FLUTTER_RUST_BRIDGE_VERSION \
- .github/workflows/flutter-build.yml)"
- NDK_VERSION="$(yq -r \
- .env.NDK_VERSION \
- .github/workflows/flutter-build.yml)"
- RUST_VERSION="$(yq -r \
- .env.RUST_VERSION \
- .github/workflows/flutter-build.yml)"
- VCPKG_COMMIT_ID="$(yq -r \
- .env.VCPKG_COMMIT_ID \
- .github/workflows/flutter-build.yml)"
- if [ -z "${CARGO_NDK_VERSION}" ] || [ -z "${FLUTTER_VERSION}" ] ||
- [ -z "${FLUTTER_RUST_BRIDGE_VERSION}" ] ||
- [ -z "${NDK_VERSION}" ] || [ -z "${RUST_VERSION}" ] ||
- [ -z "${VCPKG_COMMIT_ID}" ]; then
- echo "ERROR: Can not identify all required versions!" >&2
- exit 1
- fi
- # Map NDK version to revision
- NDK_VERSION="$(wget \
- -qO- \
- -H "Accept: application/vnd.github+json" \
- -H "X-GitHub-Api-Version: 2022-11-28" \
- 'https://api.github.com/repos/android/ndk/releases' |
- jq -r ".[] | select(.tag_name == \"${NDK_VERSION}\") | .body | match(\"ndkVersion \\\"(.*)\\\"\").captures[0].string")"
- if [ -z "${NDK_VERSION}" ]; then
- echo "ERROR: Can not map Android NDK codename to revision!" >&2
- exit 1
- fi
- export ANDROID_NDK_HOME="${ANDROID_SDK_ROOT}/ndk/${NDK_VERSION}"
- export ANDROID_NDK_ROOT="${ANDROID_SDK_ROOT}/ndk/${NDK_VERSION}"
- #
- # Install the components
- #
- set -e
- # Install Android NDK
- if [ ! -d "${ANDROID_NDK_ROOT}" ]; then
- sdkmanager --install "ndk;${NDK_VERSION}"
- fi
- # Install Flutter
- if [ ! -f "${HOME}/flutter/bin/flutter" ]; then
- pushd "${HOME}"
- git clone https://github.com/flutter/flutter
- pushd flutter
- git reset --hard "${FLUTTER_VERSION}"
- flutter config --no-analytics
- popd # flutter
- popd # ${HOME}
- fi
- # Install Rust
- if [ ! -f "${HOME}/rustup/rustup-init.sh" ]; then
- pushd "${HOME}"
- git clone --depth 1 https://github.com/rust-lang/rustup
- popd # ${HOME}
- fi
- pushd "${HOME}/rustup"
- bash rustup-init.sh -y \
- --target "${RUST_TARGET}" \
- --default-toolchain "${RUST_VERSION}"
- popd
- if ! command -v cargo 1>/dev/null 2>&1; then
- . "${HOME}/.cargo/env"
- fi
- # Install cargo-ndk
- cargo install \
- cargo-ndk \
- --version "${CARGO_NDK_VERSION}"
- # Install rust bridge generator
- cargo install cargo-expand
- cargo install flutter_rust_bridge_codegen \
- --version "${FLUTTER_RUST_BRIDGE_VERSION}" \
- --features "uuid"
- # Populate native vcpkg dependencies
- if [ ! -d "${VCPKG_ROOT}" ]; then
- pushd "${HOME}"
- git clone \
- https://github.com/Microsoft/vcpkg.git
- git clone \
- https://github.com/Microsoft/vcpkg-tool.git
- pushd vcpkg-tool
- mkdir build
- pushd build
- cmake \
- -DCMAKE_BUILD_TYPE=Release \
- -G 'Ninja' \
- -DVCPKG_DEVELOPMENT_WARNINGS=OFF \
- ..
- cmake --build .
- popd # build
- popd # vcpkg-tool
- pushd vcpkg
- git reset --hard "${VCPKG_COMMIT_ID}"
- cp -a ../vcpkg-tool/build/vcpkg vcpkg
- # disable telemetry
- touch "vcpkg.disable-metrics"
- popd # vcpkg
- popd # ${HOME}
- fi
- # Install depot-tools for x86
- if [ "${ANDROID_ABI}" = "x86" ]; then
- if [ ! -d "${HOME}/depot_tools" ]; then
- pushd "${HOME}"
- git clone \
- --depth 1 \
- https://chromium.googlesource.com/chromium/tools/depot_tools.git
- popd # ${HOME}
- fi
- fi
- # Patch the RustDesk sources
- git apply res/fdroid/patches/*.patch
- sed \
- -i \
- -e '/gms/d' \
- flutter/android/build.gradle \
- flutter/android/app/build.gradle
- sed \
- -i \
- -e '/firebase_analytics/d' \
- flutter/pubspec.yaml
- sed \
- -i \
- -e '/ firebase/,/ version/d' \
- flutter/pubspec.lock
- sed \
- -i \
- -e '/firebase/Id' \
- flutter/lib/main.dart
- if [ "${FLUTTER_VERSION}" = "3.13.9" ]; then
- # Fix for android 3.13.9
- # https://github.com/rustdesk/rustdesk/blob/285e974d1a52c891d5fcc28e963d724e085558bc/.github/workflows/flutter-build.yml#L862
- sed \
- -i \
- -e 's/extended_text: .*/extended_text: 11.1.0/' \
- -e 's/uni_links_desktop/#uni_links_desktop/g' \
- flutter/pubspec.yaml
- set --
- while read -r _1; do
- set -- "$@" "${_1}"
- done 0<<.a
- $(find flutter/lib/ -type f -name "*dart*")
- .a
- sed \
- -i \
- -e 's/textScaler: TextScaler.linear(\(.*\)),/textScaleFactor: \1,/g' \
- "$@"
- set --
- fi
- sed -i "s/FLUTTER_VERSION_PLACEHOLDER/${FLUTTER_VERSION}/" flutter-sdk/.gclient
- ;;
- build)
- # build: perform actual build of APK file
- set -e
- #
- # Extract required versions for NDK, Rust, Flutter from
- # '.github/workflows/flutter-build.yml'
- #
- FLUTTER_VERSION="$(yq -r \
- .env.ANDROID_FLUTTER_VERSION \
- .github/workflows/flutter-build.yml)"
- if [ -z "${FLUTTER_VERSION}" ]; then
- FLUTTER_VERSION="$(yq -r \
- .env.FLUTTER_VERSION \
- .github/workflows/flutter-build.yml)"
- fi
- NDK_VERSION="$(yq -r \
- .env.NDK_VERSION \
- .github/workflows/flutter-build.yml)"
- # Map NDK version to revision
- NDK_VERSION="$(wget \
- -qO- \
- -H "Accept: application/vnd.github+json" \
- -H "X-GitHub-Api-Version: 2022-11-28" \
- 'https://api.github.com/repos/android/ndk/releases' |
- jq -r ".[] | select(.tag_name == \"${NDK_VERSION}\") | .body | match(\"ndkVersion \\\"(.*)\\\"\").captures[0].string")"
- if [ -z "${NDK_VERSION}" ]; then
- echo "ERROR: Can not map Android NDK codename to revision!" >&2
- exit 1
- fi
- export ANDROID_NDK_HOME="${ANDROID_SDK_ROOT}/ndk/${NDK_VERSION}"
- export ANDROID_NDK_ROOT="${ANDROID_SDK_ROOT}/ndk/${NDK_VERSION}"
- if ! command -v cargo 1>/dev/null 2>&1; then
- . "${HOME}/.cargo/env"
- fi
- # Download Flutter dependencies
- pushd flutter
- flutter packages pub get
- popd # flutter
- # Generate FFI bindings
- flutter_rust_bridge_codegen \
- --rust-input ./src/flutter_ffi.rs \
- --dart-output ./flutter/lib/generated_bridge.dart
- # Build host android deps
- bash flutter/build_android_deps.sh "${ANDROID_ABI}"
- # Build rustdesk lib
- cargo ndk \
- --platform 21 \
- --target "${RUST_TARGET}" \
- --bindgen \
- build \
- --release \
- --features "${RUSTDESK_FEATURES}"
- mkdir -p "flutter/android/app/src/main/jniLibs/${ANDROID_ABI}"
- cp "target/${RUST_TARGET}/release/liblibrustdesk.so" \
- "flutter/android/app/src/main/jniLibs/${ANDROID_ABI}/librustdesk.so"
- cp "${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/${NDK_TARGET}/libc++_shared.so" \
- "flutter/android/app/src/main/jniLibs/${ANDROID_ABI}/"
- "${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip" \
- "flutter/android/app/src/main/jniLibs/${ANDROID_ABI}"/*
- # Build flutter-jit-release for x86
- if [ "${ANDROID_ABI}" = "x86" ]; then
- pushd flutter-sdk
- echo "## Sync flutter engine sources"
- echo "### We need fakeroot because chromium base image is unpacked with weird uid/gid ownership"
- sed -i "s/FLUTTER_VERSION_PLACEHOLDER/${FLUTTER_VERSION}/" .gclient
- export FAKEROOTDONTTRYCHOWN=1
- fakeroot gclient sync
- unset FAKEROOTDONTTRYCHOWN
- pushd src
- echo "## Patch away Google Play dependencies"
- rm \
- flutter/shell/platform/android/io/flutter/app/FlutterPlayStoreSplitApplication.java \
- flutter/shell/platform/android/io/flutter/embedding/engine/deferredcomponents/PlayStoreDeferredComponentManager.java flutter/shell/platform/android/io/flutter/embedding/android/FlutterPlayStoreSplitApplication.java
- sed \
- -i \
- -e '/PlayStore/d' \
- flutter/tools/android_lint/project.xml \
- flutter/shell/platform/android/BUILD.gn
- sed \
- -i \
- -e '/com.google.android.play/d' \
- flutter/tools/androidx/files.json
- echo "## Configure android engine build"
- flutter/tools/gn \
- --android --android-cpu x86 --runtime-mode=jit_release \
- --no-goma --no-enable-unittests
- echo "## Perform android engine build"
- ninja -C out/android_jit_release_x86
- echo "## Configure host engine build"
- flutter/tools/gn \
- --android-cpu x86 --runtime-mode=jit_release \
- --no-goma --no-enable-unittests
- echo "## Perform android engine build"
- ninja -C out/host_jit_release_x86
- echo "## Rename host engine"
- mv out/host_jit_release_x86 out/host_jit_release
- echo "## Mimic jit_release engine to debug to use with flutter build apk"
- pushd out/android_jit_release_x86
- sed \
- -e 's/jit_release/debug/' \
- flutter_embedding_jit_release.maven-metadata.xml \
- 1>flutter_embedding_debug.maven-metadata.xml
- sed \
- -e 's/jit_release/debug/' \
- flutter_embedding_jit_release.pom \
- 1>flutter_embedding_debug.pom
- sed \
- -e 's/jit_release/debug/' \
- x86_jit_release.maven-metadata.xml \
- 1>x86_debug.maven-metadata.xml
- sed \
- -e 's/jit_release/debug/' \
- x86_jit_release.pom \
- 1>x86_debug.pom
- cp -a \
- flutter_embedding_jit_release-sources.jar \
- flutter_embedding_debug-sources.jar
- cp -a \
- flutter_embedding_jit_release.jar \
- flutter_embedding_debug.jar
- cp -a \
- x86_jit_release.jar \
- x86_debug.jar
- popd # out/android_jit_release_x86
- popd # src
- popd # flutter-sdk
- echo "# Clean up intermediate engine files and show free space"
- rm -rf \
- flutter-sdk/src/out/android_jit_release_x86/obj \
- flutter-sdk/src/out/host_jit_release/obj
- mv flutter-sdk/src/out flutter-out
- rm -rf flutter-sdk
- mkdir -p flutter-sdk/src/
- mv flutter-out flutter-sdk/src/out
- fi
- # Build the apk
- pushd flutter
- if [ "${ANDROID_ABI}" = "x86" ]; then
- flutter build apk \
- --local-engine-src-path="$(readlink -mf "../flutter-sdk/src")" \
- --local-engine=android_jit_release_x86 \
- --debug \
- --build-number="${VERCODE}" \
- --build-name="${VERNAME}" \
- --target-platform "${FLUTTER_TARGET}"
- else
- flutter build apk \
- --release \
- --build-number="${VERCODE}" \
- --build-name="${VERNAME}" \
- --target-platform "${FLUTTER_TARGET}"
- fi
- popd # flutter
- rm -rf flutter-sdk
- # Special step for fdroiddata CI builds to remove .gitconfig
- rm -f /home/vagrant/.gitconfig
- ;;
- *)
- echo "ERROR: Unknown build step '${BUILDSTEP}'!" >&2
- exit 1
- ;;
- esac
- # Report success
- echo "All done!"
|