这是indexloc提供的服务,不要输入任何密码
SlideShare a Scribd company logo
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/.

More Related Content

What's hot (20)

PPTX
Performance Testing REST APIs
Jason Weden
 
PPTX
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판
BJ Jang
 
PDF
Phonebook Directory or Address Book In Android
ABHISHEK DINKAR
 
PPTX
Finacle 3tier-architecture-converted
Mani kandan
 
PDF
Mobile App Development
Chris Morrell
 
PPTX
Presentation on mobile app testing
Uttam Shrestha
 
DOCX
Narmesh 3 yrs Manual testing resume
narmesh enukurthi
 
PDF
지리정보체계(GIS) - [4] QGIS를 이용한 밀도 추정
Byeong-Hyeok Yu
 
PDF
API Management Solution Powerpoint Presentation Slides
SlideTeam
 
PDF
Painless visual testing
gojkoadzic
 
PDF
Gravitee API Management - Ahmet AYDIN
kloia
 
PPT
android-tutorial-for-beginner
Ajailal Parackal
 
PDF
Retrieval Augmented Generation Evaluation with Ragas
Zilliz
 
PDF
웹을 지탱하는 기술
정혁 권
 
PPTX
정해균 포트폴리오
Haegyun Jung
 
PPTX
Android vs ios System Architecture in OS perspective
Raj Pratim Bhattacharya
 
PDF
Native vs. Hybrid Apps
Visual Net Design
 
PPTX
Progressive Web Apps(PWA)
Muhamad Fahriza Novriansyah
 
PDF
Front-End Testing: Demystified
Seth McLaughlin
 
Performance Testing REST APIs
Jason Weden
 
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판
BJ Jang
 
Phonebook Directory or Address Book In Android
ABHISHEK DINKAR
 
Finacle 3tier-architecture-converted
Mani kandan
 
Mobile App Development
Chris Morrell
 
Presentation on mobile app testing
Uttam Shrestha
 
Narmesh 3 yrs Manual testing resume
narmesh enukurthi
 
지리정보체계(GIS) - [4] QGIS를 이용한 밀도 추정
Byeong-Hyeok Yu
 
API Management Solution Powerpoint Presentation Slides
SlideTeam
 
Painless visual testing
gojkoadzic
 
Gravitee API Management - Ahmet AYDIN
kloia
 
android-tutorial-for-beginner
Ajailal Parackal
 
Retrieval Augmented Generation Evaluation with Ragas
Zilliz
 
웹을 지탱하는 기술
정혁 권
 
정해균 포트폴리오
Haegyun Jung
 
Android vs ios System Architecture in OS perspective
Raj Pratim Bhattacharya
 
Native vs. Hybrid Apps
Visual Net Design
 
Progressive Web Apps(PWA)
Muhamad Fahriza Novriansyah
 
Front-End Testing: Demystified
Seth McLaughlin
 

Similar to Develop Android app using Golang (20)

PDF
Develop Android/iOS app using golang
SeongJae Park
 
PDF
Mobile Apps by Pure Go with Reverse Binding
Takuya Ueda
 
PDF
Go for Mobile Games
Takuya Ueda
 
PDF
Android is going to Go! - Android and goland - Almog Baku
DroidConTLV
 
PDF
Android is going to Go! Android and Golang
Almog Baku
 
PDF
(Live) build and run golang web server on android.avi
SeongJae Park
 
PDF
Gomobile: gophers in the land of Android
Jovica Popovic
 
PDF
Java to Golang: An intro by Ryan Dawson Seldon.io
Mauricio (Salaboy) Salatino
 
PDF
Porting golang development environment developed with golang
SeongJae Park
 
PPTX
Android ndk
Sentinel Solutions Ltd
 
PPTX
Android NDK
Sentinel Solutions Ltd
 
PPTX
Android ndk - Introduction
Rakesh Jha
 
PDF
Introduction to Go
Simon Hewitt
 
PPTX
Ready, set, go! An introduction to the Go programming language
RTigger
 
PDF
Running native code on Android #OSDCfr 2012
Cédric Deltheil
 
PPTX
Comparing C and Go
Marcin Pasinski
 
PDF
Android Native Development Kit
Peter R. Egli
 
PDF
Golang execution modes
Ting-Li Chou
 
PDF
Physical Computing Using Go and Arduino
Justin Grammens
 
PDF
Mender.io | Develop embedded applications faster | Comparing C and Golang
Mender.io
 
Develop Android/iOS app using golang
SeongJae Park
 
Mobile Apps by Pure Go with Reverse Binding
Takuya Ueda
 
Go for Mobile Games
Takuya Ueda
 
Android is going to Go! - Android and goland - Almog Baku
DroidConTLV
 
Android is going to Go! Android and Golang
Almog Baku
 
(Live) build and run golang web server on android.avi
SeongJae Park
 
Gomobile: gophers in the land of Android
Jovica Popovic
 
Java to Golang: An intro by Ryan Dawson Seldon.io
Mauricio (Salaboy) Salatino
 
Porting golang development environment developed with golang
SeongJae Park
 
Android ndk - Introduction
Rakesh Jha
 
Introduction to Go
Simon Hewitt
 
Ready, set, go! An introduction to the Go programming language
RTigger
 
Running native code on Android #OSDCfr 2012
Cédric Deltheil
 
Comparing C and Go
Marcin Pasinski
 
Android Native Development Kit
Peter R. Egli
 
Golang execution modes
Ting-Li Chou
 
Physical Computing Using Go and Arduino
Justin Grammens
 
Mender.io | Develop embedded applications faster | Comparing C and Golang
Mender.io
 
Ad

More from SeongJae Park (20)

PDF
Biscuit: an operating system written in go
SeongJae Park
 
PDF
GCMA: Guaranteed Contiguous Memory Allocator
SeongJae Park
 
PDF
Linux Kernel Memory Model
SeongJae Park
 
PDF
An Introduction to the Formalised Memory Model for Linux Kernel
SeongJae Park
 
PDF
Design choices of golang for high scalability
SeongJae Park
 
PDF
Brief introduction to kselftest
SeongJae Park
 
PDF
Understanding of linux kernel memory model
SeongJae Park
 
PDF
Let the contribution begin (EST futures)
SeongJae Park
 
PDF
gcma: guaranteed contiguous memory allocator
SeongJae Park
 
PDF
An introduction to_golang.avi
SeongJae Park
 
PDF
Sw install with_without_docker
SeongJae Park
 
PDF
Git inter-snapshot public
SeongJae Park
 
PDF
Deep dark-side of git: How git works internally
SeongJae Park
 
PDF
Deep dark side of git - prologue
SeongJae Park
 
PDF
DO YOU WANT TO USE A VCS
SeongJae Park
 
PDF
Experimental android hacking using reflection
SeongJae Park
 
PDF
Hacktime for adk
SeongJae Park
 
PDF
Let the contribution begin
SeongJae Park
 
PDF
Touch Android Without Touching
SeongJae Park
 
Biscuit: an operating system written in go
SeongJae Park
 
GCMA: Guaranteed Contiguous Memory Allocator
SeongJae Park
 
Linux Kernel Memory Model
SeongJae Park
 
An Introduction to the Formalised Memory Model for Linux Kernel
SeongJae Park
 
Design choices of golang for high scalability
SeongJae Park
 
Brief introduction to kselftest
SeongJae Park
 
Understanding of linux kernel memory model
SeongJae Park
 
Let the contribution begin (EST futures)
SeongJae Park
 
gcma: guaranteed contiguous memory allocator
SeongJae Park
 
An introduction to_golang.avi
SeongJae Park
 
Sw install with_without_docker
SeongJae Park
 
Git inter-snapshot public
SeongJae Park
 
Deep dark-side of git: How git works internally
SeongJae Park
 
Deep dark side of git - prologue
SeongJae Park
 
DO YOU WANT TO USE A VCS
SeongJae Park
 
Experimental android hacking using reflection
SeongJae Park
 
Hacktime for adk
SeongJae Park
 
Let the contribution begin
SeongJae Park
 
Touch Android Without Touching
SeongJae Park
 
Ad

Recently uploaded (20)

PDF
HR agent at Mediq: Lessons learned on Agent Builder & Maestro by Tacstone Tec...
UiPathCommunity
 
PPTX
Lecture 5 - Agentic AI and model context protocol.pptx
Dr. LAM Yat-fai (林日辉)
 
PDF
visibel.ai Company Profile – Real-Time AI Solution for CCTV
visibelaiproject
 
PPTX
Extensions Framework (XaaS) - Enabling Orchestrate Anything
ShapeBlue
 
PDF
NewMind AI Journal - Weekly Chronicles - July'25 Week II
NewMind AI
 
PDF
Lecture A - AI Workflows for Banking.pdf
Dr. LAM Yat-fai (林日辉)
 
PDF
UiPath vs Other Automation Tools Meeting Presentation.pdf
Tracy Dixon
 
PDF
"Effect, Fiber & Schema: tactical and technical characteristics of Effect.ts"...
Fwdays
 
PDF
Productivity Management Software | Workstatus
Lovely Baghel
 
PDF
Julia Furst Morgado The Lazy Guide to Kubernetes with EKS Auto Mode + Karpenter
AWS Chicago
 
PDF
Women in Automation Presents: Reinventing Yourself — Bold Career Pivots That ...
DianaGray10
 
PDF
Apache CloudStack 201: Let's Design & Build an IaaS Cloud
ShapeBlue
 
PDF
CIFDAQ Market Insight for 14th July 2025
CIFDAQ
 
PDF
Arcee AI - building and working with small language models (06/25)
Julien SIMON
 
PPTX
Earn Agentblazer Status with Slack Community Patna.pptx
SanjeetMishra29
 
PDF
Generative AI in Healthcare: Benefits, Use Cases & Challenges
Lily Clark
 
PDF
Bitcoin+ Escalando sin concesiones - Parte 1
Fernando Paredes García
 
PDF
2025-07-15 EMEA Volledig Inzicht Dutch Webinar
ThousandEyes
 
PDF
Ampere Offers Energy-Efficient Future For AI And Cloud
ShapeBlue
 
PDF
How a Code Plagiarism Checker Protects Originality in Programming
Code Quiry
 
HR agent at Mediq: Lessons learned on Agent Builder & Maestro by Tacstone Tec...
UiPathCommunity
 
Lecture 5 - Agentic AI and model context protocol.pptx
Dr. LAM Yat-fai (林日辉)
 
visibel.ai Company Profile – Real-Time AI Solution for CCTV
visibelaiproject
 
Extensions Framework (XaaS) - Enabling Orchestrate Anything
ShapeBlue
 
NewMind AI Journal - Weekly Chronicles - July'25 Week II
NewMind AI
 
Lecture A - AI Workflows for Banking.pdf
Dr. LAM Yat-fai (林日辉)
 
UiPath vs Other Automation Tools Meeting Presentation.pdf
Tracy Dixon
 
"Effect, Fiber & Schema: tactical and technical characteristics of Effect.ts"...
Fwdays
 
Productivity Management Software | Workstatus
Lovely Baghel
 
Julia Furst Morgado The Lazy Guide to Kubernetes with EKS Auto Mode + Karpenter
AWS Chicago
 
Women in Automation Presents: Reinventing Yourself — Bold Career Pivots That ...
DianaGray10
 
Apache CloudStack 201: Let's Design & Build an IaaS Cloud
ShapeBlue
 
CIFDAQ Market Insight for 14th July 2025
CIFDAQ
 
Arcee AI - building and working with small language models (06/25)
Julien SIMON
 
Earn Agentblazer Status with Slack Community Patna.pptx
SanjeetMishra29
 
Generative AI in Healthcare: Benefits, Use Cases & Challenges
Lily Clark
 
Bitcoin+ Escalando sin concesiones - Parte 1
Fernando Paredes García
 
2025-07-15 EMEA Volledig Inzicht Dutch Webinar
ThousandEyes
 
Ampere Offers Energy-Efficient Future For AI And Cloud
ShapeBlue
 
How a Code Plagiarism Checker Protects Originality in Programming
Code Quiry
 

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