☰
RustDesk 如何交叉编译 Android APK 与 App Bundle?
2026/10/24 9:06:08 网站建设 项目流程

RustDesk 如何交叉编译 Android APK 与 App Bundle?

【免费下载链接】rustdeskAn open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.项目地址: https://gitcode.com/GitHub_Trending/ru/rustdesk

如果你要从 RustDesk 源码构建可分发的 Android 安装包,而不只是运行开发调试,flutter/目录下提供了完整的交叉编译入口:先用flutter/build_android_deps.sh按 ABI 构建 C 依赖,用flutter/ndk_arm64.sh、flutter/ndk_arm.sh交叉编译 Rust 原生库,最后用flutter/build_android.sh产出 APK 与 App Bundle(appbundle)。

这条路径依赖仓库内现成脚本,前提是你已具备文档中明确要求的工具链:

  • ANDROID_NDK_HOME已设置,NDK 版本为 r25c 或更新版本(flutter/build_android_deps.sh 头部注释);
  • VCPKG_ROOT已设置,vcpkg 已初始化(同上);
  • RustDesk 源码位于 vcpkg.json 上一级即可:依赖脚本会检查脚本所在目录的上级是否存在vcpkg.json,找不到时直接报错退出;
  • Flutter 工具链可用(flutter build命令由 flutter/build_android.sh 直接调用);
  • Rust 侧交叉编译由cargo ndk完成,对应cargo-ndk工具,见下文的 ndk 脚本。

按 ABI 构建 vcpkg 依赖

依赖脚本接收一个 ABI 参数,脚本内部把 ABI 映射到 vcpkg triplet 后执行安装:

ABI 参数vcpkg triplet
arm64-v8aarm64-android
armeabi-v7aarm-neon-android
x86_64x64-android
x86x86-android

构建主发行包只需要前两个,在 RustDesk 仓库根目录执行:

flutter/build_android_deps.sh arm64-v8a flutter/build_android_deps.sh armeabi-v7a

脚本的实际动作是进入仓库根目录并运行vcpkg install --triplet <triplet> --x-install-root="$VCPKG_ROOT/installed",依赖清单来自根目录的 vcpkg.json;对应的 triplet 定义文件位于 res/vcpkg-triplets/ 目录下。

两个需要注意的细节:

  • 缺少ANDROID_NDK_HOME或VCPKG_ROOT时,脚本直接打印ERROR: Please set ...并退出;
  • armeabi-v7a构建完成后,脚本会把$VCPKG_ROOT/installed/arm-neon-android符号链接到$VCPKG_ROOT/installed/arm-android。注释中给出的原因是cargo-ndk不理解 NEON 后缀;若目录缺失,脚本报错退出。

交叉编译 Rust 原生库

依赖就绪后,用仓库提供的两个 ndk 脚本分别编译 64 位和 32 位 ARM 的 Rust 原生库:

flutter/ndk_arm64.sh flutter/ndk_arm.sh

两个脚本各执行一条cargo ndk命令,参数来自 flutter/ndk_arm64.sh 和 flutter/ndk_arm.sh:

# ndk_arm64.sh cargo ndk --platform 21 --target aarch64-linux-android build --locked --release --features flutter,hwcodec # ndk_arm.sh cargo ndk --platform 21 --target armv7-linux-androideabi build --locked --release --features flutter,hwcodec

--platform 21指定最小 Android API level,--features flutter,hwcodec启用 Flutter 与硬件编解码特性,--locked锁定 Cargo.lock 中的依赖版本。

构建 APK 与 App Bundle

Rust 原生库和 vcpkg 依赖都就绪后,运行 flutter/build_android.sh。脚本默认以 release 模式构建,可用环境变量MODE改为其他模式(如debug)。脚本依次执行:

MODE=${MODE:=release} # 剥离 arm64-v8a 的 .so 符号信息 $ANDROID_NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-strip android/app/src/main/jniLibs/arm64-v8a/* flutter build apk --target-platform android-arm64,android-arm --${MODE} --obfuscate --split-debug-info ./split-debug-info flutter build apk --split-per-abi --target-platform android-arm64,android-arm --${MODE} --obfuscate --split-debug-info ./split-debug-info flutter build appbundle --target-platform android-arm64,android-arm --${MODE} --obfuscate --split-debug-info ./split-debug-info

三条 flutter 命令的分工:

  1. 第一条产出包含 arm64 与 arm 两种 ABI 的单个 APK;
  2. 第二条用--split-per-abi产出按 ABI 拆分的 APK;
  3. 第三条产出用于应用市场分发的 App Bundle。

三者都带--obfuscate混淆 DEX,并把调试符号拆分到./split-debug-info目录,避免符号留在发布产物里。

验证与边界

判断每一步是否成功的依据来自脚本本身的输出:

  • build_android_deps.sh成功时打印INFO: Completed building vcpkg dependencies for Android <ABI>;失败时打印对应ERROR:信息并退出,退出码非零(脚本以set -e -o pipefail启动);
  • flutter build三条命令依次完成后,APK 与 appbundle 即由 Flutter 构建系统产出,构建失败时 flutter 命令本身会报错终止。

两点边界需要留意:

  • build_android.sh只构建android-arm64,android-arm两个 target。依赖脚本虽然支持x86_64/x86,但打包脚本不会用到它们,模拟器场景不在默认主路径内;
  • strip 步骤走的是$ANDROID_NDK_HOME下的aarch64-linux-android-4.9工具链路径,这是较老 NDK 的目录结构;README 中构建 Flutter 版本的一般指引指向项目的 CI 配置,如果本地 strip 路径因 NDK 版本不同而找不到二进制,以 CI 中的环境配置为参照。

整条链路为:设置ANDROID_NDK_HOME与VCPKG_ROOT→ 逐 ABI 运行build_android_deps.sh→ 运行ndk_arm64.sh与ndk_arm.sh→ 运行build_android.sh,全部命令均在 RustDesk 仓库根目录执行。

【免费下载链接】rustdeskAn open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.项目地址: https://gitcode.com/GitHub_Trending/ru/rustdesk

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询