go.mobileを動かしてみた。

go.mobileパッケージを利用してみたので、環境構築などのメモを書きました。

# Go 1.4でAndroidをサポートすることに。
私はGoとAndroidは相性が悪いので入らないだろうと思っていたのですが、Go1.4で入れてきました。
そこで、動作確認をしたところしっかり動作して、Nexus 5上にDeployもできたので記事を書いておこうと思います。

## 環境構築からデプロイまでの手順
詳細を飛ばしたい方は手順を見て進めて下さい。ちなみに確認した環境はMacOSX 10.9.5です。

1. go get code.google.com/p/go.mobile
    2. (2014/11/22追記) 公式サブパッケージが変更になる関係でgolang.org/x/mobileというリポジトリに変わります。
    3. (2014/11/22追記) go get golang.org/x/mobile でも可能です。
    4. (2014/11/22追記) 2015年6月からはgolang.org/x/...を使って下さい。
1. android-sdkのbuild-toolのバージョンを確認（19.1.0以上でないとコンパイルできない）
    1. AndroidStudioのインストール(http://developer.android.com/sdk/installing/studio.html)
    1. コマンドのみで動かすならこれは不要
    2. SDKは必要なので、SDKはインストールしておいて下さい。（2014/11/04追記）
1. Android NDKのインストール
    1. http://developer.android.com/tools/sdk/ndk/index.html#Installing
1. NDK ROOTの登録
    1. export NDK_ROOT=$HOME/android-ndks/android-ndk-r10c
1. NDKのツールの設定
    1. android-ndk-r10c/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=$NDK_ROOT
1. Goのコンパイル（Android用のコンパイラのビルド）
    1. CC_FOR_TARGET=$HOME/android-ndks/android-ndk-r10c/bin/arm-linux-androideabi-gcc-4.6 GOOS=android GOARCH=arm GOARM=7 ./make.bash
1. antのパスを通すか、インストール
1. Nexus 5を接続する。
1. プロジェクトのディレクトリに移動
1. all.bashを実行

## 詳細について
### go.mobileパッケージが作られた

```bash: コマンド
$ go get code.google.com/p/go.mobile
```

準公式パッケージなので、go.mobileとなっています。現時点ではAndroidだけのようですが、そのうち…？ということにはならないだろうと思っています。

### Android SDKのbuild-toolのバージョンを確認。
更新をサボっていたので19.0.3だったのですが、go.mobileが動作するバージョンは19.1.0以上なので、現時点の最新のバージョンをインストールすれば問題ありません。

### Android NDKのインストール
go.mobileはAndroid NDKとして動作するようなので、Android NDKをダウンロードします。
インストール手順は公式サイトを参考にしてください。
http://developer.android.com/tools/sdk/ndk/index.html#Installing

### 環境変数NDK_ROOTの登録
必須ではないですが、以降で長いコマンドを入力するので登録しておいた方がいいと思います。

```bash: コマンド
$ export NDK_ROOT=$HOME/android-ndks/android-ndk-r10c
```

### NDKツールの設定

``` bash: コマンド
$ android-ndk-r10c/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=$NDK_ROOT
```

### Goのコンパイル
現時点でAndroid用Goのバイナリはありませんので、ソースからコンパイルします。

```bash: コマンド
$ cd [Goのclone先ディレクトリ]
$ cd src
$ CC_FOR_TARGET=$HOME/android-ndks/android-ndk-r10c/bin/arm-linux-androideabi-gcc-4.6 GOOS=android GOARCH=arm GOARM=7 ./make.bash
```

※CC_FOR_TARGETはmake-standalone-toolchain.sh実行時のtoolchainをログから確認してください。ツール設定時にたくさん生成されるみたいです。

### antの準備
すでにあるantコマンドを使ってもいいと思いますが、面倒だったのでhomebrewでインストールしました。すでにあるものを使う場合はパスを通せば大丈夫です。

```bash: コマンド
$ brew install ant
```

### Nexus 5を接続する。
デプロイの前に実機を接続するか、エミュレータを起動しておいてください。

### HelloWorldアプリのデプロイ

```bash: コマンド
$ cd code.google.com/p/go.mobile/example/libhello
$ ANDROID_HOME=$HOME/android-sdks ./all.bash
```

### 画面の確認
![hello.png](https://qiita-image-store.s3.amazonaws.com/0/11925/3dd89ebe-391c-f4b0-c7f6-a6acbdfee2ae.png)


### ログの確認

```text: ログ
D/dalvikvm(14271): Trying to load lib /data/app-lib/com.example.hello-1/libgojni.so 0x42673e80
W/linker  (14271): libgojni.so has text relocations. This is wasting memory and is a security risk. Please fix.
D/dalvikvm(14271): Added shared lib /data/app-lib/com.example.hello-1/libgojni.so 0x42673e80
I/HotwordRecognitionRnr(  587): Hotword detection finished
I/HotwordRecognitionRnr(  587): Stopping hotword detection.
I/Go      (14271): app.Run
I/go/Seq  (14271): loaded go/Seq
I/Go      (14271): Runtime started
I/GoStdio (14271): Hello, world!
```

### ついでにbasicアプリもデプロイ

```bash: コマンド
$ go get code.google.com/p/freetype-go/freetype
$ cd code.google.com/p/go.mobile/example/basic
$ PATH=$PATH:$HOME/android-ndks/android-ndk-r10c ANDROID_HOME=$HOME/android-sdks ./all.bash
```

freetypeパッケージが含まれていないとコンパイルエラーになるので、あらかじめ、go getをしておいて下さい。（2014/11/04追記。 @kwmt@githubさんありがとうございます。）
 
### 画面の確認
目が痛い…。でも、三角形が指の動きについてくる様子が確認できます。思ったよりも軽い。

![basic.png](https://qiita-image-store.s3.amazonaws.com/0/11925/de307100-e5cb-3e38-a342-b7d0f7f8ef77.png)

## AndroidでのGoの今後
Native周りがC++からGoに置き換えることができれば、端末ごとの差異が減るのかな？と思ったりしています。ゲームなどのスピードが必要なものはどうしてもNativeで動かす必要があるのだと思っていますので、このgo.mobileの開発が進んである程度安定してきたら、NDKの利用もまた増えるのかな？なんて思っています。

## 結論
今の仕事で使うことは、定年過ぎないとないかな…ｗ