go.mobileを動かしてみた。

More than 3 years have passed since last update.

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


    1. (2014/11/22追記) 公式サブパッケージが変更になる関係でgolang.org/x/mobileというリポジトリに変わります。

    2. (2014/11/22追記) go get golang.org/x/mobile でも可能です。

    3. (2014/11/22追記) 2015年6月からはgolang.org/x/...を使って下さい。



  2. android-sdkのbuild-toolのバージョンを確認(19.1.0以上でないとコンパイルできない)


    1. AndroidStudioのインストール(http://developer.android.com/sdk/installing/studio.html)

    2. コマンドのみで動かすならこれは不要

    3. SDKは必要なので、SDKはインストールしておいて下さい。(2014/11/04追記)



  3. Android NDKのインストール


    1. http://developer.android.com/tools/sdk/ndk/index.html#Installing



  4. NDK ROOTの登録


    1. export NDK_ROOT=$HOME/android-ndks/android-ndk-r10c



  5. NDKのツールの設定


    1. android-ndk-r10c/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=$NDK_ROOT



  6. 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



  7. antのパスを通すか、インストール

  8. Nexus 5を接続する。

  9. プロジェクトのディレクトリに移動

  10. 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


ログの確認

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


AndroidでのGoの今後

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


結論

今の仕事で使うことは、定年過ぎないとないかな…w