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-v8a | arm64-android |
armeabi-v7a | arm-neon-android |
x86_64 | x64-android |
x86 | x86-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 命令的分工:
- 第一条产出包含 arm64 与 arm 两种 ABI 的单个 APK;
- 第二条用
--split-per-abi产出按 ABI 拆分的 APK; - 第三条产出用于应用市场分发的 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),仅供参考