Android+Scalaの開発環境を試してみる

例によってMacとUbuntu。

2011/04/16追記

この記事の内容は古いしスマートな方法じゃなかったのでスルーして、以下のページを読むことを推奨しますよ。

環境の準備

Scalaのインストール

公式から落としてきた2.8.0.finalを展開してそのまま/opt/local以下に設置。
/opt/local/scala-2.8.0.final/binにパスを通した。

scala-android.jarのインストール

sbazで入るscala-android.jarが2.7.7のため2.8.0といっしょには動かない。
そこでここを参考に自前コンパイル。コンパイルにやたら時間がかかった。

しかし出来たscala-android.jarを/opt/local/scala-2.8.0.final/lib/に入れたらscalaやscalacコマンドがエラーを吐いて動かなくなったので、Android用のScalaは別途/opt/local/scala-2.8.0.final-with-androidに設置することにした。

ProGuardのインストール

macports又はapt-getでさくっと入る。
proguard.jarの位置が環境によってまちまちなので注意。

プロジェクトの設定

Scalaを使うプロジェクトのビルドの設定を編集する。

build.xmlの編集

以下の部分を

    <setup />

次の内容に書き換える。

    <setup import="false" />
    <import file="android_rules.xml" />
android_rules.xmlの編集

android_rules.xmlを落として以下の修正を加える。

1. sdk-locationの追加

    <!-- Properties -->

    <property name="sdk-location" value="/opt/local/android-sdk" />
    <property name="android-tools" value="${sdk-location}/tools" />

2. scala.homeのパスの変更

    <property name="scala.home" value="/opt/local/scala-2.8.0.final-with-android/" />

3. proguard.jarのパスの変更

Macだと以下

    <path id="proguard.classpath">
      <pathelement location="/opt/local/var/macports/software/proguard/4.4_0/opt/local/share/java/proguard.jar" />
    </path>

Ubuntuの場合は

    <path id="proguard.classpath">
      <pathelement location="/usr/share/java/proguard.jar" />
    </path>

サンプルコード

通常のJavaのコードをScalaのコードに書き換えてみた。

Hellowello.java
package to.brass.hellowello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class Hellowello extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setText("Hellowello Android!");
        setContentView(tv);
    }
}
Hellowello.scala
package to.brass.hellowello

import android.app.Activity
import android.os.Bundle
import android.widget.TextView

class Hellowello extends Activity {
    override def onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        val tv = new TextView(this)
        tv.setText("Hellowello Android and Scala!")
        setContentView(tv)
    }
}

短いコードなのであんまり違いがないけど、ant installしたらちゃんと動いた。

参考

2011/03/06追記

Android SDKのバージョンアップでこの手順では動かなくなっている。
android_rules.xmlの内容を見直さないといけない。マシンを新調したついでになんとなく環境作っておこうと思ったけど、いったん深追いせずあきらめる。

一応scala-android.jarの構築に使ったコマンドを残しておく。

cd /tmp
svn checkout http://lampsvn.epfl.ch/svn-repos/scala/scala/tags/R_2_8_1_final
cd R_2_8_1_final/src
cp android-library/scala/ScalaObject.scala library/scala/ScalaObject.scala
cp android-library/scala/reflect/ScalaBeanInfo.scala library/scala/reflect/ScalaBeanInfo.scala
cd ..
ant build
cp lib/scala-library.jar /opt/local/scala/lib/scala-android.jar

Scalaもバージョンうpしてますね。