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

