SlideShare une entreprise Scribd logo
1  sur  62
Télécharger pour lire hors ligne
HelloAndroid.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 copy of this license, visit http://creativecommons.
org/licenses/by-sa/3.0/.
This slides were presented during
3rd GDG Korea Android Conference
(http://event.android.gdg.kr/3rd-GKAC/)
The talk video is available at:
https://www.youtube.com/watch?v=vMZFjDipaK8&index=2&list=PL_WJkTbDHdBl5QXy6N_bMMBYlKLna5RER
Nice To Meet You
SeongJae Park
sj38.park@gmail.com
golang newbie programmer
Warning
● This speech could be useless for you
○ This is just for fun
http://m.c.lnkd.licdn.com/mpr/mpr/p/4/005/095/091/210ae8c.jpg
Warning
● This speech could be useless for you
○ This is just for fun
● Don’t try this at office
○ The code is not stable yet
http://m.c.lnkd.licdn.com/mpr/mpr/p/4/005/095/091/210ae8c.jpg
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, and
efficient Android application?
http://blog.golang.org/5years/gophers5th.jpg
Golang and Android
● Golang supports Android from v1.4
○ Though it’s still unstable
Golang and Android
● Golang supports Android from v1.4
○ Though it’s still unstable
● https://github.com/golang/mobile
○ Packages and build tools for using Go on Android
Goal of This Speak
● Showing how we can use golang on Android
○ By exploring example code
Goal of This Speak
● Showing how we can use golang on Android
○ By exploring example code
● Just for fun, rather than profit
Pre-requisites
● Basic development environment(vim, git,
gcc, java, …)
http://www.theprospect.net/wp-content/uploads/2014/02/one-does-not-simply-skip-a-step.jpg
Pre-requisites
● Basic development environment(vim, git,
gcc, java, …)
● Android SDK & NDK
http://www.theprospect.net/wp-content/uploads/2014/02/one-does-not-simply-skip-a-step.jpg
Pre-requisites
● Basic development environment(vim, git,
gcc, java, …)
● Android SDK & NDK
● Golang 1.4 or higher cross-compiled for
GOOS=android
http://www.theprospect.net/wp-content/uploads/2014/02/one-does-not-simply-skip-a-step.jpg
Pure Golang Android App
NO JAVA!
Main Idea: Use NDK
● c / c++ only apk is available
using NativeActivity
○ Golang be compiled to native binary, too. Why not?
http://www.android.pk/images/android-ndk.jpg
Main Idea: Use NDK
● c / c++ only apk is available
using NativeActivity
○ Golang be compiled to native binary, too. Why not?
Plan is...
● Build golang program as .so file
○ ELF shared object
● Implement every callbacks using OpenGL
http://www.android.pk/images/android-ndk.jpg
Main Idea: Use NDK
● c / c++ only apk is available
using NativeActivity
○ Golang be compiled to native binary, too. Why not?
Plan is...
● Build golang program as .so file
○ ELF shared object
● Implement every callbacks using OpenGL
● Build NativeActivity apk using NDK / SDK
http://www.android.pk/images/android-ndk.jpg
Example Code
https://github.
com/golang/mobile/tree/master/example/basic
Example Code
https://github.
com/golang/mobile/tree/master/example/basic
$ tree
.
├── all.bash
├── all.bat
├── AndroidManifest.xml
├── build.xml
├── jni
│ └── Android.mk
├── main.go
├── make.bash
└── make.bat
1 directory, 8 files
main.go: Register Callbacks
Register callbacks from golang entrypoint
func main() {
app.Run(app.Callbacks{
Start: start,
Stop: stop,
Draw: draw,
Touch: touch,
})
}
(mobile/example/basic/main.go)
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)
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)
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)
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)
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)
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)
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)
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
Java and C language connected via JNI
Main Idea: Use JNI-like way
Java
CPP
JNI
Main Idea: Use JNI-like way
Java and C language connected via JNI
C language and Golang connected via cgo
Java
CPP
GO
JNI CGO
Main Idea: Use JNI-like way
Java and C language connected via JNI
C language and Golang connected via cgo
...But, JNI and then cgo looks tedious
Java
CPP
GO
JNI CGO
Main Idea: Use JNI-like way
Java and C language connected via JNI
C language and Golang connected via cgo
...But, JNI and then cgo looks tedious
Golang supports Java-Golang bind
Java
CPP
GO
JNI CGO
bind/seq
Example Code
https://github.
com/golang/mobile/tree/
master/example/libhello
Example Code
https://github.
com/golang/mobile/tree/
master/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
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)
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)
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
gobind -lang=java github.com/libhello/hi > src/go/hi/Hi.java
gobind: Generated .java
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)
gobind: Generated .go
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)
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: bind/seq is not so efficient, yet
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 Linux system with ARM
x86 Androids exist, though...
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
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
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 by live-coding from
GDG Korea DevFair 2014 (http://devfair2014.
gdg.kr/) and
GDG Golang Seoul Meetup 2015 (https:
//developers.google.
com/events/5381849181323264/)
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
3. Copy the binary in private space of the app
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
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
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) { }
}
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();
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/camlistore/camlistore)
Inter Process Communication
Pros: Just normal unix way
Golang team using this for Camlistore
(https://github.com/camlistore/camlistore)
Cons: Hacky, a little
Summary
You can use Golang for Android
though it’s not stable yet
Just for fun
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/.

Contenu connexe

Tendances

Tendances (20)

Golang (Go Programming Language)
Golang (Go Programming Language)Golang (Go Programming Language)
Golang (Go Programming Language)
 
NGINX: Basics and Best Practices EMEA
NGINX: Basics and Best Practices EMEANGINX: Basics and Best Practices EMEA
NGINX: Basics and Best Practices EMEA
 
Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
 
Web assembly overview by Mikhail Sorokovsky
Web assembly overview by Mikhail SorokovskyWeb assembly overview by Mikhail Sorokovsky
Web assembly overview by Mikhail Sorokovsky
 
Go Programming Language (Golang)
Go Programming Language (Golang)Go Programming Language (Golang)
Go Programming Language (Golang)
 
Learn nginx in 90mins
Learn nginx in 90minsLearn nginx in 90mins
Learn nginx in 90mins
 
Getting started with Next.js - IM Tech Meetup - Oct 2022.pptx
Getting started with Next.js - IM Tech Meetup - Oct 2022.pptxGetting started with Next.js - IM Tech Meetup - Oct 2022.pptx
Getting started with Next.js - IM Tech Meetup - Oct 2022.pptx
 
Introduction to go language programming
Introduction to go language programmingIntroduction to go language programming
Introduction to go language programming
 
NGINX ADC: Basics and Best Practices – EMEA
NGINX ADC: Basics and Best Practices – EMEANGINX ADC: Basics and Best Practices – EMEA
NGINX ADC: Basics and Best Practices – EMEA
 
Presentation of framework Angular
Presentation of framework AngularPresentation of framework Angular
Presentation of framework Angular
 
Basic Kong API Gateway
Basic Kong API GatewayBasic Kong API Gateway
Basic Kong API Gateway
 
Golang
GolangGolang
Golang
 
WebAssembly Overview
WebAssembly OverviewWebAssembly Overview
WebAssembly Overview
 
Introduction of Progressive Web App
Introduction of Progressive Web AppIntroduction of Progressive Web App
Introduction of Progressive Web App
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
JavaScript Interview Questions and Answers | Full Stack Web Development Train...
JavaScript Interview Questions and Answers | Full Stack Web Development Train...JavaScript Interview Questions and Answers | Full Stack Web Development Train...
JavaScript Interview Questions and Answers | Full Stack Web Development Train...
 
gRPC with java
gRPC with javagRPC with java
gRPC with java
 
BDD: Cucumber + Selenium + Java
BDD: Cucumber + Selenium + JavaBDD: Cucumber + Selenium + Java
BDD: Cucumber + Selenium + Java
 
Pwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreakPwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreak
 
Intro to Node.js (v1)
Intro to Node.js (v1)Intro to Node.js (v1)
Intro to Node.js (v1)
 

Similaire à Develop Android app using Golang

Similaire à Develop Android app using Golang (20)

Develop Android/iOS app using golang
Develop Android/iOS app using golangDevelop Android/iOS app using golang
Develop Android/iOS app using golang
 
Go for Mobile Games
Go for Mobile GamesGo for Mobile Games
Go for Mobile Games
 
Mobile Apps by Pure Go with Reverse Binding
Mobile Apps by Pure Go with Reverse BindingMobile Apps by Pure Go with Reverse Binding
Mobile Apps by Pure Go with Reverse Binding
 
Comparing C and Go
Comparing C and GoComparing C and Go
Comparing C and Go
 
How to Build & Use OpenCL on OpenCV & Android NDK
How to Build & Use OpenCL on OpenCV & Android NDKHow to Build & Use OpenCL on OpenCV & Android NDK
How to Build & Use OpenCL on OpenCV & Android NDK
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golang
 
Optimizing Spring Boot apps for Docker
Optimizing Spring Boot apps for DockerOptimizing Spring Boot apps for Docker
Optimizing Spring Boot apps for Docker
 
(Live) build and run golang web server on android.avi
(Live) build and run golang web server on android.avi(Live) build and run golang web server on android.avi
(Live) build and run golang web server on android.avi
 
JLPDevs - Optimization Tooling for Modern Web App Development
JLPDevs - Optimization Tooling for Modern Web App DevelopmentJLPDevs - Optimization Tooling for Modern Web App Development
JLPDevs - Optimization Tooling for Modern Web App Development
 
Metasepi team meeting #8': Haskell apps on Android NDK
Metasepi team meeting #8': Haskell apps on Android NDKMetasepi team meeting #8': Haskell apps on Android NDK
Metasepi team meeting #8': Haskell apps on Android NDK
 
Porting golang development environment developed with golang
Porting golang development environment developed with golangPorting golang development environment developed with golang
Porting golang development environment developed with golang
 
Mobile development in 2020
Mobile development in 2020 Mobile development in 2020
Mobile development in 2020
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and Pindah
 
Drone sdk showdown
Drone sdk showdownDrone sdk showdown
Drone sdk showdown
 
Coscup x ruby conf tw 2021 google cloud buildpacks 剖析與實踐
Coscup x ruby conf tw 2021  google cloud buildpacks 剖析與實踐Coscup x ruby conf tw 2021  google cloud buildpacks 剖析與實踐
Coscup x ruby conf tw 2021 google cloud buildpacks 剖析與實踐
 
Introduction to Cloud Computing with Google Cloud
Introduction to Cloud Computing with Google CloudIntroduction to Cloud Computing with Google Cloud
Introduction to Cloud Computing with Google Cloud
 
A Noob’S Guide To Android Application Development
A Noob’S Guide To Android Application DevelopmentA Noob’S Guide To Android Application Development
A Noob’S Guide To Android Application Development
 
Gdg cloud taipei ddt meetup #53 buildpack
Gdg cloud taipei ddt meetup #53 buildpackGdg cloud taipei ddt meetup #53 buildpack
Gdg cloud taipei ddt meetup #53 buildpack
 
Multi-stage Docker builds to make building easy!
Multi-stage Docker builds to make building easy!Multi-stage Docker builds to make building easy!
Multi-stage Docker builds to make building easy!
 
Golang skills pre-session
Golang skills pre-sessionGolang skills pre-session
Golang skills pre-session
 

Plus de SeongJae Park

Deep dark side of git - prologue
Deep dark side of git - prologueDeep dark side of git - prologue
Deep dark side of git - prologue
SeongJae Park
 

Plus de SeongJae Park (20)

Biscuit: an operating system written in go
Biscuit:  an operating system written in goBiscuit:  an operating system written in go
Biscuit: an operating system written in go
 
GCMA: Guaranteed Contiguous Memory Allocator
GCMA: Guaranteed Contiguous Memory AllocatorGCMA: Guaranteed Contiguous Memory Allocator
GCMA: Guaranteed Contiguous Memory Allocator
 
Linux Kernel Memory Model
Linux Kernel Memory ModelLinux Kernel Memory Model
Linux Kernel Memory Model
 
An Introduction to the Formalised Memory Model for Linux Kernel
An Introduction to the Formalised Memory Model for Linux KernelAn Introduction to the Formalised Memory Model for Linux Kernel
An Introduction to the Formalised Memory Model for Linux Kernel
 
Design choices of golang for high scalability
Design choices of golang for high scalabilityDesign choices of golang for high scalability
Design choices of golang for high scalability
 
Brief introduction to kselftest
Brief introduction to kselftestBrief introduction to kselftest
Brief introduction to kselftest
 
Understanding of linux kernel memory model
Understanding of linux kernel memory modelUnderstanding of linux kernel memory model
Understanding of linux kernel memory model
 
Let the contribution begin (EST futures)
Let the contribution begin  (EST futures)Let the contribution begin  (EST futures)
Let the contribution begin (EST futures)
 
gcma: guaranteed contiguous memory allocator
gcma:  guaranteed contiguous memory allocatorgcma:  guaranteed contiguous memory allocator
gcma: guaranteed contiguous memory allocator
 
An introduction to_golang.avi
An introduction to_golang.aviAn introduction to_golang.avi
An introduction to_golang.avi
 
Sw install with_without_docker
Sw install with_without_dockerSw install with_without_docker
Sw install with_without_docker
 
Git inter-snapshot public
Git  inter-snapshot publicGit  inter-snapshot public
Git inter-snapshot public
 
Deep dark-side of git: How git works internally
Deep dark-side of git: How git works internallyDeep dark-side of git: How git works internally
Deep dark-side of git: How git works internally
 
Deep dark side of git - prologue
Deep dark side of git - prologueDeep dark side of git - prologue
Deep dark side of git - prologue
 
DO YOU WANT TO USE A VCS
DO YOU WANT TO USE A VCSDO YOU WANT TO USE A VCS
DO YOU WANT TO USE A VCS
 
Experimental android hacking using reflection
Experimental android hacking using reflectionExperimental android hacking using reflection
Experimental android hacking using reflection
 
ash
ashash
ash
 
Hacktime for adk
Hacktime for adkHacktime for adk
Hacktime for adk
 
Let the contribution begin
Let the contribution beginLet the contribution begin
Let the contribution begin
 
Touch Android Without Touching
Touch Android Without TouchingTouch Android Without Touching
Touch Android Without Touching
 

Dernier

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Dernier (20)

Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 

Develop Android app using Golang

  • 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. This slides were presented during 3rd GDG Korea Android Conference (http://event.android.gdg.kr/3rd-GKAC/) The talk video is available at: https://www.youtube.com/watch?v=vMZFjDipaK8&index=2&list=PL_WJkTbDHdBl5QXy6N_bMMBYlKLna5RER
  • 4. Nice To Meet You SeongJae Park sj38.park@gmail.com golang newbie programmer
  • 5. Warning ● This speech could be useless for you ○ This is just for fun http://m.c.lnkd.licdn.com/mpr/mpr/p/4/005/095/091/210ae8c.jpg
  • 6. Warning ● This speech could be useless for you ○ This is just for fun ● Don’t try this at office ○ The code is not stable yet http://m.c.lnkd.licdn.com/mpr/mpr/p/4/005/095/091/210ae8c.jpg
  • 7. golang: Programming Language ● For simple, reliable, and efficient software. http://blog.golang.org/5years/gophers5th.jpg
  • 8. golang: Programming Language ● For simple, reliable, and efficient software. ● Could it be used for simple, reliable, and efficient Android application? http://blog.golang.org/5years/gophers5th.jpg
  • 9. Golang and Android ● Golang supports Android from v1.4 ○ Though it’s still unstable
  • 10. Golang and Android ● Golang supports Android from v1.4 ○ Though it’s still unstable ● https://github.com/golang/mobile ○ Packages and build tools for using Go on Android
  • 11. Goal of This Speak ● Showing how we can use golang on Android ○ By exploring example code
  • 12. Goal of This Speak ● Showing how we can use golang on Android ○ By exploring example code ● Just for fun, rather than profit
  • 13. Pre-requisites ● Basic development environment(vim, git, gcc, java, …) http://www.theprospect.net/wp-content/uploads/2014/02/one-does-not-simply-skip-a-step.jpg
  • 14. Pre-requisites ● Basic development environment(vim, git, gcc, java, …) ● Android SDK & NDK http://www.theprospect.net/wp-content/uploads/2014/02/one-does-not-simply-skip-a-step.jpg
  • 15. Pre-requisites ● Basic development environment(vim, git, gcc, java, …) ● Android SDK & NDK ● Golang 1.4 or higher cross-compiled for GOOS=android http://www.theprospect.net/wp-content/uploads/2014/02/one-does-not-simply-skip-a-step.jpg
  • 16. Pure Golang Android App NO JAVA!
  • 17. Main Idea: Use NDK ● c / c++ only apk is available using NativeActivity ○ Golang be compiled to native binary, too. Why not? http://www.android.pk/images/android-ndk.jpg
  • 18. Main Idea: Use NDK ● c / c++ only apk is available using NativeActivity ○ Golang be compiled to native binary, too. Why not? Plan is... ● Build golang program as .so file ○ ELF shared object ● Implement every callbacks using OpenGL http://www.android.pk/images/android-ndk.jpg
  • 19. Main Idea: Use NDK ● c / c++ only apk is available using NativeActivity ○ Golang be compiled to native binary, too. Why not? Plan is... ● Build golang program as .so file ○ ELF shared object ● Implement every callbacks using OpenGL ● Build NativeActivity apk using NDK / SDK http://www.android.pk/images/android-ndk.jpg
  • 21. Example Code https://github. com/golang/mobile/tree/master/example/basic $ tree . ├── all.bash ├── all.bat ├── AndroidManifest.xml ├── build.xml ├── jni │ └── Android.mk ├── main.go ├── make.bash └── make.bat 1 directory, 8 files
  • 22. main.go: Register Callbacks Register callbacks from golang entrypoint func main() { app.Run(app.Callbacks{ Start: start, Stop: stop, Draw: draw, Touch: touch, }) } (mobile/example/basic/main.go)
  • 23. 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)
  • 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. 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. 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)
  • 27. 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)
  • 28. 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)
  • 29. 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)
  • 30. Pure Golang Android App Pros: No more JAVA! Yay!!! Cons: Should I learn OpenGL to show a cat?
  • 31. Golang as a Library Cooperate Java and Golang
  • 32. Java and C language connected via JNI Main Idea: Use JNI-like way Java CPP JNI
  • 33. Main Idea: Use JNI-like way Java and C language connected via JNI C language and Golang connected via cgo Java CPP GO JNI CGO
  • 34. Main Idea: Use JNI-like way Java and C language connected via JNI C language and Golang connected via cgo ...But, JNI and then cgo looks tedious Java CPP GO JNI CGO
  • 35. Main Idea: Use JNI-like way Java and C language connected via JNI C language and Golang connected via cgo ...But, JNI and then cgo looks tedious Golang supports Java-Golang bind Java CPP GO JNI CGO bind/seq
  • 37. Example Code https://github. com/golang/mobile/tree/ master/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
  • 38. 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)
  • 39. 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)
  • 40. 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 gobind -lang=java github.com/libhello/hi > src/go/hi/Hi.java
  • 41. gobind: Generated .java 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)
  • 42. gobind: Generated .go 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)
  • 43. Golang as a Library Pros: JAVA for UI, Golang for background (Looks efficient enough)
  • 44. Golang as a Library Pros: JAVA for UI, Golang for background (Looks efficient enough) Cons: bind/seq is not so efficient, yet
  • 46. 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...
  • 47. 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
  • 48. 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
  • 50. Example Code https://github.com/sjp38/goOnAndroid https://github.com/sjp38/goOnAndroidFA Were demonstrated by live-coding from GDG Korea DevFair 2014 (http://devfair2014. gdg.kr/) and GDG Golang Seoul Meetup 2015 (https: //developers.google. com/events/5381849181323264/)
  • 51. Golang Process on Android: Plan 1. Cross compile Go program as ARM / Linux
  • 52. Golang Process on Android: Plan 1. Cross compile Go program as ARM / Linux 2. Include the binary in assets/ of Android app
  • 53. 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
  • 54. 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
  • 55. 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
  • 56. 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) { } }
  • 57. 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();
  • 58. Inter Process Communication Pros: Just normal unix way
  • 59. Inter Process Communication Pros: Just normal unix way Golang team is using this for Camlistore (https://github.com/camlistore/camlistore)
  • 60. Inter Process Communication Pros: Just normal unix way Golang team using this for Camlistore (https://github.com/camlistore/camlistore) Cons: Hacky, a little
  • 61. Summary You can use Golang for Android though it’s not stable yet Just for fun
  • 62. 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/.