【Android】Scala IDEを使ったAndroidの開発環境を構築する

特に何を作りたいわけでもないんですが、ちょっとしたツールを作るならJavaよりScalaの方が何かと楽ちんなので、開発環境を構築することにしました。

一昔前だと「Scalaで出来なくもないけどクソ重い」とか「ADTと衝突してビルドがクソ面倒」とかそんな記事をちらほら見かけたんですが、やっぱり今更Java SE 6なんか書きたくないScalaをどうしても使いたい人が多かったのでしょう。Scala IDEチュートリアルを参考にちょっとしたプラグインを入れるだけで簡単に開発環境を作ることが出来ました。

既にインストールしていることが前提のもの

今回試してみた環境ではEclipsePleiades)は4.3.2(Kepler)、ADTは22.6.3を使用しています。「ADT ver.22からはJava 7が正式対応!」と言うのを今更知りまして、ADTをバージョンアップし、うきうきしながらダイアモンドオペレータを試してみたら「Kitkatじゃないと端末のコンパイラが対応してない」と言われて酷い悲しみに襲われたんですが、まぁそんな話はどうでもいいです。

0.Scalaをインストールする

持ってなかったら入れてきましょう。

後でインストールするEclipseプラグインScala IDEは今時点で最新版のScala 2.11.1まで対応していますが、使っているEclipseのバージョンによって対応度合いが違うので、念のため確認しておきましょう。

また、古いバージョンのScalaはここに一覧があります。何も考えずに最新版をインストールして動かないなんてことがないようにしましょう。

1.Scala IDEをインストールする

Update Siteがこの辺に色々書いてあります。自分が使っているEclipseのバージョンのUpdate Siteをいつものようにぶち込めばOKです。とりあえず「Eclipse Scala IDE」だけは絶対にインストールしておきましょう。

2.AndroidProguardScalaをインストールする

最後にAndroidProguardScalaと言うプラグインをインストールします。

これはScala + Java + ADTの死ぬほど面倒なビルド工程を自動化してくれるプラグインです。これもScala 2.11.1に対応しています。

3.Android ProjectにAndroidProguardScalaを適用する

AndroidProguardScalaをインストールした状態で既存のAndroid Projectの上で右クリックすると「Add AndroidProguardScala Nature」と言う項目が増えています。それをクリックしましょう。それだけでOKです。簡単ですね。

4.Android ProjectをScala Projectに変換する

基本的にはもうこの時点でScalaもビルド出来るみたいなんですが、Eclipseちゃんは頭が悪いのでScalaのクラスファイルを作成しようとすると「Scalaのプロジェクトじゃないから追加できないよ!」と言い出します。

対象のプロジェクトを右クリックし、「構成」から「Scala ネーチャーの追加」を選択しましょう。これでScala Projectへ変換できます。(Scala ProjectからAndroid Projectへの変換はできないので注意)

5.どんどんコーディングする

後は好きなようにコーディングするだけです。

サンプルプロジェクトをGitHubの方にあげておきました。srcを見ればわかる通り、JavaファイルとScalaファイルが混在していても特に問題ありません。(仕組みを考えたらそりゃそうだって感じだけど)

なので既存のプロジェクトでも割と気軽にScalaを付け足すことができます。(使いやすいとは言っていない)

私の環境で試しに実行してみようとしたらなぜかJUnitで実行しようとしたので、実行の構成ぐらいは自分で作ってあげる必要があるかもしれません。まぁ大した手間じゃないでしょう。

[2014/06/14追記]

6.AndroidProguardScalaの設定をする

コーディングが終わったらビルドです。

このままapkを端末に持って行っても、Androidは当然Scalaのライブラリを持っていないので実行出来ません。例えばOptionなんかを使っていたら、scala.Optionが見つからなくてNoClassDefFoundErrorが発生してしまいます。

AndroidProguardScalaではどうやってこれに対処しているかと言うと、プロジェクトのlibsに「scala_library.min.jar」と言うjarを作ってあげることで対処しています。

プロジェクトのプロパティから「AndroidProguardScala」を選択し、Scalaのライブラリに対して「Input Jar」を選択しましょう。

どうやらビルドパスから推測しているらしく、Androidのライブラリや、libsに入っている他のJarも選択候補に出てきてしまいます。Scalaに関係無いものは「Library Jar」にしておくとか、使ってないものは「無視」を選択しておきましょう。全部Input Jarにつっこむとscala_library.min.jarのサイズがとんでもないことになります。

画像にも(英語で)書いてありますが、AndroidProguardScalaの設定はあくまでScalaのもろもろが入ったjarをProGuardに対してInput Jar or Library Jarとして設定出来るようにするだけです。(Input JarとかLibrary Jarってなに?って人はこちらの記事をどうぞ。)

最終的にProGuardで圧縮+難読化をする対象はここで設定したjarになりますし、当然エントリポイントをproguard-project.txtに記述していなければガンガン圧縮されます。と言うわけで、実際にリリースする際には使っているScalaのパッケージを記述しておかなければなりません。

ただ、traitとかimplicitによるメソッド拡張とか使っているとどうなっちゃうのかいまいちわからないので、色々と悪戦苦闘する可能性もあります。頑張りましょう。

[2014/06/14追記ここまで]

まとめ

と言うわけで非常に簡単にAndroidScalaが使えるようになっていました。

ちなみに先程のプロジェクト、アプリでのサイズは(Proguardを一切使わずに)0.98MBとのこと。重いのか軽いのかは各自の判断にお任せします。

いつ対応するかわからないJava 8を待つよりScalaをマスターしてガンガン書いてみるのも一興ではないでしょうか。