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 uninstall-emulator