Go on Mobile
GopherCon 2015
Hana Kim
GopherCon 2015
Hana Kim
A video of this talk was recorded at GopherCon in Denver.
2The Go Mobile project is experimental. Use this at your own risk.
While we are working hard to improve it, neither Google nor the Go
team can provide end-user support.
Mobile support was frequently requested
Some users built their own Go binaries for Android with cgo + external linking through NDK tool chains
Some Android Apps used Go even before Go 1.4
Goal: Bring Go to Mobile Platforms
Why?
Native Apps
SDK Apps
Work for Android, iOS, and Desktop environments
Provide a rich set of APIs
Follow idiomatic Go style
8
This program uses the packages from golang.org/x/mobile repo
There is no Java or Objective-C or C in my code
golang.org/x/mobile/...
golang.org/x/mobile/exp/...
10Dealing with
GOOS/GOARCH
combosThat is not fun!
11$ go get golang.org/x/mobile/cmd/gomobile
Simplifies toolchain installation and app deployment
To install the Android/iOS compiler tool chain:
$ gomobile init
To build an Android APK and an iOS app
$ gomobile -target=android build $ gomobile -target=ios build
(Demo)
12Go 1.5 can build Go programs as a library that can be used by non-Go programs
-buildmode=c-shared
)-buildmode=c-archive
)
Functions marked with //export
cgo annotations are callable.
Manually mapping data structures and functions between languages is tedious and error-prone!
15$ go get golang.org/x/mobile/cmd/gobind
Automates language binding through code generation
Defines the language binding from exported Go APIs; no explicit annotation
Currently supports a subset of Go types
16Go API
package mypkg func Hello() (string, error) { return "Gopher", nil }
Generated Java API
public abstract class Mypkg { public static String Hello() throws Exception { ... } }
Generated Objective-C API
FOUNDATION_EXPORT BOOL GoMypkgHello(NSString** ret0_, NSError** error);
package mypkg type Counter struct { Value int64 } func (c *Counter) Inc() { c.Value++ } func NewCounter() *Counter { return &Counter{} }
public abstract class Mypkg { public static final class Counter { public void Inc() { ... } public long GetValue() { ... } public void SetValue(long value) { ... } } public static Counter NewCounter() { ... } }
Use it from Java
Counter counter = NewCounter(); counter.SetValue(12345); counter.Inc();
@interface GoMypkgCounter : NSObject { } @property(strong, readonly) GoSeqRef *ref; - (int64_t)Value; - (void)setValue:(int64_t)v; - (void)Inc; @end FOUNDATION_EXPORT GoMypkgCounter* GoMypkgNewCounter();
Use it from Objective-C
GoMypkgCounter* counter = GoMypkgNewCounter(); [counter setValue:12345]; [counter Inc];
Simplifies the build process. For example, for Android,
.aar
file (modern way to distribute android libraries)(DEMO)
iOS support is a work in progress.
22
Android Studio 1.2+ supports .aar
import.
To update the .aar,
gomobile
bind
, orgomobile
bind
and publish the outputThe Ivy is a command line tool developed by Rob Pike
It's a useful desktop calculator that handles big int, rational and floating-point numbers, vectors, matrices, ...
It is in fact an interpreter for an APL-like language
24~5k lines of Go code (not including tests, docs)
Dependency on math
, math/big
, math/rand
, unicode
, ...
Rewriting in Java or Objective-C is a non-starter
25Write it once as a library in Go
Enjoy great language features and packages available in Go
27Released in December 2014
Can build Android apps (arm
)
Android builder
The gobind
tool for Java and Go language binding
Packages for cross-device apps: basic app control, OpenGL ES 2, touch
29Planned release early August 2015
Experimental support for iOS (arm,arm64
)
iOS builder
30Can call Go functions from foreign language in a clean way
31
golang.org/x/mobile
repo getting better
gomobile
tool for mobile app/library buildgobind
tool: Objective-C bindinggolang.org/x/mobile/exp
: experimenting with audio, sensor, sprite, ...gobind
GopherCon 2015
Hana Kim