既存の Android プロジェクトに sbt + android-plugin で scala コードを追加する

javaAndroid アプリケーションを書くのが嫌になりました。矢張り java より scala でしょう。

一から作る場合は giter8適当にやれば、特に問題なくできるわけですが、既存のプロジェクトに scala コードを追加する場合、どうやればいいかよく分からなかったので少し調べました。成果物は github にあります。
まず普通に `android create project` でプロジェクトを作ります

次に giter8 が作るプロジェクトテンプレートと Building Java Android projects を参考に適当に sbt でビルドできるようにします。必要ない設定とか、必要ない依存関係とかあるけど、気にしない、気にしない…

いよいよ scala のコードを追加するわけですが、今のところ android-plugin で scala コードを書く場合は ProGuard を有効にしないといけないので注意が必要です。ここで滅茶苦茶はまりました。無効にしていると、アプリケーション起動時、クラスローダーにクラスが見つからないとごねられます。AndroidManifest に typo がないか確認したり、apk から class ファイルを抽出してクラスが存在することを確認したり、実際に端末にインストールされている apk を確認したり、android-plugin のコードをみたり、ApkBuilder.java を見たり、色々しました…ProGuard が有効なせいでクラスローダーにごねられるのなら分かりますが、無効なせいでごねられるっていうのは、一体何がどうなっているんでしょうね…そこまでは追っていません。

そんなわけで scala を利用するための修正を加えつつ、scala コードとレイアウトを追加します

あとは Typed Resources を使ってみたりproguard の警告がうるさいので止めてみたりwiki の記述に間違いがあったので勝手に修正したりもしました

実際の既存のプロジェクトに対して適用したわけではないのでなんともいえませんが、まあ使えると思います。ProGuard を無効にできないのがちょっと残念ですが…

おしまい。

追記:今回の記事は sbt + android-plugin を利用しようという話です。sbt なんて使わずに Ant のままでやりたいという人は Bump で Epfl な Stéphane Micheloud さんが既に書いてます、そちらを参考にどうぞ。今見たら github移行したみたいで、リンク切れとかありますね…githubこちら。コミットログ見る限り、android sdk の更新に対する追従は revision 14 以降はないみたいなので、最新の revision 17 とかだと駄目かも?誰か試してみてください。

更に追記:このコミットで、local.properties に含まれている SDK のパスが利用されるようになりました。実は上には書かなかったのですが、環境変数 ANDOROID_SDK_HOME を設定していないといけないという問題がありました。この問題は上記のコミットでなくなったはずです。

ちなみに ANDROID_SDK_HOME を設定していない場合は debug.keystore の位置は公式のドキュメントの通り、

The default storage location for AVDs is in ~/.android/ on OS X and Linux, in C:\Documents and Settings\\.android\ on Windows XP, and in C:\Users\\.android\ on Windows Vista and Windows 7.

でよいのですが、ANDROID_SDK_HOME を設定している場合は "ANDROID_SDK_HOME/.android/debug.keystore" にないと叱られてしまうので、これまで ANDROID_SDK_HOME を設定していなかった人は、急にデバッグビルドで debug.keystore が見つからない等といわれて多分混乱したと思います。はい、ボクがそうです。debug.keystore の位置が環境変数に依存しているのはこの辺みれば分かると思います。

関係ない話ですが、これも似たような問題でしょうね。"user.home" を書き換わったためだと思われます。

さてプラグイン github の trunk から持ってくるようにして環境変数消すか…

更に更に追記:バージョンあがったので 0.6.2 使いましょう。