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