Clojure and Android Daniel Solano Gómez Sattvik Software & Technology Resources, Ltd. Co.
Clojure/conj 2011
Clojure in Small Places Daniel Solano Gómez Sattvik Software & Technology Resources, Ltd. Co.
Clojure/conj 2011
Clojure to go Daniel Solano Gómez Sattvik Software & Technology Resources, Ltd. Co.
Clojure/conj 2011
Overview Android and the Dalvik VM Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android Daniel Solano Gómez
Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Closing thoughts
What is Android?
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Android architecture
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Android architecture
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Android architecture
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Android architecture
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Android architecture
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
The good news
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
The bad news
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
(= JavaVM DalvikVM)
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
The bad news
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
(= JavaVM DalvikVM) ; => false
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Java VM vs. Dalvik VM
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Java VM vs. Dalvik VM
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM
VM type JIT type Parallel GC?
Java VM
Dalvik VM
stack-based method Yes
register-based trace Only Android 2.3+
Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Java VM vs. Dalvik VM
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM
Java VM
Dalvik VM
VM type JIT type Parallel GC?
stack-based method Yes
register-based trace Only Android 2.3+
Processing power Max heap size
Up to 2×1.2GHz 256MiB+
Up to lots 16-48 MiB
Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Java VM vs. Dalvik VM
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM
Java VM
Dalvik VM
VM type JIT type Parallel GC?
stack-based method Yes
register-based trace Only Android 2.3+
Processing power Max heap size
Up to 2×1.2GHz 256MiB+
Up to lots 16-48 MiB
APIs Executable format
Java SE class
Not quite Java SE Dalvik EXecutable (DEX)
Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
A class file
Daniel Solano Gómez Android and the Dalvik VM
Class file
What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
A class file
Daniel Solano Gómez Android and the Dalvik VM
Class file
What is Android?
Header
Frome source to a running app
Java VM vs. Dalvik VM
What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
A class file
Daniel Solano Gómez Android and the Dalvik VM
Class file
What is Android?
Header
Frome source to a running app
Constant pool
Java VM vs. Dalvik VM
What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
A class file
Daniel Solano Gómez Android and the Dalvik VM
Class file
What is Android?
Header
Frome source to a running app
Constant pool
Java VM vs. Dalvik VM
What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Other data/code
Closing thoughts
Clojure and Android
An application
Daniel Solano Gómez Android and the Dalvik VM
A.class
B.class
C.class
What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
An application
Daniel Solano Gómez Android and the Dalvik VM
App.jar
What is Android? Java VM vs. Dalvik VM Frome source to a running app
A.class
B.class
C.class
What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
A problem
Daniel Solano Gómez Android and the Dalvik VM
App.jar
What is Android? Java VM vs. Dalvik VM Frome source to a running app
A.class
B.class
C.class
What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
Creating a DEX
Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM
App.jar A.class
B.class
classes.dex C.class
Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
Creating a DEX
Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM
App.jar A.class
B.class
classes.dex C.class
Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
Creating a DEX
Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM
App.jar A.class
B.class
classes.dex C.class
Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
Creating a DEX
Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM
App.jar A.class
B.class
classes.dex C.class
Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
Creating a DEX
Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM
App.jar A.class
B.class
classes.dex C.class
Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
Creating a DEX
Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM
App.jar A.class
B.class
classes.dex C.class
Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
An Android application
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app
App.apk classes.dex
What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Installing the application
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM
App.apk classes.dex
Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Installing the application
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app
App.apk
What it all means
classes.dex
Dynamic compilation Performance
DEX
Improving the Clojure/Android experience Closing thoughts
Installing the application
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app
App.apk
What it all means
classes.dex
Dynamic compilation Performance
DEX
ODEX
Improving the Clojure/Android experience Closing thoughts
Installing the application
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance
ODEX
Improving the Clojure/Android experience Closing thoughts
Consequences
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
▶
▶
Loading bytecode in Android is a heavy-weight process. Dynamically loading bytecode is not currently supported.
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Android programming languages Staticly (AOT) compiled
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Android programming languages Interpreted
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM What is Android? Java VM vs. Dalvik VM Frome source to a running app What it all means
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android Daniel Solano Gómez
Android and the Dalvik VM
Android and the Dalvik VM
Dynamic compilation Why? How? Implementation details
Dynamic compilation Why? How? Implementation details
Performance
Performance Improving the Clojure/Android experience Closing thoughts
Improving the Clojure/Android experience Closing thoughts
Dynamic compilation on Android
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Why? How? Implementation details
Performance
Why?
Improving the Clojure/Android experience Closing thoughts
Benefits of dynamic compilation
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Why? How? Implementation details
Performance
▶ ▶
Make the Clojure REPL possible Make Android development faster and easier
Improving the Clojure/Android experience Closing thoughts
A review (defn hello [name] (str "Hello, " name \!))
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Why? How? Implementation details
Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
A review
Daniel Solano Gómez
(defn hello [name] (str "Hello, " name \!))
Android and the Dalvik VM Dynamic compilation Why? How? Implementation details
defn hello
Performance Improving the Clojure/Android experience
name
str "Hello, " name \!
Closing thoughts
Clojure and Android
A review
Daniel Solano Gómez
(defn hello [name] (str "Hello, " name \!))
Android and the Dalvik VM Dynamic compilation Why? How? Implementation details
defn hello
Performance Improving the Clojure/Android experience
name
str "Hello, " name \!
Class
Closing thoughts
What about Android? (defn hello [name] (str "Hello, " name \!))
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Why? How? Implementation details
defn hello
Performance Improving the Clojure/Android experience
name
str "Hello, " name \!
Class
Closing thoughts
What about Android? (defn hello [name] (str "Hello, " name \!))
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Why? How? Implementation details
defn hello
Performance Improving the Clojure/Android experience
name
str "Hello, " name \!
ODEX
Closing thoughts
What about Android? (defn hello [name] (str "Hello, " name \!))
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Why? How? Implementation details
defn hello
Performance Improving the Clojure/Android experience
name
str "Hello, " name \!
ODEX
Closing thoughts
A new class loader
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Why? How?
URLClassLoader
Implementation details
Performance
defineClass()
Improving the Clojure/Android experience Closing thoughts
DynamicClassLoader
A new class loader URLClassLoader
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation
defineClass()
Why? How? Implementation details
Performance
DynamicClassLoader
Improving the Clojure/Android experience Closing thoughts
defineMissingClass()
JvmDynamicClassLoader
DalvikDynamicClassLoader
The Dalvik process
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation
(defn hello [name] (str "Hello, " name \!))
Why? How? Implementation details
Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
The Dalvik process
Daniel Solano Gómez Android and the Dalvik VM
(defn hello [name] (str "Hello, " name \!))
Dynamic compilation
defn hello
Why? How? Implementation details
name
str "Hello, " name \!
Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android
The Dalvik process
Daniel Solano Gómez Android and the Dalvik VM
(defn hello [name] (str "Hello, " name \!))
Dynamic compilation
defn hello
Why? How? Implementation details
name
str "Hello, " name \!
Performance Improving the Clojure/Android experience
Class
Closing thoughts
Clojure and Android
The Dalvik process
Daniel Solano Gómez Android and the Dalvik VM
(defn hello [name] (str "Hello, " name \!))
Dynamic compilation
defn hello
Why? How? Implementation details
name
str "Hello, " name \!
Performance Improving the Clojure/Android experience
DEX
Class
Closing thoughts
Clojure and Android
The Dalvik process
Daniel Solano Gómez Android and the Dalvik VM
(defn hello [name] (str "Hello, " name \!))
Dynamic compilation
defn hello
Why? How? Implementation details
name
str "Hello, " name \!
Performance Improving the Clojure/Android experience
APK
DEX
Class
Closing thoughts
Clojure and Android
The Dalvik process
Daniel Solano Gómez Android and the Dalvik VM
(defn hello [name] (str "Hello, " name \!))
Dynamic compilation
defn hello
Why? How? Implementation details
name
str "Hello, " name \!
Performance Improving the Clojure/Android experience
ODEX
APK
DEX
Class
Closing thoughts
Choosing the right DynamicClassLoader ▶
▶
▶
▶
New var: clojure.core/*vm-type* May be either :dalvik-vm or :java-vm Setting depends on java.vm.name system property Decision takes place in RT.makeClassLoader()
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Why? How? Implementation details
Performance Improving the Clojure/Android experience Closing thoughts
New dependency
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM
▶
▶
▶
▶
Relies on code from Android SDK to perform class → DEX transformation Current process extracts code from dx.jar A source-based dependency would be better Source available under Apache License 2.0
Dynamic compilation Why? How? Implementation details
Performance Improving the Clojure/Android experience Closing thoughts
Android compatibility
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Why? How?
▶
▶
Doesn’t work on versions earlier than 2.1 Contains workaround for bug 5697 (fixed in Android 2.2)
Implementation details
Performance Improving the Clojure/Android experience Closing thoughts
Clojure compatibility
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation
▶
▶
▶
All Dalvik-related code is loaded reflectively Some complex macros may not compile due to size limitations clojure.core/bean not available due lack of java.beans API
Why? How? Implementation details
Performance Improving the Clojure/Android experience Closing thoughts
Clojure and Android Daniel Solano Gómez
Android and the Dalvik VM
Android and the Dalvik VM
Dynamic compilation
Dynamic compilation
Performance Benchmarks Analysis Improving the Clojure/Android experience Closing thoughts
Performance Benchmarks Analysis
Improving the Clojure/Android experience Closing thoughts
Benchmarking Clojure and the competition
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation
▶ ▶ ▶ ▶ ▶
Clojure 1.2.1 (Android version) Clojure 1.3 (unmodified) Java Scala (Scala 2.9.1) Ruby (JRuby 1.6.5, ruboto-core-0.5.1)
Performance Benchmarks Analysis
Improving the Clojure/Android experience Closing thoughts
Package size (MB)
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Benchmarks Analysis
Improving the Clojure/Android experience Closing thoughts
Installed size (MB)
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Benchmarks Analysis
Improving the Clojure/Android experience Closing thoughts
Startup time (s)
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Benchmarks Analysis
Improving the Clojure/Android experience Closing thoughts
Heap size (MB)
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Benchmarks Analysis
Improving the Clojure/Android experience Closing thoughts
Question
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation
Where did all the time and space go?
Performance Benchmarks Analysis
Improving the Clojure/Android experience Closing thoughts
Answer
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Benchmarks Analysis
clojure.core
Improving the Clojure/Android experience Closing thoughts
Top 10 space hogs
Clojure and Android Daniel Solano Gómez
By retained heap in bytes
Android and the Dalvik VM
clojure.core/*out* Class clojure.java.io.__init Class clojure.lang.Compiler Class clojure.deftype__init clojure.core/*in* clojure.core.protocols namespace Class clojure.lang.Namespace clojure.java.io namespace clojure.core namespace Class clojure.core__init
8,608 12,784 13,152 14,024 25,056 25,584 26,480 31,488 34,992 203,616
TOTAL
395,784
Dynamic compilation Performance Benchmarks Analysis
Improving the Clojure/Android experience Closing thoughts
Measuring time, a test
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Benchmarks Analysis
// equivalent to (+ 1 2 3) RT.var(”clojure.core”,”+”) .invoke(1,2,3);
Improving the Clojure/Android experience Closing thoughts
Test results
Clojure and Android Daniel Solano Gómez
Times are in milliseconds
Android and the Dalvik VM Dynamic compilation Performance Benchmarks Analysis
Iteration
RT.var()
Var.invoke()
1 2
0.240 0.299
0.397 0.345
Total 7,856.773 0.686
Improving the Clojure/Android experience Closing thoughts
Where did 7.8 seconds go? CPU time clojure.lang.RT.doInit()
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Benchmarks
95.8%
Analysis
Improving the Clojure/Android experience Closing thoughts
Where did 7.8 seconds go? CPU time RT.load("clojure/core")
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Benchmarks
83.2%
Analysis
Improving the Clojure/Android experience Closing thoughts
12.5%
(in-ns 'user) (refer 'clojure.core)
Where did 7.8 seconds go? Object churn
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance
Count
Size (MiB)
Allocated 128,280 Freed 91,259
4.65 3.63
Net
1.02
37,021
Benchmarks Analysis
Improving the Clojure/Android experience Closing thoughts
Improving performance
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation
▶ ▶ ▶ ▶ ▶
Remove user namespace Remove metadata Transients during initialization Serializable clojure.core Source-level tree shaker
Performance Benchmarks Analysis
Improving the Clojure/Android experience Closing thoughts
Clojure and Android Daniel Solano Gómez
Android and the Dalvik VM
Android and the Dalvik VM
Dynamic compilation
Dynamic compilation Performance
Performance Improving the Clojure/Android experience Closing thoughts
Improving the Clojure/Android experience Closing thoughts
Making Clojure a first-class language for Android development
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Improving the Clojure/Android experience
▶ ▶ ▶
Improve performance Standard library Development tools
Closing thoughts
Neko: The Clojure/Android Toolkit
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance
▶
▶
▶ ▶
Available from github.com/sattvik/neko Ease object-oriented/functional impedance mismatch Reduce boilerplate Integrate into Clojure-contrib?
Improving the Clojure/Android experience Closing thoughts
Development tools
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance
▶
▶ ▶
Android development version of Clojure Build tools REPL/dynamic development tools
Improving the Clojure/Android experience Closing thoughts
Android development version of Clojure
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance
▶
▶
Available from github.com/sattvik/clojure Needs: ▶ ▶
▶
Upgrade to Clojure 1.3 Better handling of dx tool integration
Merge upstream?
Improving the Clojure/Android experience Closing thoughts
Build tools
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance
▶
▶
Neko provides some helper code for Ant/Android SDK Would be nice to see support from mainstream Clojure tools
Improving the Clojure/Android experience Closing thoughts
REPL/dynamic development tools
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance
▶
▶
▶
Requires Android development version of Clojure VimClojure works with some minor modifications Would be good to see tools compatible with nrepl, Emacs, etc.
Improving the Clojure/Android experience Closing thoughts
Clojure and Android Daniel Solano Gómez
Android and the Dalvik VM
Android and the Dalvik VM
Dynamic compilation
Dynamic compilation Performance
Performance Improving the Clojure/Android experience Closing thoughts
Improving the Clojure/Android experience Closing thoughts
Android and Clojure
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Android and Clojure
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM
▶
▶
▶
Clojure has the potential to be a first-class language for Android development. Dynamic development on Android is a killer feature. It needs better tool and community support.
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
What about ClojureScript?
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation
▶ ▶
▶
Should work for web apps Might work with mobile development frameworks For native development, constrained by availability of JavaScript engines
Performance Improving the Clojure/Android experience Closing thoughts
Decaffeinated Android
Clojure and Android Daniel Solano Gómez
Developing on Android without Java
Android and the Dalvik VM
Decaffeinated Android
Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts
Daniel Solano Gómez
Questions? Blog Twitter E-mail Group
www.deepbluelambda.org @deepbluelambda
[email protected] groups.google.com/group/ clojure-android Clojure REPL for Android:
Clojure and Android Daniel Solano Gómez Android and the Dalvik VM Dynamic compilation Performance Improving the Clojure/Android experience Closing thoughts