Loading

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 &
posted @ 2025-07-11 16:51  RioTian  阅读(212)  评论(0)    收藏  举报