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

Clojure and Android - GitHub

Improving the Clojure/Android experience. Closing thoughts. Page 5. Clojure and. Android. Daniel Solano. Gómez. Android and the. Dalvik VM ... Page 10 ...

3MB Sizes 3 Downloads 277 Views

Recommend Documents

Clojure & JRuby - GitHub
Clojure likes one big process, lots of threads. • Ruby prefers lots of small ... Duplication. • DB connections. • DB models. • Test data. Monday, March 19, 12 ...

Clojure for Beginners - GitHub
Preview. Language. Overview. Clojure Basics & .... (clojure.java.io/reader file))]. (doseq [line .... Incremental development via REPL ⇒ less unexpected surprises ...

RetroArch Android Manual - GitHub
May 28, 2013 - 7 Core Config Settings. 17. 8 RetroArch on other platforms. 17. 9 About Us. 19. 10 Troubleshooting. 19. 10.1 For non-jailbroken devices only .

android sai tech - GitHub
Chapter 1: What is ANDROID 2. Chapter 2: Android Installation. Chapter 3: Android Application & Components. Chapter 4: AndroidManifest.xml. Chapter 5 : ...

DevOps for the JVM @tbatchelli aka @disclojure Clojure ... - GitHub
Configure clustered services. • Deploy software. • Manage software/servers/services. 2. Saturday, March 17, 12 ... works with every cloud (via jclouds) and more.

android sai tech (2) - GitHub
Android is a mobile operating system that is based on a modified version of Linux. It was originally developed by a startup of the same name, .... Page 10 ...

Advanced Android Application Security Case Studies - GitHub
Flanker. KEEN TEAM. Advanced Android Application Security Case Studies ... Give a basic description of Android Security Mechanism. Vulnerability ... Page 10 ...

Boston Clojure Meetup -
mobile web. ClojureScript. +. X. = hybrid app. Clojure. +. RoboVM (iOS)/ various (Android). = native app. Android's already Java. On. iOS, compile Java bytecode ...

Boston Clojure Meetup -
“Create truly native iOS apps in Java”. Two things ... http://docs.robovm.com/advanced-topics/bro.html ... libraries, not an abstraction on top of iOS/Android. 3. ... The right tool for native development depends on why you want native in the fir

CopperDroid - On the Reconstruction of Android Malware ... - GitHub
Oct 11, 2014 - Android apps written (mostly) in Java and run in a Java-like. (Dalvik) VM as .... THE BINDER PROTOCOL. IPC/RPC. The Binder protocol enables fast inter-process communication between Apps or between Apps and the system. It also allows ..

Download Professional Clojure Full eBook
Web Development with Clojure: Build Bulletproof Web Apps with Less Code · The Joy of ... Mastering Clojure Macros: Write Cleaner, Faster, Smarter Code.

Download Programming Clojure Full Books
Mastering Clojure Macros: Write Cleaner, Faster, Smarter Code · Building Microservices · Structure and Interpretation of Computer Programs, 2nd Edition (MIT ...

OpenIAB Plugin. Open In-App Billing for Android, iOS and ... - GitHub
Integration OpenIAB with your Unity project. 1. Import OpenIAB plugin package into your project. 2. Make sure that Assets->Plugins contains folder structure.

Categories and Haskell - GitHub
This is often summarized as a side-effect free function. More generally ... The composition g ◦ f is only defined on arrows f and g if the domain of g is equal to the codomain of f. ...... http://files.meetup.com/3866232/foldListProduct.pdf ... Pag

Explore and Challenge - GitHub
Select the Variables tab and add a new variable by pressing the "Make a variable" button, call it Score and set it to be For all sprites. We will also need to create a list to hold our sequence of lights, we will call it GameList: Press the "Make a l

stack and heap - GitHub
class Tetromino : public cocos2d::Node. { public: static Tetromino* createWithType(TetrominoType type); void rotate(bool right); int getHeightInBlocks() const;.

Explore and Challenge - GitHub
Explore and Challenge Scratch GPIO: Pi-Stop Traffic Sequence - Create your own ... Once you have started the Raspberry Pi desktop, open Scratch using the ...

Hardware and Representation - GitHub
E.g. CPU can access rows in one module, hard disk / another CPU access row in ... (b) Data Bus: bidirectional, sends a word from CPU to main memory or.

Explore and Challenge - GitHub
WORKSHEET: Tick the checkbox marked "I've created the Pi-Stop STOP and GO sequences". The Final Program - Changing Lights. At the moment our program ...

Posters and LATEX - GitHub
Aug 23, 2011 - and there is even another website, which uses this document class and TikZ ... 1The URL is http://theoval.cmp.uea.ac.uk/~nlct/latex/posters/index.html ... and Thomas Deselaers have created the beamerposter package, which ...