clojure-androidのAndroid5.0対応について


# はじめに
最新版のAndorid 5.0(Lolipop)は、Dalvik Runtimeを捨てて、ART Runtimeのみに対応しています。
そのため、ART Runtimeで動かないアプリは、今後Google Playから徐々に消えてくことになります。
予告していた一方のiOS(fruit) 64bit対応については調査中です。

# clojure側のAndroid 5.0対応状況について
現在、ART Runtime上で公式版のclojure 1.7.0は実行できません。

clojure-androidのメンテナーが解決策をみつけて提案したものの、clojure本家では対応していません。
なぜかというと、どうやらJVMの規約に対してART Runtimeの実装に問題があるという認識のためのようです。

いまのところはclojure-android側で修正した物を使う必要があります。（もともとandroidでは修正版が必要でした）
http://clojure-android.info/blog/2014/12/03/clojure-now-works-on/

# 対応方法 (新規プロジェクトの場合)
チュートリアルを参考にプロジェクトを作りましょう。
https://github.com/clojure-android/lein-droid/wiki/Tutorial

Android SDKをインストールして、Android SDK ManagerでAndroid 4.4(API19)をインストールします。

lein droidサブコマンドが使えるように ~/.lein/profiles.cljに下記のコードを追加します。
まだLolipop対応の最新版になっていないため、後で書き換えます。

```clj:
{:user {:plugins [ [lein-droid "0.3.0-beta4"] ]}}

```

```bash:
lein droid new clojuroid org.stuff.clojuroid :activity MyActivity :target-sdk 19 :app-name ClojureMeetsAndroid
```

project.cljを書き換えます。

```clj:
[org.clojure-android/clojure "1.7.0-alpha3" :use-resources true]
;↓
[org.clojure-android/clojure "1.7.0-alpha4" :use-resources true]

[neko/neko "3.1.0-preview2"]
;↓
[neko/neko "3.1.0-preview3"]

[org.clojure-android/tools.nrepl "0.2.6"]
;↓
[org.clojure-android/tools.nrepl "0.2.6-lollipop"]

```

neko3.1.0が、JDK7以上の必要が有るため、JAVA_HOMEを変えて実行します。

```bash:
# OSXの場合
export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
```

以下、Lollipop端末をデバッグモードでつないで、インストール・起動まで行います。

```bash:
cd clojuroid
lein droid doall
```

「Hello from Clojure!」が表示されたら成功です。

# 対応方法（既存プロジェクトの場合）
以前作ったプロジェクトがある場合は、clojure、neko、nreplを対応版に入れ替えましょう。

```clj:
[org.clojure-android/clojure "1.7.0-alpha4" :use-resources true]
[neko/neko "3.1.0-preview3"]
[org.clojure-android/tools.nrepl "0.2.6-lollipop"]
```

AOT対象から関数を除外します。

```clj:
:android {
            :aot-exclude-ns ["clojure.parallel" "clojure.core.reducers"
                             "cljs-tooling.complete" "cljs-tooling.info"
                             "cljs-tooling.util.analysis" "cljs-tooling.util.misc"
                             "cider.nrepl" "cider-nrepl.plugin"]
}
```

また、neko 3.0.0以上は、JDK7以上が必要なので、
JAVA_HOMEを切り替えましょう。

[clojure-complete](https://github.com/ninjudd/clojure-complete)を使っている場合は、後継の[compliment](https://github.com/alexander-yakushev/compliment)に切り替える必要があるかもしれません。

# 次の一歩
もう少し複雑なアプリを試してみましょう。

```
git clone https://github.com/alexander-yakushev/events
```

チュートリアル
https://github.com/alexander-yakushev/events/blob/master/tutorial.md

同じようにやってみましょう。


# その他
* nreplを使う複数のアプリを起動しようとすると、portが衝突して起動できない事があります。
* ART Runtimeでは、毎回ART側のAOT処理が走るため、nreplからの操作は以前より重いです。
* Play Storeにあるclojureアプリは、くろニャア、Figurehead、Clojure REPLですが今のところLollipop未対応です。


# 参考文献
Clojure on Android
http://clojure-android.info/

Clojure now works on Android 5.0 Lollipop - Clojure on Android
http://clojure-android.info/blog/2014/12/03/clojure-now-works-on/

Introducing ART | Android Developers
http://source.android.com/devices/tech/dalvik/art.html

clojure android側で、最近対応したところ
https://github.com/clojure-android/neko/issues/37

clojure本家で、対応されてないところ
http://dev.clojure.org/jira/browse/CLJ-1472

2013年末のML (Android 4.4について)
https://groups.google.com/forum/#!topic/clojure-android/J4cxkMRW2QA

Xamarin Android 4.12での対応
http://developer.xamarin.com/releases/android/xamarin.android_4/xamarin.android_4.12/