| 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 |
| |