Golang で Android 上で動く CLI コマンドを作成する (go build)

何をするか?

Golang(Go 言語)のクロスコンパイル機能を使うと、Android 上で動作するコマンドラインツール (CLI) を簡単に作成することができます。 Android 端末上で何らかの解析をするときに、Android 組み込みの Linux コマンドだとちょっと足りないな、といったときに便利です。 ここでは、Golang で簡単な Hello World アプリをビルドして、Android 端末上で動かしてみます。

Android 端末の CPU アーキテクチャを確認しておく

Golang でのクロスコンパイル時に CPU アーキテクチャを指定する必要があるので、対象の Anrdoid 端末のアーキテクチャを先に確認しておきます。 adb shell で Android 端末にシェル接続して、uname -a コマンドの末尾あたりで確認してしまうのが手っ取り早いです。

$ adb shell uname -a
Linux localhost 5.10.100 #1 SMP PREEMPT Thu Mar 17 17:10:36 UTC 2022 aarch64

armaarch という文字列が入っていたら、ARM アーキテクチャの CPU だと思ってよいです。

Golang プログラムをビルドする

下記は、Golang の Hello World プログラムです。

hello.go
package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

Android 端末上で動く実行ファイルを生成するために、GOOS 環境変数で linuxGOARCH 環境変数で arm を指定してビルドします。 ちなみに、エミュレーター用にビルドするのであれば、おそらくアーキテクチャの指定は必要ないです。

Anrdoid 用にビルド(Linux/macOS の場合)
$ GOOS=linux GOARCH=arm go build -o hello hello.go
Anrdoid 用にビルド(Windows の場合)
> set GOOS=linux
> set GOARCH=arm
> go build -o hello hello.go

これで、実行ファイル hello が生成されます。

Android 端末上で実行ファイルを起動する

作成した実行ファイル (hello) を adb push で Android 端末に転送し、Android 端末上で実行してみます。 転送先ディレクトリとしては、アクセス制限の緩い /data/local/tmp を使います。

# hello を転送する
$ adb push hello /data/local/tmp

# hello を実行する
$ adb shell chmod +x /data/local/tmp/hello
$ adb shell /data/local/tmp/hello
Hello World

うまく動きました ٩(๑❛ᴗ❛๑)۶ わーぃ