使用Docker在移动设备上构建Go Mobile应用.
首先
从 Go 1.4 开始,可以从 Go 代码构建适用于 Android 的二进制文件,但构建过程复杂繁琐。阅读 README 文件后,发现可以使用 Docker 进行构建,因此尝试了一下。
步骤
以下是在OS X上的步骤。假设已经预先安装了go、boot2docker和docker。
请使用 go get 工具获取 golang.org/x/mobile 和 freetype。
$ go get golang.org/x/mobile
$ go get code.google.com/p/freetype-go/freetype
从 Docker Hub 上拉取 golang/mobile 存储库,以 bash 进入。同时,在容器中将 $GOPATH/src 挂载到 /src。
$ docker run -it -v $GOPATH/src:/src golang/mobile /bin/bash
当Docker运行成功后,您可以在容器内使用bash,在样例目录中执行make.bash。
root@a418b5149537:/src/golang.org/x/mobile# cd example/basic/
root@a418b5149537:/src/golang.org/x/mobile/example/basic# ./make.bash
[armeabi] Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
[armeabi] Gdbsetup : libs/armeabi/gdb.setup
[armeabi] Prebuilt : libbasic.so <= jni/armeabi/
[armeabi] Install : libbasic.so => libs/armeabi/libbasic.so
Buildfile: /src/golang.org/x/mobile/example/basic/build.xml
:
(略)
:
BUILD SUCCESSFUL
Total time: 4 seconds
如果Ant正常结束,应该在bin文件夹下生成了apk。
root@a418b5149537:/src/golang.org/x/mobile/example/basic# exit
exit
$ cd $GOPATH/src/golang.org/x/mobile/example/basic/bin
$ ls -al
total 3648
drwxr-xr-x 13 kn1kn1 staff 442 1 30 12:37 .
drwxr-xr-x 15 kn1kn1 staff 510 1 30 12:37 ..
-rw-r--r-- 1 kn1kn1 staff 856 1 30 12:37 AndroidManifest.xml
-rw-r--r-- 1 kn1kn1 staff 128 1 30 12:37 AndroidManifest.xml.d
-rw-r--r-- 1 kn1kn1 staff 179 1 30 12:37 build.prop
-rw-r--r-- 1 kn1kn1 staff 919637 1 30 12:37 nativeactivity-debug-unaligned.apk
-rw-r--r-- 1 kn1kn1 staff 276 1 30 12:37 nativeactivity-debug-unaligned.apk.d
-rw-r--r-- 1 kn1kn1 staff 919637 1 30 12:37 nativeactivity-debug.apk
-rw-r--r-- 1 kn1kn1 staff 807 1 30 12:37 nativeactivity.ap_
-rw-r--r-- 1 kn1kn1 staff 132 1 30 12:37 nativeactivity.ap_.d
drwxr-xr-x 2 kn1kn1 staff 68 1 30 12:37 res
drwxr-xr-x 2 kn1kn1 staff 68 1 30 12:37 rsLibs
drwxr-xr-x 2 kn1kn1 staff 68 1 30 12:37 rsObj
一旦熟悉后,按照README中的方法,不需要通过bash进入程序了。
$ docker run -v $GOPATH/src:/src golang/mobile /bin/bash -c 'cd /src/your/project && ./make.bash'
也许可以。
另外,在golang.org/x/mobile上也有Dockerfile,所以可能不需要pull,直接进行build也可以。