用纯Golang开发Android与IOS应用

Golang1.4就对Android开发做了些支持,1.5版本前几天好像发布了,特意看了整理下,1.5支持32位与64位的android与IOS应用开发了,当然还不是很好用,听说性能比Java做的程序超出很多,Native就不用说了,但也没有实践压测所也不敢确定,这里只整理下基本流程:

环境搭建

  1. 安装 golang 1.5, 设置 GOROOT,GOPATH 环境变量。

    简单说明:Golang 1.5 提供了两个内核支持,darwin/arm 和 darwin/arm64.,Golang mobile并不是go1.5软件包里面的一部分,但是基于内核,必须安装Golang1.5以上。

  2. 安装gomobile

    1
    go get golang.org/x/mobile/cmd/gomobile
  3. 安装android(apk)编译工具,(如果仅开发IOS则可省略这一步,但要有XCode支持)

    1
    gomobile init
  1. 大功告成,说明一下,安装gomobile的时候,貌似把golang.org/x/mobile下的库都一并安装了,如果发现没有安装,可以手动安装,或者安装一个demo实例 golang.org/x/mobile/example/basic ,会自动安装一般所需要的库。如下,看名字就大概明白功能,不做多说
说明
app Package app lets you write portable all-Go apps for Android and iOS.
app/internal/apptest Package apptest provides utilities for testing an app.
app/internal/testapp Small test app used by app/app_test.go.
asset Package asset provides access to application-bundled assets.
bind Package bind implements a code generator for gobind.
bind/java Package java implements the Java language bindings.
bind/java/testpkg Package testpkg contains bound functions for testing the cgo-JNI interface.
bind/objc Package objc implements the Objective-C language bindings.
bind/objc/testpkg
bind/objc/testpkg/go_testpkg Package go_testpkg is an autogenerated binder stub for package testpkg.
bind/seq Package seq implements the machine-dependent seq serialization format.
cmd/gobind Gobind generates language bindings that make it possible to call Go functions from Java and Objective-C.
cmd/gomobile Gomobile is a tool for building and running mobile apps written in Go.
event/key Package key defines an event for physical keyboard keys.
event/lifecycle Package lifecycle defines an event for an app’s lifecycle.
event/mouse Package mouse defines an event for mouse input.
event/paint Package paint defines an event for the app being ready to paint.
event/size Package size defines an event for the dimensions, physical resolution and orientation of the app’s window.
event/touch Package touch defines an event for touch input.
example/audio An app that makes a sound as the gopher hits the walls of the screen.
example/basic An app that draws a green triangle on a red background.
example/bind/hello Package hello is a trivial package for gomobile bind example.
example/network An app that paints green if golang.org is reachable when the app first starts, or red otherwise.
example/sprite An app that demonstrates the sprite package.
exp/app/debug Package debug provides GL-based debugging tools for apps.
exp/audio Package audio provides a basic audio player.
exp/audio/al Package al provides OpenAL Soft bindings for Go.
exp/f32 Package f32 implements some linear algebra and GL helpers for float32s.
exp/font Package font provides platform independent access to system fonts.
exp/gl/glutil Package glutil implements OpenGL utility functions.
exp/sensor Package sensor provides sensor events from various movement sensors.
exp/sprite Package sprite provides a 2D scene graph for rendering and animation.
exp/sprite/clock Package clock provides a clock and time functions for a sprite engine.
exp/sprite/glsprite Package glsprite implements a sprite Engine using OpenGL ES 2.
exp/sprite/portable Package portable implements a sprite Engine using the image package.
geom Package geom defines a two-dimensional coordinate system.
gl Package gl implements Go bindings for OpenGL ES 2.
internal/loader
internal/mobileinit Package mobileinit contains common initialization logic for mobile platforms that is relevant to both all-Go apps and gobind-based apps.

使用说明

  1. 很简单,除了init安装与version看版本外,仅三个命令

    • bind : 构造一个共享库提供给android/ios应用程序使用,使用bind会生成一个静态文件可以引入到android/ios项目中,通过java/oc等调用。
    • build : 将代码打包成apk或ios app
    • install : 直接在android设备上运行,需要机器自带adb连接程序。
  2. 编写代码,代码一定要在 GOPATH/src下,可以参考官方的DEMO,有必要说的是,现在由于没有什么好的工具或框架,只能通过自己实现界面输出,基于OpenGL去绘制显示页面。不熟悉OpenGL的同学可以等一等,有什么好用的库或像Java一样的MVC布局框架出来,当然你致力于OpenGL开发就另说了,OpenGL的API本身并不算太复杂,也是很费时,最难搞的是数学要牛B。

  3. 或者你可以把业务实现用Golang实现,封装成so文件,给java/oc等去调用。这样也可以共用一套业务逻辑代码。比如本项目可以这样编译:

    1
    2
    3
    4
    5
    6
    //获取项目
    go get github/ada87/goap
    //在windows切换到D盘(API保存位置)
    d:
    //编译成APK(使用gomobile 可以直接安装到手机上)
    gomobile build github.com/ada87/goap

    那么d盘就会生成一个goap.apk安装文件(也可以通过参数设置路径),可以弄到手机上安装看效果,如果电脑开了虚拟机或连了手机也可以直接使用gomobile install命令直接安装到设备上。

  4. 基本都可以了,只是现在我用的LiteIDE还不能编译Gomobile项目,只能通过命令行编译了~所以非常不方便,希望快速发展敢快成熟起来吧。

  5. 如果想编译IOS应用,或做so工具包,详情还是请参照官方文档或gomobile help,就不多说了。

问题

当然使用起来顺利就好,不顺利的话,可能会是以下问题:

  1. 提示GCC未安装时,可以下载一个WinGW,这里给个64位的下载地址,32位的也可以去上级目录去找。下载完成后,把 mingw64/bin的路径配置到环境变量 path 里面去即可。本人早就装了所以没有这个问题
  2. 如果要使用gomobile install命令直接将APK安装到手机上的话(android用户,本人不玩苹果不讨论),要下载一个ADB.并将ADB的目录也配置到环境变量里面去.
  3. 本人遇到的问题:本人用的国产某手机不知为何adb devices发现不了,很是不爽(使用91,豌豆夹都可以,但本人最讨厌此类软件存在于电脑上)。可能有两个原因:
    • 网上下载的adb大都是1.0.26的(adb version),可以用1.0.32代替。本站ADB 1.0.32 本站下载
    • 某些手机厂商篡改了连接驱动。本人的手机就是如此,辛亏连接后,有个连接方式为(使用内置光盘),使用这个连接方式,然后打开后就可以看到电脑上多了个驱动盘,在电脑设备管理器上看到有个感叹号的adb什么的,更新驱动,手动定位到驱动盘更新,就OK了。