Rust 交叉编译运行在 Android 的可执行文件
[!NOTE]
参考链接:
在 macOS 上将 Rust 后端服务交叉编译为 aarch64-linux-android 目标,以便在 Android 设备上运行,通常需要以下步骤:
安装 Rust 及目标架构工具链
首先确保 Rust 已安装,并添加 android 的 aarch64 工具链:
rustup target add aarch64-linux-android
cargo ndk -t aarch64-linux-android build --release
安装 Android NDK
你需要安装 Android NDK,用于交叉编译。推荐通过 Android Studio 的 SDK Manager 安装,或手动下载 NDK 官网。
# macOS 使用 homebrew 完成
brew install --cask android-ndk
# 将 ANDROID_NDK_HOME 路径记录
export ANDROID_NDK_HOME="/opt/homebrew/share/android-ndk"
# 生成对应交叉编译工具
python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" --api 30 --arch arm64 --install-dir NDK/arm64
python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" --api 30 --arch arm --install-dir NDK/arm
python3 "$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py" --api 30 --arch x86 --install-dir NDK/x86
安装 cargo-ndk 工具(推荐)
cargo-ndk 简化了 Rust for Android 的交叉编译流程:
cargo install cargo-ndk
# 确保 cargo-ndk, target 组件已安装; android-ndk 已配置环境变量
cargo ndk -t aarch64-linux-android build --release
# 也可以一次为所有架构编译:
cargo ndk -t armeabi-v7a -t arm64-v8a -t x86 -t x86_64 build --release
build-android.sh
#!/bin/bash
# Android 构建脚本 - 使用 cargo-ndk
set -e
echo "正在为 Android 构建 SNMP Agent..."
# 清理之前的构建
echo "清理之前的构建文件..."
cargo clean
# 检查 cargo-ndk 是否已安装
if ! command -v cargo-ndk &> /dev/null; then
echo "cargo-ndk 未安装,正在安装..."
cargo install cargo-ndk
fi
# 检查 Android NDK 环境变量
if [ -z "$ANDROID_NDK_HOME" ]; then
echo "错误: ANDROID_NDK_HOME 环境变量未设置"
echo "请设置 ANDROID_NDK_HOME 环境变量指向你的 Android NDK 路径"
exit 1
fi
echo "使用 Android NDK: $ANDROID_NDK_HOME"
# 添加必要的 targets
echo "添加 Android targets..."
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android
# 构建所有架构
echo "为所有 Android 架构构建..."
cargo ndk -t armeabi-v7a -t arm64-v8a -t x86 -t x86_64 build --release
echo "构建完成!"
echo "生成的文件位置:"
echo " - ARM64 (aarch64): target/aarch64-linux-android/release/snmp_rs_agent"
echo " - ARMv7 (armv7): target/armv7-linux-androideabi/release/snmp_rs_agent"
echo " - x86_64: target/x86_64-linux-android/release/snmp_rs_agent"
echo " - x86: target/i686-linux-android/release/snmp_rs_agent"
给脚本文件可执行权限
chmod +x build-android.sh
手动编译 Android's Rust服务
进入你的 Rust 项目根目录,运行:
touch .cargo/config.toml
# config.toml 中添加 ndk 的编译环境
[target.aarch64-linux-android]
ar = "/Users/rivtian/Documents/code/NDK/arm64/bin/aarch64-linux-android-ar"
linker = "/Users/rivtian/Documents/code/NDK/arm64/bin/aarch64-linux-android-clang"
cargo build --target aarch64-linux-android --release
# 若配置了 target 和执行上一条命令不成功的话可使用下面的命令完成编译
export CC_aarch64_linux_android="/Users/rivtian/Documents/code/NDK/arm64/bin/aarch64-linux-android-clang"
export AR_aarch64_linux_android="/Users/rivtian/Documents/code/NDK/arm64/bin/llvm-ar"
export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="/Users/rivtian/Documents/code/NDK/arm64/bin/aarch64-linux-android-clang"
cargo build --target aarch64-linux-android --release
生成的可执行文件
编译成功后,target/aarch64-linux-android/release/ 下会有你的可执行文件,将其推送到 Android 设备即可。
设备运行
在 Android 上运行服务,需要:
- 赋予可执行权限:
chmod +x your_service - 设备需要有合适的 libc(Android 的 bionic libc,Rust 静态链接一般没问题)
- 若需后台运行,使用
nohup或&等方法。
adb devices
adb push target/aarch64-linux-android/release/my_service /data/local/tmp/
adb shell
cd /data/local/tmp
sudo chmod +x my_service
./my_service
# or
nohup ./my_service &

浙公网安备 33010602011771号