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.
HelloMobile.go
SeongJae Park <sj38.park@gmail.com>
This work by SeongJae Park is licensed under the Creative
Commons Attribution-ShareAlike 3.0 Unported License. To
view a c...
This slides were presented during
GopherCon Korea 2015
(https://plus.google.com/u/0/events/c4b79ocq4k9ac11bpb5b2govkes)
Nice To Meet You
SeongJae Park
sj38.park@gmail.com
golang newbie programmer
Warning
● This speech could be useless for you
○ The speaker is doing this just for fun
https://github.com/golang/mobile/r...
Warning
● This speech could be useless for you
○ The speaker is doing this just for fun
● Don’t try this at office careles...
Java is Dangerous, Now
● Oracle may take Java away from Android
● Swift is open source now, but...
● We need alternatives
...
golang: Programming Language
● For simple, reliable, and efficient software.
http://blog.golang.org/5years/gophers5th.jpg
golang: Programming Language
● For simple, reliable, and efficient software.
● Could it be used for simple, reliable, effi...
Golang on Mobile
● Golang supports Android from v1.4
● Golang supports iOS from v1.5
○ Though it’s still in experimental s...
Goal of This Speak
● Showing how we can use golang on Mobile
○ Focus on Android, rather than iOS
(Speaker has no iPhone…)
...
Goal of This Speak
● Showing how we can use golang on Mobile
○ Focus on Android, rather than iOS
(Speaker has no iPhone…)
...
Pre-requisites
● Basic development environment(vim, git,
gcc, java, gradle, …)
http://www.theprospect.net/wp-content/uploa...
Pre-requisites
● Basic development environment(vim, git,
gcc, java, gradle, …)
● Android SDK & NDK
http://www.theprospect....
Pre-requisites
● Basic development environment(vim, git,
gcc, java, gradle, …)
● Android SDK & NDK
● Golang 1.4 cross-comp...
Pure Golang Mobile App
NO JAVA!
Main Idea: NDK
● c / c++ only apk is available
using NativeActivity
○ Golang is a compiled language, too. Why not?
http://...
Main Idea: NDK
● c / c++ only apk is available
using NativeActivity
○ Golang is a compiled language, too. Why not?
Plan is...
Example Code
https://github.
com/golang/mobile/tree/40f92f7d9f9092072ea68570fd6f57
25a5cbcd6b/example/basic for 1.4 based
...
Example Code (1.4 based)
https://github.
com/golang/mobile/tree/40f92f7d9f9092072ea68570fd6f57
25a5cbcd6b/example/basic
$ ...
main.go: Register Callbacks
Register callbacks from golang entrypoint
(After 1.5, programming model changed a little)
func...
main.go: Use OpenGL
func draw() {
gl.ClearColor(1, 0, 0, 1)
...
green += 0.01
if green > 1 {
green = 0
}
gl.Uniform4f(colo...
NativeActivity
NativeActivity only application doesn’t need
JAVA
<application android:label="Basic" android:hasCode="false...
NativeActivity
NativeActivity only application doesn’t need
JAVA
<application android:label="Basic" android:hasCode="false...
NativeActivity
NativeActivity only application doesn’t need
JAVA
<application android:label="Basic" android:hasCode="false...
Build Process
Build golang code into ELF shared object for
ARM
mkdir -p jni/armeabi
CGO_ENABLED=1 GOOS=android GOARCH=arm ...
Build Process
Build golang code into ELF shared object for
ARM
NDK to add the so file
mkdir -p jni/armeabi
CGO_ENABLED=1 G...
Build Process
Build golang code into ELF shared object for
ARM
NDK to add the so file
SDK to build apk file
mkdir -p jni/a...
Example Code (1.5 based)
https://github.
com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c
555366d20/example/basic
go...
Example Code (1.5 based)
https://github.
com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c
555366d20/example/basic
go...
Example Code (1.5 based)
https://github.
com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c
555366d20/example/basic
go...
Example Code (1.5 based)
https://github.
com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c
555366d20/example/basic
go...
Pure Golang Android App
Pros: No more JAVA! Yay!!!
Cons: Should I learn OpenGL to show a cat?
Golang as a Library
Cooperate Java and Golang
Main Idea: Gives binding
Java and C language connected via JNI
Java
C
JNI
Main Idea: Gives binding
Java and C language connected via JNI
C language and Golang connected via cgo
Java
C GO
JNI
CGO
Main Idea: Gives binding
Java and C language connected via JNI
C language and Golang connected via cgo
ObjC(Objective C) i...
Main Idea: Gives binding
Java and C language connected via JNI
C language and Golang connected via cgo
ObjC(Objective C) i...
Example Code (1.4 based)
https://github.
com/golang/mobile/tree/40f92
f7d9f9092072ea68570fd6f572
5a5cbcd6b/example/libhello
Example Code (1.4 based)
https://github.
com/golang/mobile/tree/40f92
f7d9f9092072ea68570fd6f572
5a5cbcd6b/example/libhell...
Callee in Go
Golang code is implementing Hello() function
func Hello(name string) {
fmt.Printf("Hello, %s!n", name)
}
(mob...
Caller in JAVA
Java code is calling Golang function, Hello()
protected void onCreate(Bundle savedInstanceState) {
super.on...
gobind
generate language bindings that make it
possible to call Go code and pass objects from
Java
$ go install golang.org...
gobind: Generated Proxy java Code
Provides wrapper function for golang calling
code
public static void Hello(String name) ...
gobind: Generated Stub go Code
Provides proxy and registering for the exported
function
func proxy_Hello(out, in *seq.Buff...
Example Code (1.5 based)
https://github.
com/golang/mobile/tree/25faf
494e186f45f8d9704fb53a6c6
c555366d20/example/bind
go...
Golang as a Library
Pros: JAVA for UI, Golang for background
(Looks efficient enough)
Golang as a Library
Pros: JAVA for UI, Golang for background
(Looks efficient enough)
Cons: Binding supports only subset o...
Inter-Process
Communication
Philosophy of Unix
Main Idea: Android is a Linux
http://www.kitguru.net/wp-content/uploads/2012/03/linux-android.png
Android is a variant of ...
Main Idea: Android is a Linux
http://www.kitguru.net/wp-content/uploads/2012/03/linux-android.png
Android is a variant of ...
Main Idea: Android is a Linux
http://www.kitguru.net/wp-content/uploads/2012/03/linux-android.png
Android is a variant of ...
Example Code
https://github.com/sjp38/goOnAndroid
https://github.com/sjp38/goOnAndroidFA
Example Code
https://github.com/sjp38/goOnAndroid
https://github.com/sjp38/goOnAndroidFA
Were demonstrated as live-coding ...
Golang Process on Android: Plan
1. Cross compile Go program as ARM / Linux
Golang Process on Android: Plan
1. Cross compile Go program as ARM / Linux
2. Include the binary in assets/ of Android app
Golang Process on Android: Plan
1. Cross compile Go program as ARM / Linux
2. Include the binary in assets/ of Android app...
Golang Process on Android: Plan
1. Cross compile Go program as ARM / Linux
2. Include the binary in assets/ of Android app...
Golang Process on Android: Plan
1. Cross compile Go program as ARM / Linux
2. Include the binary in assets/ of Android app...
Go bin Loading
Load golang program from assets to private dir
private void copyGoBinary() {
String dstFile = getBaseContex...
Execute Go process
Spawn new process for the program and
communicates using stdio
ProcessBuilder pb = new ProcessBuilder()...
Inter Process Communication
Pros: Just normal unix way
Inter Process Communication
Pros: Just normal unix way
Golang team is using this for Camlistore
(https://github.com/camlis...
Inter Process Communication
Pros: Just normal unix way
Golang team is using this for Camlistore
(https://github.com/camlis...
Summary
● Go can run on Mobile
○ As a native application,
○ as a library,
○ or, as a process
● Though it’s an experiment y...
Upcoming SlideShare
Loading in …5
×

Develop Android/iOS app using golang

7,691 views

Published on

This slide describe how to develop app for Android/iOS using go language v1.4 and v1.5.

Published in: Software

Develop Android/iOS app using golang

  1. 1. HelloMobile.go SeongJae Park <sj38.park@gmail.com>
  2. 2. This work by SeongJae Park is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons. org/licenses/by-sa/3.0/.
  3. 3. This slides were presented during GopherCon Korea 2015 (https://plus.google.com/u/0/events/c4b79ocq4k9ac11bpb5b2govkes)
  4. 4. Nice To Meet You SeongJae Park sj38.park@gmail.com golang newbie programmer
  5. 5. Warning ● This speech could be useless for you ○ The speaker is doing this just for fun https://github.com/golang/mobile/raw/master/doc/caution.png
  6. 6. Warning ● This speech could be useless for you ○ The speaker is doing this just for fun ● Don’t try this at office carelessly ○ It’s an experiment yet https://github.com/golang/mobile/raw/master/doc/caution.png
  7. 7. Java is Dangerous, Now ● Oracle may take Java away from Android ● Swift is open source now, but... ● We need alternatives http://img.talkandroid.com/uploads/2011/10/OracleGoogle.jpg
  8. 8. golang: Programming Language ● For simple, reliable, and efficient software. http://blog.golang.org/5years/gophers5th.jpg
  9. 9. golang: Programming Language ● For simple, reliable, and efficient software. ● Could it be used for simple, reliable, efficient, and free mobile application? http://blog.golang.org/5years/gophers5th.jpg
  10. 10. Golang on Mobile ● Golang supports Android from v1.4 ● Golang supports iOS from v1.5 ○ Though it’s still in experimental stage, there were many improvements especially in tools ● https://github.com/golang/mobile ○ Repo of packages and tools for Go on Mobile
  11. 11. Goal of This Speak ● Showing how we can use golang on Mobile ○ Focus on Android, rather than iOS (Speaker has no iPhone…) ○ By exploring example code
  12. 12. Goal of This Speak ● Showing how we can use golang on Mobile ○ Focus on Android, rather than iOS (Speaker has no iPhone…) ○ By exploring example code ● We will explore code based on go1.4, go1.5 ○ Code based on go1.4 shows naked face of build process ■ based on go1.4: https://github.com/golang/mobile/tree/40f92f7d9f9092072ea68570fd6f5725a5cbcd6b ■ based on go1.5: https://github.com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c555366d20
  13. 13. Pre-requisites ● Basic development environment(vim, git, gcc, java, gradle, …) http://www.theprospect.net/wp-content/uploads/2014/02/one-does-not-simply-skip-a-step.jpg
  14. 14. Pre-requisites ● Basic development environment(vim, git, gcc, java, gradle, …) ● Android SDK & NDK http://www.theprospect.net/wp-content/uploads/2014/02/one-does-not-simply-skip-a-step.jpg
  15. 15. Pre-requisites ● Basic development environment(vim, git, gcc, java, gradle, …) ● Android SDK & NDK ● Golang 1.4 cross-compiled for GOOS=android or higher versions http://www.theprospect.net/wp-content/uploads/2014/02/one-does-not-simply-skip-a-step.jpg
  16. 16. Pure Golang Mobile App NO JAVA!
  17. 17. Main Idea: NDK ● c / c++ only apk is available using NativeActivity ○ Golang is a compiled language, too. Why not? http://www.android.pk/images/android-ndk.jpg
  18. 18. Main Idea: NDK ● c / c++ only apk is available using NativeActivity ○ Golang is a compiled language, too. Why not? Plan is as below: ● Build golang program as .so file ○ ELF shared object ● Process events(draw, touch, …) via OpenGL ● Build NativeActivity apk using NDK / SDK http://www.android.pk/images/android-ndk.jpg
  19. 19. Example Code https://github. com/golang/mobile/tree/40f92f7d9f9092072ea68570fd6f57 25a5cbcd6b/example/basic for 1.4 based https://github. com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c 555366d20/example/basic for 1.5 based
  20. 20. Example Code (1.4 based) https://github. com/golang/mobile/tree/40f92f7d9f9092072ea68570fd6f57 25a5cbcd6b/example/basic $ tree . ├── all.bash ├── all.bat ├── AndroidManifest.xml ├── build.xml ├── jni │ └── Android.mk ├── main.go ├── make.bash └── make.bat 1 directory, 8 files
  21. 21. main.go: Register Callbacks Register callbacks from golang entrypoint (After 1.5, programming model changed a little) func main() { app.Run(app.Callbacks{ Start: start, Stop: stop, Draw: draw, Touch: touch, }) } (mobile/example/basic/main.go)
  22. 22. main.go: Use OpenGL func draw() { gl.ClearColor(1, 0, 0, 1) ... green += 0.01 if green > 1 { green = 0 } gl.Uniform4f(color, 0, green, 0, 1) ... debug.DrawFPS() } (mobile/example/basic/main.go)
  23. 23. NativeActivity NativeActivity only application doesn’t need JAVA <application android:label="Basic" android:hasCode="false"> <activity android:name="android.app.NativeActivity" android:label="Basic" android:configChanges="orientation|keyboardHidden"> <meta-data android:name="android.app.lib_name" android:value="basic" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> (mobile/example/basic/AndroidManifest.xml)
  24. 24. NativeActivity NativeActivity only application doesn’t need JAVA <application android:label="Basic" android:hasCode="false"> <activity android:name="android.app.NativeActivity" android:label="Basic" android:configChanges="orientation|keyboardHidden"> <meta-data android:name="android.app.lib_name" android:value="basic" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> (mobile/example/basic/AndroidManifest.xml)
  25. 25. NativeActivity NativeActivity only application doesn’t need JAVA <application android:label="Basic" android:hasCode="false"> <activity android:name="android.app.NativeActivity" android:label="Basic" android:configChanges="orientation|keyboardHidden"> <meta-data android:name="android.app.lib_name" android:value="basic" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> (mobile/example/basic/AndroidManifest.xml)
  26. 26. Build Process Build golang code into ELF shared object for ARM mkdir -p jni/armeabi CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 go build -ldflags="-shared" -o jni/armeabi/libbasic.so . ndk-build NDK_DEBUG=1 ant debug (mobile/example/basic/make.bash)
  27. 27. Build Process Build golang code into ELF shared object for ARM NDK to add the so file mkdir -p jni/armeabi CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 go build -ldflags="-shared" -o jni/armeabi/libbasic.so . ndk-build NDK_DEBUG=1 ant debug (mobile/example/basic/make.bash)
  28. 28. Build Process Build golang code into ELF shared object for ARM NDK to add the so file SDK to build apk file mkdir -p jni/armeabi CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 go build -ldflags="-shared" -o jni/armeabi/libbasic.so . ndk-build NDK_DEBUG=1 ant debug (mobile/example/basic/make.bash)
  29. 29. Example Code (1.5 based) https://github. com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c 555366d20/example/basic gomobile command do build $ tree . └── main.go 0 directories, 1 file
  30. 30. Example Code (1.5 based) https://github. com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c 555366d20/example/basic gomobile command do build $ go get golang.org/x/mobile/cmd/gomobile $ tree . └── main.go 0 directories, 1 file
  31. 31. Example Code (1.5 based) https://github. com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c 555366d20/example/basic gomobile command do build $ go get golang.org/x/mobile/cmd/gomobile $ gomobile init # install ndk if needed $ tree . └── main.go 0 directories, 1 file
  32. 32. Example Code (1.5 based) https://github. com/golang/mobile/tree/25faf494e186f45f8d9704fb53a6c6c 555366d20/example/basic gomobile command do build $ go get golang.org/x/mobile/cmd/gomobile $ gomobile init # install ndk if needed $ gomobile build -target=android golang.org/x/mobile/example/basic $ tree . └── main.go 0 directories, 1 file
  33. 33. Pure Golang Android App Pros: No more JAVA! Yay!!! Cons: Should I learn OpenGL to show a cat?
  34. 34. Golang as a Library Cooperate Java and Golang
  35. 35. Main Idea: Gives binding Java and C language connected via JNI Java C JNI
  36. 36. Main Idea: Gives binding Java and C language connected via JNI C language and Golang connected via cgo Java C GO JNI CGO
  37. 37. Main Idea: Gives binding Java and C language connected via JNI C language and Golang connected via cgo ObjC(Objective C) is a super-set of C language Java C GO JNI CGO ObjC
  38. 38. Main Idea: Gives binding Java and C language connected via JNI C language and Golang connected via cgo ObjC(Objective C) is a super-set of C language Golang supports Java/ObjC-Golang bind (Uses Cgo internally) Java C GO JNI CGO bind ObjC bind
  39. 39. Example Code (1.4 based) https://github. com/golang/mobile/tree/40f92 f7d9f9092072ea68570fd6f572 5a5cbcd6b/example/libhello
  40. 40. Example Code (1.4 based) https://github. com/golang/mobile/tree/40f92 f7d9f9092072ea68570fd6f572 5a5cbcd6b/example/libhello $ tree . ├── all.bash ├── all.bat ├── AndroidManifest.xml ├── build.xml ├── hi │ ├── go_hi │ │ └── go_hi.go │ └── hi.go ├── main.go ├── make.bash ├── make.bat ├── README └── src ├── com │ └── example │ └── hello │ └── MainActivity.java └── go └── hi └── Hi.java 8 directories, 12 files
  41. 41. Callee in Go Golang code is implementing Hello() function func Hello(name string) { fmt.Printf("Hello, %s!n", name) } (mobile/example/libhello/hi/hi.go)
  42. 42. Caller in JAVA Java code is calling Golang function, Hello() protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Go.init(getApplicationContext()); Hi.Hello("world"); } (mobile/example/libhello/src/com/example/hello/MainActivity.java)
  43. 43. gobind generate language bindings that make it possible to call Go code and pass objects from Java $ go install golang.org/x/mobile/cmd/gobind $ gobind -lang=go github.com/libhello/hi > hi/go_hi/go_hi.go # stub $ gobind -lang=java github.com/libhello/hi > src/go/hi/Hi.java # proxy
  44. 44. gobind: Generated Proxy java Code Provides wrapper function for golang calling code public static void Hello(String name) { go.Seq _in = new go.Seq(); go.Seq _out = new go.Seq(); _in.writeUTF16(name); Seq.send(DESCRIPTOR, CALL_Hello, _in, _out); } private static final int CALL_Hello = 1; private static final String DESCRIPTOR = "hi"; (mobile/example/libhello/src/go/hi/Hi.java)
  45. 45. gobind: Generated Stub go Code Provides proxy and registering for the exported function func proxy_Hello(out, in *seq.Buffer) { param_name := in.ReadUTF16() hi.Hello(param_name) } func init() { seq.Register("hi", 1, proxy_Hello) } (mobile/example/libhello/hi/go_hi/go_hi.go)
  46. 46. Example Code (1.5 based) https://github. com/golang/mobile/tree/25faf 494e186f45f8d9704fb53a6c6 c555366d20/example/bind gomobile do binding automatically $ gomobile bind -target=android golang.org/x/mobile/example/bind/hello $ tree . ├── android │ ├── README ├── ... │ └── settings.gradle ├── hello │ └── hello.go └── ios ├── bind │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard │ ├── Info.plist │ ├── main.m │ ├── ViewController.h │ └── ViewController.m ├── bind.xcodeproj │ └── project.pbxproj └── README
  47. 47. Golang as a Library Pros: JAVA for UI, Golang for background (Looks efficient enough)
  48. 48. Golang as a Library Pros: JAVA for UI, Golang for background (Looks efficient enough) Cons: Binding supports only subset of Go types
  49. 49. Inter-Process Communication Philosophy of Unix
  50. 50. Main Idea: Android is a Linux http://www.kitguru.net/wp-content/uploads/2012/03/linux-android.png Android is a variant of Linux system with ARM x86 Androids exist, though...
  51. 51. Main Idea: Android is a Linux http://www.kitguru.net/wp-content/uploads/2012/03/linux-android.png Android is a variant of Linux system with ARM x86 Androids exist, though... Go supports ARM & Linux Officially with static-linking
  52. 52. Main Idea: Android is a Linux http://www.kitguru.net/wp-content/uploads/2012/03/linux-android.png Android is a variant of Linux system with ARM x86 Androids exist, though... Go supports ARM & Linux Officially with static-linking Remember the philosophy of Unix Not tested for iOS
  53. 53. Example Code https://github.com/sjp38/goOnAndroid https://github.com/sjp38/goOnAndroidFA
  54. 54. Example Code https://github.com/sjp38/goOnAndroid https://github.com/sjp38/goOnAndroidFA Were demonstrated as live-coding from GDG Korea DevFair 2014 (http://devfair2014. gdg.kr/) and GDG Golang Seoul Meetup 2015 (https: //developers.google. com/events/5381849181323264/)
  55. 55. Golang Process on Android: Plan 1. Cross compile Go program as ARM / Linux
  56. 56. Golang Process on Android: Plan 1. Cross compile Go program as ARM / Linux 2. Include the binary in assets/ of Android app
  57. 57. Golang Process on Android: Plan 1. Cross compile Go program as ARM / Linux 2. Include the binary in assets/ of Android app 3. Copy the binary in private space of the app
  58. 58. Golang Process on Android: Plan 1. Cross compile Go program as ARM / Linux 2. Include the binary in assets/ of Android app 3. Copy the binary in private space of the app 4. Give execute permission to the binary /data/data/com.example.goRunner/files # ls -al -rwxrwxrwx u0_a55 u0_a55 4512840 2014-11-28 17:45 gobin
  59. 59. Golang Process on Android: Plan 1. Cross compile Go program as ARM / Linux 2. Include the binary in assets/ of Android app 3. Copy the binary in private space of the app 4. Give execute permission to the binary 5. Execute it /data/data/com.example.goRunner/files # ls -al -rwxrwxrwx u0_a55 u0_a55 4512840 2014-11-28 17:45 gobin
  60. 60. Go bin Loading Load golang program from assets to private dir private void copyGoBinary() { String dstFile = getBaseContext().getFilesDir().getAbsolutePath() + "/verChecker.bin"; try { InputStream is = getAssets().open("go.bin"); FileOutputStream fos = getBaseContext().openFileOutput( "verChecker.bin", MODE_PRIVATE); byte[] buf = new byte[8192]; int offset; while ((offset = is.read(buf)) > 0) { fos.write(buf, 0, offset); } Runtime.getRuntime().exec("chmod 0777 " + dstFile); } catch (IOException e) { } }
  61. 61. Execute Go process Spawn new process for the program and communicates using stdio ProcessBuilder pb = new ProcessBuilder(); pb.command(goBinPath()); pb.redirectErrorStream(false); goProcess = pb.start(); new CopyToAndroidLogThread("stderr", goProcess.getErrorStream()) .start();
  62. 62. Inter Process Communication Pros: Just normal unix way
  63. 63. Inter Process Communication Pros: Just normal unix way Golang team is using this for Camlistore (https://github.com/camlistore/camlistore)
  64. 64. Inter Process Communication Pros: Just normal unix way Golang team is using this for Camlistore (https://github.com/camlistore/camlistore) Cons: Hacky, a little x/mobile is comfortable enough, now Not sure whether it works on iOS
  65. 65. Summary ● Go can run on Mobile ○ As a native application, ○ as a library, ○ or, as a process ● Though it’s an experiment yet, it’s fairly comfortable

×