はじめに
最新版の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対応の最新版になっていないため、後で書き換えます。
{:user {:plugins [ [lein-droid "0.3.0-beta4"] ]}}
lein droid new clojuroid org.stuff.clojuroid :activity MyActivity :target-sdk 19 :app-name ClojureMeetsAndroid
project.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を変えて実行します。
# OSXの場合
export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
以下、Lollipop端末をデバッグモードでつないで、インストール・起動まで行います。
cd clojuroid
lein droid doall
「Hello from Clojure!」が表示されたら成功です。
対応方法(既存プロジェクトの場合)
以前作ったプロジェクトがある場合は、clojure、neko、nreplを対応版に入れ替えましょう。
[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対象から関数を除外します。
: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を使っている場合は、後継の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/