安卓交差编译
Go 程序交叉编译到 Android ARMv7 的完整指南(NDK r29 + adb 测试)
在本文中,我们将完整讲解如何在 Linux 主机上使用 Go + Android NDK r29,将 Go 程序编译为 Android ARMv7 可执行文件,并通过 adb 拷贝到设备运行。
一、下载和安装 Android NDK
1️⃣ 官方下载地址
- 官方 NDK 下载页面:https://developer.android.com/ndk/downloads
你可以根据操作系统选择 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 位 ARMGOARM=7→ ARMv7CGO_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
✅ 如果输出正常,说明交叉编译成功
五、注意事项
NDK r29 最小支持 API 21
- Android 4.x 设备无法运行用 r29 编译的二进制
- 低版本设备需使用旧 NDK(r21 或 r19)
选择不同 API Level 的 clang
- 可替换
armv7a-linux-androideabi21-clang为 22/23/24 等版本 - 确保兼容目标设备
- 可替换
检查二进制类型
file edge-openapi-collector-armv7
输出示例:
ELF 32-bit LSB executable, ARM, EABI5, dynamically linked (Android)
- 执行报错处理
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
赏
支付宝打赏
微信打赏
支付宝打赏
微信打赏
赞赏是不耍流氓的鼓励
评论系统未开启,无法评论!