blob: 128c804709e7d54ffc1915d756a44d8df0a48329 [file] [log] [blame]
Go on Mobile
GopherCon 2015
Hana Kim
Google
* Video
A video of this talk was recorded at GopherCon in Denver.
.link https://www.youtube.com/watch?v=sQ6-HyPxHKg Watch the talk on YouTube
* Caution
.image gophercon-go-on-mobile/caution.png 300 _
The 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.
* Background
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
- Camlistore android app (out-of-process model)
- Goandroid+Mandala (in-process model)
- ...
* golang.org/x/mobile
Goal: Bring Go to Mobile Platforms
Why?
- Use Go to program a complete system (server/client)
- Write a single cross-platform Go library
- Bring a simple language and development tooling to mobile
* Two ways of using Go
Native Apps
- Write the whole app in Go
- Use Go packages for graphics, event handling, audio, etc.
SDK Apps
- Write Android UI in Java, iOS UI in Objective-C/Swift
- Write common functionality in Go as a library
* Native Apps
* Challenge #1: Cross-platform APIs
Work for Android, iOS, and Desktop environments
Provide a rich set of APIs
Follow idiomatic Go style
* Demo: Hello, Gopher!
.image gophercon-go-on-mobile/gophercloud.png 400 _
This program uses the packages from golang.org/x/mobile repo
There is no Java or Objective-C or C in my code
* What's available?
golang.org/x/mobile/...
- [[https://pkg.go.dev/golang.org/x/mobile/app][app: App control]]
- [[https://pkg.go.dev/golang.org/x/mobile/asset][asset: Asset management]]
- [[https://pkg.go.dev/golang.org/x/mobile/gl][gl: OpenGL ES 2]]
- [[https://pkg.go.dev/golang.org/x/mobile/event][event: Events]]
- [[https://pkg.go.dev/golang.org/x/mobile/geom][geom: Screen geometry]]
golang.org/x/mobile/exp/...
- [[https://pkg.go.dev/golang.org/x/mobile/exp/audio][audio: Audio]]
- [[https://pkg.go.dev/golang.org/x/mobile/exp/font][font: System font]]
- [[https://pkg.go.dev/golang.org/x/mobile/exp/sprite][sprite: 2-D rendering]]
- [[https://pkg.go.dev/golang.org/x/mobile/exp/sensor][sensor: Sensors]]
* Challenge #2: Build systems
Dealing with
- Toolchain installation
- Cross compilation for `GOOS/GOARCH` combos
- Android/iOS-specific build details
That is not fun!
* The gomobile tool
$ 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)
* SDK Apps
* Go as a library
Go 1.5 can build Go programs as a library that can be used by non-Go programs
- Shared library for dynamic linking (`-buildmode=c-shared`)
- Archive file for static linking (`-buildmode=c-archive`)
Functions marked with `//export` cgo annotations are callable.
.link /s/execmodes go.dev/s/execmodes
* Working with Foreign Languages
.image gophercon-go-on-mobile/gobind.png 300 _
Manually mapping data structures and functions between languages is tedious and error-prone!
* The gobind tool
$ 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 [[https://pkg.go.dev/golang.org/x/mobile/cmd/gobind][subset of Go types]]
* Binding Functions, Basic Types & Errors
Go 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);
* Binding Structs
package mypkg
type Counter struct {
Value int64
}
func (c *Counter) Inc() {
c.Value++
}
func NewCounter() *Counter {
return &Counter{}
}
* Generated Java API
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();
* Generated Objective-C API
@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];
* How to build it?
.image gophercon-go-on-mobile/memegobind.jpg 500 _
* The gomobile bind command
Simplifies the build process. For example, for Android,
- Generates language bindings for Go packages
- Compiles Go code to a shared library
- Compiles the generated target language code
- Bundles everything into a `.aar` file (modern way to distribute android libraries)
(DEMO)
iOS support is a work in progress.
* Android Studio Integration
Android Studio 1.2+ supports `.aar` import.
.image gophercon-go-on-mobile/androidstudio2.png 250 _
To update the .aar,
- Build script to invoke `gomobile` `bind`, or
- Gradle plugin to invoke `gomobile` `bind` and publish the output
* The Story of Ivy
The [[https://robpike.io/ivy][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, ...
.image gophercon-go-on-mobile/ivyscreenshot2.png 300 _
It is in fact an interpreter for an [[https://en.wikipedia.org/wiki/APL_(programming_language)][APL]]-like language
* Ivy on Mobile?
~5k lines of Go code (not including tests, docs)
Dependency on `math`, `math/big`, `math/rand`, `unicode`, ...
.image gophercon-go-on-mobile/canihas.jpg 300 _
Rewriting in Java or Objective-C is a non-starter
* Ivy apps
.image gophercon-go-on-mobile/ivymobile.png 300 _
.caption Ivy logo by [[https://www.reneefrench.com][Renée French]]
.link https://play.google.com/store/apps/details?id=org.golang.ivy Google Play Store
.link https://itunes.apple.com/us/app/ivy-big-number-calculator/id1012116478 Apple App Store
* Gomobile bind
Write it once as a library in Go
Enjoy great language features and packages available in Go
* Where are we now?
* Go 1.4: Hello Android!
Released 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
.link /s/go14android go.dev/s/go14android
.link /s/gobind go.dev/s/gobind
* Go 1.5: Hello iOS!
Planned release early August 2015
Experimental support for iOS (`arm,arm64`)
iOS builder
* Go 1.5: Go programs as libraries
Can call Go functions from foreign language in a clean way
.link /s/execmodes go.dev/s/execmodes
* Go 1.5: Better tools & more packages
`golang.org/x/mobile` repo getting better
- The `gomobile` tool for mobile app/library build
- Extended `gobind` tool: Objective-C binding
- `golang.org/x/mobile/exp`: experimenting with audio, sensor, sprite, ...
* Go 1.6+
- Improvement in GL/UI packages
- More APIs available to "pure Go" apps
- Testing, profiling, debugging
- Support for more platforms (e.g. android/x86, iOS simulator)
- Richer type support in `gobind`
- IDE integration
* Contributions from Go community
.image gophercon-go-on-mobile/contributors.png 480 _
.caption git log | word_cloud