Clojure
ClojureDay 13

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

More than 1 year has passed since last update.

はじめに

最新版の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/