logo头像

老陕小张学技术接地气

安卓交差编译

Go 程序交叉编译到 Android ARMv7 的完整指南(NDK r29 + adb 测试)

在本文中,我们将完整讲解如何在 Linux 主机上使用 Go + Android NDK r29,将 Go 程序编译为 Android ARMv7 可执行文件,并通过 adb 拷贝到设备运行。


一、下载和安装 Android NDK

1️⃣ 官方下载地址

你可以根据操作系统选择 Linux 版本,例如:

  • android-ndk-r29-linux.zip

2️⃣ 安装方法

假设下载到 ~/Downloads

# 创建目录
mkdir -p ~/andron/android-ndk-r29

# 解压到指定目录
unzip ~/Downloads/android-ndk-r29-linux.zip -d ~/andron/android-ndk-r29

# 设置环境变量
export ANDROID_NDK=$HOME/andron/android-ndk-r29
export PATH=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH

⚠️ 注意:NDK 目录结构中 toolchains/llvm/prebuilt/linux-x86_64/bin 下包含 clang 交叉编译器。

3️⃣ 验证 Clang 是否可用

ls $ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/ | grep armv7a

输出示例:

armv7a-linux-androideabi21-clang
armv7a-linux-androideabi21-clang++
...
armv7a-linux-androideabi35-clang++

⚠️ 重点:

  • 没有 armv7a-linux-androideabi16-clang
  • 最小 API Level 是 21(Android 5.0)

如果你的设备 < API 21,需要下载旧版 NDK(r21 或 r19)。


二、设置交叉编译器

export CC=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang
export CXX=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang++

验证:

$CC --version

✅ 正确会显示 clang 版本信息


三、交叉编译 Go 程序

GOOS=android \
GOARCH=arm \
GOARM=7 \
CGO_ENABLED=1 \
go build -o edge-openapi-collector-armv7 main.go

参数说明:

  • GOOS=android → Android 系统
  • GOARCH=arm → 32 位 ARM
  • GOARM=7 → ARMv7
  • CGO_ENABLED=1 → 必须启用 CGO,Android/ARM 需要 NDK 链接
  • -o edge-openapi-collector-armv7 → 输出文件名

四、拷贝到设备并测试

假设设备已经开启 USB 调试,并且电脑已安装 adb

1️⃣ 检查设备连接

adb devices

输出示例:

List of devices attached
0123456789ABCDEF	device

2️⃣ 拷贝二进制文件

adb push edge-openapi-collector-armv7 /data/local/tmp/

3️⃣ 进入设备 shell

adb shell
cd /data/local/tmp

4️⃣ 给二进制执行权限

chmod +x edge-openapi-collector-armv7

5️⃣ 运行程序

./edge-openapi-collector-armv7

✅ 如果输出正常,说明交叉编译成功


五、注意事项

  1. NDK r29 最小支持 API 21

    • Android 4.x 设备无法运行用 r29 编译的二进制
    • 低版本设备需使用旧 NDK(r21 或 r19)
  2. 选择不同 API Level 的 clang

    • 可替换 armv7a-linux-androideabi21-clang 为 22/23/24 等版本
    • 确保兼容目标设备
  3. 检查二进制类型

file edge-openapi-collector-armv7

输出示例:

ELF 32-bit LSB executable, ARM, EABI5, dynamically linked (Android)
  1. 执行报错处理
  • No such file or directory → 缺少动态库或 API 版本过低
  • Go + NDK 静态链接可避免大部分兼容问题

六、一键编译 & 测试脚本

为了方便,可以写一个 build.sh

#!/bin/bash

# NDK 路径
ANDROID_NDK=$HOME/andron/android-ndk-r29

# 设置交叉编译器
export CC=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang
export CXX=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang++

# 交叉编译
GOOS=android GOARCH=arm GOARM=7 CGO_ENABLED=1 go build -o edge-openapi-collector-armv7 main.go

# 拷贝到设备
adb push edge-openapi-collector-armv7 /data/local/tmp/

# 设置执行权限
adb shell "chmod +x /data/local/tmp/edge-openapi-collector-armv7"

# 运行程序
adb shell "/data/local/tmp/edge-openapi-collector-armv7"

只需修改 ANDROID_NDK 路径即可一键完成编译、推送和运行。


💡 总结

通过本文的方法,你可以:

  • 在 Linux 主机上使用 Go + NDK r29 编译 ARMv7 Android 二进制
  • 使用 adb 拷贝到设备并测试运行
  • 针对不同 Android 版本选择合适的 NDK 和 API Level
支付宝打赏 微信打赏

赞赏是不耍流氓的鼓励

评论系统未开启,无法评论!

-->