Skip to content

fix(rust): Android 交叉编译兼容(errno 分支 + Makefile 目标) - #84

Draft
lloydzhou wants to merge 1 commit into
mainfrom
fix/rustagent-android-cross-compile
Draft

fix(rust): Android 交叉编译兼容(errno 分支 + Makefile 目标)#84
lloydzhou wants to merge 1 commit into
mainfrom
fix/rustagent-android-cross-compile

Conversation

@lloydzhou

Copy link
Copy Markdown
Owner

问题

make build-rustagent-android(aarch64-linux-android 交叉编译)失败,两层原因:

1. errno 代码缺少 android 分支(编译错误 ×5)

rust/src/ffi/mod.rsrust/src/agent.rs 中 errno 读取/重置只有 macos/linux 两个 cfg 分支,android(bionic)下全部不命中:

#[cfg(target_os = "macos")]
let err = unsafe { *libc::__error() };
#[cfg(target_os = "linux")]
let err = unsafe { *libc::__errno_location() };
// android: err 未定义 → error[E0425] cannot find value `err` ×5

修法与 feat/rust-serve 分支 b4a39e9 当时一致(android 用 libc::__errno()),并补齐其漏掉的 agent.rs clear errno 处,共 4 处。

2. cc-rs(ring 0.17.14)探测不到 NDK 编译器

error occurred in cc-rs: failed to find tool "aarch64-linux-android-clang"
  • NDK r27d 只提供带 API level 的 aarch64-linux-android27-clang,无通用名
  • CARGO_TARGET_AARCH64_LINUX_ANDROID_CC 变量名格式 cc-rs 不识别,需用 CC_aarch64-linux-android(target 横线转下划线)
  • 变量名含 -,bash 无法直接赋值,须经 env 命令注入

改动

文件 内容
rust/src/ffi/mod.rs errno 读取/重置 + android 分支(libc::__errno())×2
rust/src/agent.rs 同上 ×2(含 b4a39e9 漏掉的 clear 处)
Makefile 新增独立目标 build-rustagent-androidbuild-webagent-android 依赖之;ANDROID_ENV 统一注入 CC/AR/LINKER;移除失效的 build-rust2

验证

  • make build-rustagent-android NDK=~/android-sdk/android-ndk-r27d
  • 产物 dist/rustagent-android(3.4M):ELF aarch64 PIE,interpreter /system/bin/linker64,仅依赖 bionic libc/libm/libdl
  • 宿主 cargo check --release 不受影响 ✅

使用

make build-rustagent-android NDK=/path/to/android-ndk

Draft:待 Termux 实机验证后再合并。

说明:不含 feat/rust-serve 的 --serve 功能(b4a39e9 提交里混在一起,本 PR 只提取 android 兼容部分)。

- ffi/mod.rs、agent.rs:errno 读取/重置补 target_os = "android" 分支,
  使用 bionic 的 libc::__errno()(原先只有 macos/linux 分支,android 下
  err 未定义导致 5 处 E0425 编译失败)
- Makefile:新增独立目标 build-rustagent-android;webagent-android
  依赖之。交叉编译经 env 传 CC_aarch64-linux-android/AR_aarch64-linux-android
  (NDK 只提供带 API level 的 clang,ring 的 cc-rs 探测不到通用名
  aarch64-linux-android-clang;变量名含 "-" 须用 env 命令注入)
- 移除失效的 build-rust2 目标

验证:NDK r27d 交叉编译通过,产物为 ELF aarch64 PIE
(/system/bin/linker64,仅依赖 libc/libm/libdl),宿主 cargo check 不受影响
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant