Scala で Android アプリケーション作成 - sbt 使用(sbt-android-plugin)

Android アプリケーションを sbt を使って作成するためのプラグイン sbt-android-plugin があるので、これを使って簡単な Android アプリケーションを Scala で作成してみます。

なお、今回は使っていませんが、sbt-android-plugin にはプロジェクトの雛形を作成するための Scala スクリプト create_project が用意されているので(http://github.com/jberkel/android-plugin/tree/master/script/ にある)、通常は create_project でプロジェクトを作成すればいいと思います。

今回、使用した環境は以下の通り。

また、以降の内容は SDK Platform Android 2.2, API 8, revision2 がインストールされており、AVD(Android 仮想デバイス)などが設定済みである事を前提としています。

サンプルソースは http://github.com/fits/try_samples/tree/master/blog/20100909/

sbt によるプロジェクト作成

sbt コマンドを使ってプロジェクトを作成します。具体的な手順は id:fits:20100810 を参照。

sbt-android-plugin の設定

まず、project/plugins ディレクトリ内にプラグイン設定ファイルを作成し、sbt-android-plugin を使用するための設定を行います。

project/plugins/Plugins.scala
import sbt._

class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
    val android = "org.scala-tools.sbt" % "sbt-android-plugin" % "0.5.0"
}

次に、project/build ディレクトリ内にプロジェクト設定ファイルを用意し、AndroidProject を継承するようにします。
androidPlatformName には Android SDK の platforms ディレクトリに配置されている対象プラットフォームのディレクトリ名を指定すれば OK です。

project/build/SimpleAndroidAppProject.scala
import sbt._

class SimpleAndroidAppProject(info: ProjectInfo) extends AndroidProject(info) {

    //Platform Android 2.2(API 8)を対象にするための設定
    override def androidPlatformName = "android-8"
}

なお、上記は今回のサンプルをエミュレータで実行するための最小限の設定しか行っていませんが、Android マーケットに登録する場合は MarketPublish トレイトを使う必要があると思います。(他に findViewById の実装を楽にしてくれる TypedResources トレイトなんかもあります)

Android アプリケーション用のファイル作成

あとは、src/main の中に Android 開発に必要なファイルを用意していくだけです。(Scala のソースは src/main/scala に配置します)
実際は Android SDK や ADT で生成されたファイルを使えばいいと思いますが、今回は自前で用意します。

まず、AndroidManifest.xml ファイルを src/main に作成します。

src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="fits.sample"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:label="@string/app_name">
        <activity android:name=".SimpleActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="8" />
</manifest> 

次に、AndroidManifest.xml で参照している app_name を定義したリソースファイル src/main/res/values/strings.xml を作成します。

src/main/res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">SimpleAndroidApp</string>
</resources>

最後に、AndroidManifest.xml で参照している SimpleActivity を定義した Scala ファイルを作成します。

src/main/scala/SimpleActivity.scala
package fits.sample

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

class SimpleActivity extends Activity {
    override def onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)

        setContentView(new TextView(this) {
            setText("hello")
        })
    }
}

ビルドとエミュレータでの実行

事前に、環境変数 ANDROID_SDK_HOME に Android SDK のホームディレクトリのパスを設定しておきます。(代わりにプロジェクト設定ファイルで androidSdkPath をオーバーライドする方法もある)

ANDROID_SDK_HOME 環境変数の設定例(Windowsの場合)
>set ANDROID_SDK_HOME=C:\android-sdk-windows

sbt で update と package-debug を実行して必要なファイルの取得とアプリケーションのビルドを行います。

ビルド
>sbt update package-debug

ビルドに成功すると、target/scala_2.8.0 に simpleandroidapp_2.8.0-1.0.apk ファイルが生成されます。(ディレクトリやファイル名は設定によって変わるので注意)

次に、Androidエミュレータを起動し、sbt で start-emulator を実行すると、アプリケーションをインストール(正確には reinstall-emulator が実行される)し、アクティビティが開始されます。
(実は start-emulator 内で package-debug も実施されるので、実際は package-debug を単独で実行する必要はありません)

Android エミュレータの実行例(AVD の名称が default の場合)
>emulator @default
もしくは
>emulator -avd default

ちなみに Android SDK と ADT で AVD(Android 仮想デバイス)の作成先が異なるようなので注意。(Android SDK は %ANDROID_SDK_HOME%\.android\avd に、ADT は %USERPROFILE%\.android\avd に作成された)

エミュレータへのインストールと実行
>sbt start-emulator

ちなみに、アンインストールする場合は sbt で uninstall-emulator を実行します。

エミュレータからのアンインストール
>sbt uninstall-emulator