Golang教程:编译可在Android设备上运行的Go语言程序 | Konica 的自留地

Golang教程:编译可在Android设备上运行的Go语言程序

闹钟, 咖啡杯, 时间, 唤起, 时间显示, 醒来, 响钟, 吃早餐, 早上好, 时钟时间, 站起来, 上午

前言

Golang 支持的平台非常多, 运行go tool dist list查看已支持的所有平台
我用的Golang版本为1.8.3,支持以下 Android 平台

android/386
android/amd64
android/arm
android/arm64

现在的Android手机使用的CPU架构基本都是 arm(32位元)/arm64(aarch64)(64位元), 少数Android设备是基于AMD

编译可在Android设备上运行的Go语言程序

1. 配置 Android NDK

系统自带的gcc、clang等编译器都不支持Android平台,我们需要安装 Android NDK
如果 Android NDK 网址打不开,请挂上vpn,或百度搜索 Android NDK 下载

注意: 请不要使用 15c 版本, 可能会存在bug导致编译失败!

安装完后需要设置 android-ndk 安装目录的环境变量 $ANDROID_NDK_ROOT
我的 NDK 是通过 Android Studio 安装的,所以我的 $ANDROID_NKD_ROOT 设置为

export ANDROID_NDK_ROOT=/Users/apple/Library/Android/sdk/ndk-bundle

2. 安装 CC 编译器

按需安装 Android 独立工具链
Android 独立工具链安装目录统一为 $ANDROID_NDK_ROOT/bin

1
2
3
4
5
6
7
8
9
10
11
# android/arm
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-16 --install-dir=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/ --arch=arm
# android/arm64
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-21 --install-dir=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/ --arch=arm64
# android/386
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-16 --install-dir=$ANDROID_NDK_ROOT/bin/i686-linux-android/ --arch=x86
# android/amd64
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-21 --install-dir=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/ --arch=x86_64

如果报错找不到 make-standalone-toolchain.sh ,说明你的 android-ndk 版本已经移除了 make-standalone-toolchain.sh 脚本,
新版本的 Android NDK 中,添加了独立工具链的 Python 实现:build/tools/make_standalone_toolchain.py

确保你的设备安装了 Python

1
2
3
4
5
6
7
8
9
10
11
# android/arm
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=16 --install-dir=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/ --arch=arm
# android/arm64
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=21 --install-dir=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/ --arch=arm64
# android/386
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=16 --install-dir=$ANDROID_NDK_ROOT/bin/i686-linux-android/ --arch=x86
# android/amd64
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=21 --install-dir=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/ --arch=x86_64

安装完成Android 独立工具链,CC 编译器的位置分别为

  1. android/arm
    CC=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/bin/arm-linux-androideabi-gcc

  2. android/arm64
    CC=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/bin/aarch64-linux-android-gcc

  3. android/386
    CC=$ANDROID_NDK_ROOT/bin/i686-linux-android/bin/i686-linux-android-gcc

  4. android/amd64
    CC=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/bin/x86_64-linux-android-gcc

3. 编译Android的Go语言程序

需要指定 CC 编译器的位置

1
2
3
4
5
6
7
8
9
10
11
# android/arm
CC=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/bin/arm-linux-androideabi-gcc GOOS="android" GOARCH="arm" CGO_ENABLED="1" go build
# android/arm64
CC=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/bin/aarch64-linux-android-gcc GOOS="android" GOARCH="arm64" CGO_ENABLED="1" go build
# android/386
CC=$ANDROID_NDK_ROOT/bin/i686-linux-android/bin/i686-linux-android-gcc GOOS="android" GOARCH="386" CGO_ENABLED="1" go build
# android/amd64
CC=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/bin/x86_64-linux-android-gcc GOOS="android" GOARCH="amd64" CGO_ENABLED="1" go build

不出意外的话,编译成功,生成可执行二进制程序。
将程序传入你的Android手机,使用 终端模拟器/Termux 之类的apk软件运行。