私もGo 1.4でAndroidアプリを動かしてみた！（自分用メモ）

# はじめに

久々に[パッケージのサイト]
(https://github.com/golang/mobile)を見ると、Dockerfileが用意されたようですが...(^^;)

以下の記事を参考にして、自分でもGo 1.4にmobileパッケージを追加してmobileパッケージ内のAndroidサンプルアプリケーションを動作させてみました。

* [go.mobileを動かしてみた。](http://qiita.com/ttyokoyama/items/07729cfb03ef053ef669)
* [go.mobile を使った Android 開発のまとめ](http://qiita.com/hkurokawa/items/9315162c61830befc547)

# 注意事項

mobileパッケージのサンプルアプリケーションはAndroid 4.4 (API 19)以上が対象のようです。

```XML:抜粋：$GOPATH/src/golang.org/x/mobile/example/*/build.xml
<property name="target" value="android-19" />
```

Nexus 5 + Android 5.0の環境で動作させてエラーになる場合は、以下の記事を参考にして「$GOROOT/src/runtime/malloc.c」ファイルを修正して下さい。

[Go on Android Lollipop crashes with ENOMEM - Google グループ](https://groups.google.com/forum/#!topic/golang-dev/NB6jPV9gddQ)

# 環境情報

今回使用した私の環境情報は以下の通りです。

## 開発環境

* Mac OS X 10.8.5
* Go 1.4.1（[公式サイトtar.gz版](http://golang.org/dl/#go1.4.1)：go1.4.1.darwin-amd64-osx10.8.tar.gz）
* Android NDK r10d

## Android Studio

* Android Studio 1.0.1
	* Java SE Development Kit 7u71

## エミュレーター

* android-sdk_r24.0.2
	* Android 4.4 (API 19)

## 実機

* Nexus 7 (2013)
	* Android 4.4.4

# セットアップ

## Android NDK

「[Downloads](http://developer.android.com/tools/sdk/ndk/index.html#Downloads)」から該当するファイルを選択してダウンロードします。

今回は「android-ndk-r10d-darwin-x86_64.bin」です。

「[Installing the SDK](http://developer.android.com/tools/sdk/ndk/index.html#Installing)」を参考にしてダウンロードしたファイルを展開します。

```bash:
$ cd $HOME/Downloads
$ chmod a+x android-ndk-r10d-darwin-x86_64.bin
$ ./android-ndk-r10d-darwin-x86_64.bin
```

展開された「android-ndk-r10d」ディレクトリーを任意の場所に移動します。

```bash:
$ mv android-ndk-r10d/ $HOME/app/
```

移動先を環境変数「NDK_ROOT」として設定します。

```bash:
$ export NDK_ROOT=$HOME/app/android-ndk-r10d
```

展開されたディレクトリー内の「make-standalone-toolchain.sh」を実行してツールチェーンを作成します。バージョンr10dから「--toolchain=arm-linux-androideabi-4.6」オプションの指定が必要になっているようです。

```bash:
$ cd $NDK_ROOT/build/tools/
$ ./make-standalone-toolchain.sh --platform=android-9 --install-dir=$NDK_ROOT --toolchain=arm-linux-androideabi-4.6 --ndk-dir=$NDK_ROOT --system=darwin-x86_64
```

## mobileパッケージ

`go get`コマンドにてmobileパッケージをインストールします。

```bash:
$ cd $GOPATH/src
$ go get -d golang.org/x/mobile/...
```

## Goのリコンパイル

ARM版Androidに対応させるためにGoをリコンパイルします。

```bash:
$ cd $GOROOT/src
$ CC_FOR_TARGET=$NDK_ROOT/bin/arm-linux-androideabi-gcc-4.6 GOOS=android GOARCH=arm GOARM=7 ./make.bash
```

# Android端末の準備

実機で動作させる方法とエミュレーターで動作させる方法があります。

## 実機で動作させる場合

パソコンと実機をUSBケーブルで接続した後、実機にて「設定」-「開発者向けオプション」-「USBデバッグ」を有効にします。

## エミュレーターで動作させる場合

SDK Toolsを使う方法とAndroid Studioを使う方法があります。

### Stand-alone SDK Toolsの場合

#### インストール

「[Other Download Options](http://developer.android.com/sdk/index.html#Other)」-「SDK Tools Only」にて、SDK Toolsをダウンロードします。

今回は「android-sdk_r24.0.2-macosx.zip」です。

ダウンロードしたzipファイルを展開します。

```bash:
$ cd $HOME/Downloads
$ unzip android-sdk_r24.0.2-macosx.zip
```

展開した「android-sdk-macosx」ディレクトリーを任意の場所に移動します。

```bash:
$ mv android-sdk-macosx/ $HOME/app/
```

移動先を環境変数「ANDROID_HOME」として設定します。

```bash:
$ export ANDROID_HOME=$HOME/app/android-sdk-macosx/
```

#### SDKパッケージの追加

「[Adding SDK Packages](http://developer.android.com/sdk/installing/adding-packages.html)」に従って、SDKパッケージを追加インストールします。

Android SDK Managerを起動します。

```bash:
$ cd $ANDROID_HOME/tools
$ ./android sdk
```

一覧にて、以下の4項目のみを選択した状態（右下のボタン名が「Install 4 Packages…」になっている状態）にしてインストールします。

* Tools
	* Android SDK Platform-tools
	* Android SDK Build-tools (最新バージョン)
* Android 4.4.2 (API 19)
	* SDK Platform
	* ARM EABI v7a System Image

必要に応じて、以下の2項目をインストールします。

* Extras
	* Android Support Repository
	* Android Support Library

### Android Studioの場合

#### インストール

「[Other Download Options](http://developer.android.com/sdk/index.html#Other)」-「All Android Studio Packages」にて、Android Studioをダウンロードします。

今回は「android-studio-ide-1641136.dmg」です。

ダウンロードしたdmgファイルをダブルクリックすると、デスクトップ上に「Android Studio 1.0.1」がマウントされて中身のディレクトリーが表示されます。

表示されたディレクトリー内にて、「Android Studio」アイコンを隣の「Applications」アイコンにドラッグ＆ドロップしてインストールします。

環境変数「ANDROID_HOME」を設定します。

```bash:
$ export ANDROID_HOME=$HOME/Library/Android/sdk
```

#### SDKパッケージの追加

「[Adding SDK Packages](http://developer.android.com/sdk/installing/adding-packages.html)」に従って、SDKパッケージを追加インストールします。

Android SDK Managerを起動します。

```bash:
$ cd $ANDROID_HOME/tools
$ ./android sdk
```

一覧にて、以下の2項目のみを選択した状態（右下のボタン名が「Install 2 Packages…」になっている状態）にしてインストールします。

* Android 4.4.2 (API 19)
	* SDK Platform
	* ARM EABI v7a System Image

必要に応じて、以下の1項目をインストールします。

* Extras
	* Android Support Library

## Android AVD

Android Virtual Deviceを起動します。

```bash:
$ cd $ANDROID_HOME/tools
$ ./android avd
```

「Create…」ボタンをクリックした後、仮想デバイスを作成します。

表は「Nexus 7」を想定した設定例です。「AVD Name」は各自で好きな名称を入力して下さい。

| 項目名             | 設定値                               |
|:------------------|:------------------------------------|
| AVD Name          | Nexus_7                             |
| Device            | Nexus 7 (7.02", 1200 x 1920: xhdpi) |
| Target            | Android 4.4.2 - API Level 19        |
| CPU/ABI           | ARM (armeabi-v7a)                   |
| Keybord           | ■ Hardware keyboard present         |
| Skin              | No skin                             |
| Front Camera      | Emulated                            |
| Back Camera       | Emulated                            |
| Memory Options    | RAM: 2048 VM Heap: 64               |
| Internal Storage  | 200 MiB                             |
| SD Card           | ● Size: 200 MiB                     |
| Emulation Options | □ Snapshot ■ Use Host GPU           |

一覧から作成した仮想デバイスを選択した後、「Start…」ボタンをクリックして起動します。

# サンプルアプリケーションの実行

`adb`コマンドを使用するため、パスを設定します。

```bash:
$ export PATH=$PATH:$ANDROID_HOME/platform-tools
```

## example/libhelloアプリケーション

アプリケーションを実行します。

```bash:
$ cd $GOPATH/src/golang.org/x/mobile/example/libhello
$ ./all.bash 
```

## example/basicアプリケーション

FreeTypeをGoで使うためのパッケージをインストールします。

```bash:
$ cd $GOPATH/src
$ go get code.google.com/p/freetype-go/freetype
```

`ndk-build`コマンドを使用するため、パスを設定します。

```bash:
$ export PATH=$PATH:$NDK_ROOT
```

アプリケーションを実行します。

```bash:
$ cd $GOPATH/src/golang.org/x/mobile/example/basic
$ ./all.bash
```

# さいごに

Goの活躍場所に「モバイル」という新しいジャンルが加わったのは嬉しいですね！q@w@p

「私もGoでAndroidしよう！」という方は、一度、David Crawshawさんの資料に目を通しておくことをオススメします。

* [Go on Android](http://talks.golang.org/2014/gothamgo-android.slide#1)
* [Go support for Android](https://docs.google.com/document/d/1N3XyVkAP8nmWjASz8L_OjjnjVKxgeVBjIsTr5qIUcA4/edit?pli=1)

***

[2015.02.14]

* make-standalone-toolchain.shの引数を追加
* golang.org/x/mobile/の指定を修正