Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Mobile Apps by Pure Go with Reverse Binding


Published on

This slides are presented at GopherCon India 2017.

Published in: Technology
  • I have always found it hard to meet the requirements of being a student. Ever since my years of high school, I really have no idea what professors are looking for to give good grades. After some google searching, I found this service ⇒ ⇐ who helped me write my research paper. The final result was amazing, and I highly recommend ⇒ ⇐ to anyone in the same mindset as me.
    Are you sure you want to  Yes  No
    Your message goes here

Mobile Apps by Pure Go with Reverse Binding

  1. 1. Mobile Apps by Pure Go with Reverse Binding GopherCon India 22nd Feb. 2017 The Go gopher was designed by Renee French. The gopher stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. Slide URL:
  2. 2. Slide URL: Who am I? Mercari, Inc./Souzoh, Inc. Takuya Ueda twitter: @tenntenn ■ Communities Google Cloud Platform User Group (GCPUG) Tokyo Go Beginners in Tokyo, Japan Go Conference in Tokyo, Japan ■ Works Developing Mercari Atte in GAE/Go 2
  3. 3. Slide URL: What is this talk about? ● The Basics of Go Mobile ○ Cross-compile / cgo for Android ○ What is Go Mobile? ○ SDK Apps and Native Apps ● Developing Android Apps in pure Go ○ gomobile bind ○ What is Reverse Bindings? ○ Use Platform APIs from Go 3
  4. 4. Slide URL: The Basics of Go Mobile 4
  5. 5. Slide URL: Cross-compile ● GOOS and GOARCH ○ Go can cross-compile ○ GOOS indicates target OS ○ GOARCH indicates target architecture 5 # Build for 32bit Windows $ GOOS=windows GOARCH=386 go build # Build for arm Linux $ GOOS=linux GOARCH=arm go build A linux/arm binary also works on android devices.
  6. 6. Slide URL: Web server on Android Device 6 Watch at Youtube Source Code Android Shell on Mac adb shell
  7. 7. Slide URL: cgo ● C codes into Go codes 7 import "unsafe" /* #include <stdio.h> #include <stdlib.h> void hello(char *s) { printf("Hello, %sn", s); } */ import "C" func main() { str := C.CString("GopherCon India") C.hello(str) } Comments before import "C" would be built as C codes Call C’s function from Go code
  8. 8. Slide URL: cgo for Android ● cgo codes also can be cross-compiled 8 $ CGO_ENABLED=1 CC=arm-linux-androideabi-gcc GOOS=android GOARCH=arm GOARM=7 go build -buildmode=pie hellocgo.go $ adb push hellocgo /data/local/tmp $ chmod 755 /data/local/tmp/hellocgo $ /data/local/tmp/hellocgo Hello, GopherCon India GOOS should be android when CGO_ENABLED is 1. Enable cgo at cross-compiling adb shell PC
  9. 9. Slide URL: buildmode ● Change output formats ○ archive, c-archive ■ build into C archive (.a file) ○ shared, c-shared ■ build into shared library (.so file) ○ plugin ■ bulid into Go Plugin (<= Go 1.8) ○ exe ■ build into executable file ○ pie ■ build into PIE style executable file 9 archive and shared ignore main package Go can build to .so files for Android
  10. 10. Slide URL: Go Mobile ● What is Go Mobile? ○ Go Mobile is a toolkit for Mobile Platform (Android and iOS) in Go. ● How Go Mobile works? ○ Go Mobile provides bindings of Android and iOS through cgo. 10 Go C Java Obj-C JNIcgo Android iOS
  11. 11. Slide URL: Go Mobile 11
  12. 12. Slide URL: Installation ● Install gomobile comand ● Initialize the build tool chain ○ gomobile init initializes the build tool chain for mobile apps. 12 $ gomobile init -v $ ls $GOPATH/pkg/gomobile android_ndk_root pkg_android_amd64 pkg_android_arm64 pkg_darwin_arm version pkg_android_386 pkg_android_arm pkg_darwin_amd64 pkg_darwin_arm64 $ go get -u
  13. 13. Slide URL: gomobile command gomobile command provides sub-commands. ● Sub-commands 13 bind build a library for Android and iOS build compile Android APK and iOS app clean remove object files and cached gomobile files init install android compiler toolchain install compile android APK and install on device version print version
  14. 14. Slide URL: SDK Apps and Native Apps Go Mobile provides two ways to develop mobile apps. ■ SDK Apps ● Write common funcations in Go as a library ■ Native Apps ● Write UI and all codes in Go 14
  15. 15. Slide URL: SDK Apps and Native Apps ● SDK Apps for Android ● Native Apps for Android 15 Go aar file Binding Classes (Java) Shared library (.so) Java UI, IAB, ... As a library gomobile bind apk file Go GoNativeActivity Shared library (.so)UI, audio, ... gomobile build
  16. 16. Slide URL: An Example of SDK Apps: Ivy ● Ivy big number calculator (source code) ○ Interpriter for APL-like language ○ Android App and iOS App use a same engine ○ The engine is written in Go by Rob Pike 16 Google Play App Store
  17. 17. Slide URL: An Example of Native Apps ● Flappy Gopher ○ A mobile game written in Go Mobile ○ Developed by Andrew Gerrand for Go Conference 2015 Winter ○ Source Code 17
  18. 18. Slide URL: Developing Android Apps in Pure Go 18
  19. 19. Slide URL: gomobile bind ● Generate an Android Archive (.aar) ○ a shared library (.so) written in Go ○ a JAR file which is bult Java bindings ● Develop with Android Studio Plugin ○ Runs gomobile bind ○ Links to a generated .aar file 19 $ gomobile bind [-target ios|android] mypkg
  20. 20. Slide URL: Contents of an AAR file 20 $ gomobile bind sample $ unzip -Z1 sample.aar AndroidManifest.xml proguard.txt classes.jar jni/armeabi-v7a/ jni/arm64-v8a/ jni/x86/ jni/x86_64/ R.txt res/ Compiled Java codes Compiled Go/C codes
  21. 21. Slide URL: Calling Go code from Java code 21 Bindings Java codes Application Codes (Java) C codes Go/cgo codes JNI Generated by gomobile bind SDK Codes (Go) cgo
  22. 22. Slide URL: An Example of Bindings 22 package sample func Hello() string { return "Hello" } type MyStruct struct { Str string } func (s MyStruct) MyMethod() string { return s.Str } public abstract class Sample { // ... private Sample() {} // uninstantiable public static final class MyStruct extends Seq.Proxy { public final native String getStr(); public final native void setStr(String v); public native String MyMethod(); // ... } public static native String Hello(); } Java Go Struct Field Method Package Function
  23. 23. Slide URL: Type restrictions ● Signed integer and floating point type ● String and boolean type ● Byte slice type ● Any functions ○ parameter and result types must be supported types ○ results are 0, 1 or 2 (2nd result must be an error type) ● Any struct type ○ all fields and methods must be supported types ● Any interface ○ all methods must be supported types 23
  24. 24. Slide URL: Calling Platform API from Go ● In-app Billing ○ Purchase a items in the game ● SNS connection ○ Facebook, Twitter, ... ● Advertisements ● Analytics ○ Google Analytics, Firebase, Facebook Analytics,... 24 These APIs are provided as Java SDK for Android
  25. 25. Slide URL: Traditional gomobile bind ● Bindings to Go from Java/Obj-C ● Platform APIs can be accessed BUT... ○ Indirect way ○ Needs wrappers ○ Not convenient 25 A way to access directly Platform APIs from Go is needed!
  26. 26. Slide URL: Reverse Bindings ● Access Platform APIs from Go ● Generate bindings automatically ○ Reverse direction of traditional one ○ use gomobile bind ● Prposed by #16876 and #17102 (Android) (iOS) 26
  27. 27. Slide URL: Reverse Bindings 27 Bindings Java codes Go Codes C codes Go/cgo codes JNI Generated by gomobile bind Platform APIs (Java) cgo
  28. 28. Slide URL: An Example of Reverse Bindings 28 package pkg import "Java/java/lang" import "Java/pkg" type Obj struct { lang.Object } func (h *Obj) ToString(this *pkg.Obj) string { return "hoge" } ● Parse import statements ○ Java/* or ObjC/* ● Generate bindings automatically corresponds java.lang package in Java inherit java.lang.Object Hold a Java instance
  29. 29. Slide URL: How Generate Reverse Bindings? ● Parse import statements ○ Begin with Java/ ● Extract class infomation by javap ○ Exported fields and methods ○ Dependent classes ○ Implementing interfaces ● Generate bindings of all dependented classes and interfaces 29 $ javap java.lang.String Compiled from "" public final class java.lang.String implements, java.lang.Comparable<java.lang.String>, java.lang.CharSequence { public static final java.util.Comparator<java.lang.String> CASE_INSENSITIVE_ORDER; public java.lang.String(); ....
  30. 30. Slide URL: Using Platform APIs from Go ● Example of Reverse Binding in x/mobile 30 $ cd $GOPATH/src/ $ cd example/reverse/android $ gradle wrapper $ ./gradlew build $ cd build/outputs/apk $ adb install -r android-debug.apk Android Studio also can build
  31. 31. Slide URL: Use Platform APIs from Go ● Use Activity and write in life cycle of Android 31 type MainActivity struct { app.AppCompatActivity binding databinding.ActivityMainBinding } func (a *MainActivity) OnCreate( this gopkg.MainActivity, b os.Bundle) { ... } func (a *MainActivity) OnDestroy( this gopkg.MainActivity) { ... } reverse.go
  32. 32. Slide URL: Use Platform APIs from Go ● Use data binding of Android 32 func (a *MainActivity) OnCreate( this gopkg.MainActivity, b os.Bundle) { this.Super().OnCreate(b) db := DataBindingUtil.SetContentView( this, rlayout.Activity_main) a.binding = ActivityMainBinding.Cast(db) a.binding.SetAct(this) } func (a *MainActivity) GetLabel() string { return "Hello, GopherCon India!" } reverse.go
  33. 33. Slide URL: Use Platform APIs from Go ● Use data binding of Android 33 ... <data> <variable name="act" type="reverse.MainActivity"/> </data> <RelativeLayout ... <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{act.label}"/> </RelativeLayout> </layout> activity_main.xml
  34. 34. Slide URL: Summaries ● The Basics of Go Mobile ○ Cross-compile / cgo for Android ○ What is Go Mobile? ○ SDK Apps and Native Apps ● Developing Android Apps in pure Go ○ gomobile bind ○ What is Reverse Bindings? ○ Use Platform APIs from Go 34
  35. 35. Thank you! twitter: @tenntenn Qiita: tenntenn 35
  36. 36. Slide URL: Binding between Go and Java 36 Package Abstruct Class Struct Inner Class Struct Field Getter/Setter (Native) Method Method (Native) Package Function Static Method Go Java ● gomobile bind generates bindings