Androidアプリをscalaで作りたい

homebrewでsbtとscalaは入れてある前提。

> brew install android-sdk
> android

SDKマネージャーが立ち上がるので適当なバージョンをインストール

> android list targets
Available Android targets:
----------
id: 1 or "android-16"
     Name: Android 4.1
     Type: Platform
     API level: 16
     Revision: 2
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in
     ABIs : armeabi-v7a
----------
id: 2 or "Google Inc.:Google APIs:16"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 2
     Description: Android + Google APIs
     Based on Android 4.1 (API level 16)
     Libraries:
      * com.google.android.media.effects (effects.jar)
          Collection of video effects
      * com.android.future.usb.accessory (usb.jar)
          API for USB Accessories
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WVGA854, WQVGA400, WSVGA, WXGA800-7in, WXGA720, HVGA, WQVGA432, WVGA800 (default), QVGA, WXGA800
     ABIs : armeabi-v7a

> android create avd -n android_test -t 1
Auto-selecting single ABI armeabi-v7a
Android 4.1 is a basic Android platform.
Do you wish to create a custom hardware profile [no]
Created AVD 'android_test' based on Android 4.1, ARM (armeabi-v7a) processor,
with the following hardware config:
hw.lcd.density=240
vm.heapSize=48
hw.ramSize=512

プロジェクト作成

> android create project -t 1 -k com.example.testapps -a HelloTest -p hello_test

ビルド

> ant debug

リリース用ならant releaseなのかな。

エミュレータ転送

> adb install bin/HelloTest-debug.apk

ここからscalaで開発するための準備。

> curl https://raw.github.com/n8han/conscript/master/setup.sh | sh
> cs n8han/giter8

$HOME/binにファイルがある

> mkdir scala-test
> cd scala-test
> g8 jberkel/android-app
api_level [10]: 16

androidコマンドで起動するSDKマネージャーでインストールしているものが
Android 4.1 (API 16)
だったので16を指定した。

> git clone git://github.com/jberkel/android-plugin.git
> cd android-plugin
> sbt update
> sbt publish-local

0.6.3-SNAPSHOTだった

> cd test-scala #g8でつくったプロジェクトのディレクトリ
> vi projects/plugins.sbt

0.6.3-SNAPSHOTに書き換える。

> sbt
> compile

OutOfMemoryErrorが出る時がある。が何度かやればいける。*1

デバッグ

> android:package-debug

エミュレータ起動してデプロイ

> android:emulator-start scala_android_test
> PANIC: Could not open: /usr/local/Cellar/android-sdk/r20.0.1/.android/avd/scala_android_test.ini

ここからPANIC: 部分の修正ログ。

> export ANDROID_SDK_HOME=/usr/local/Cellar/android-sdk/r20.0.1

してから

> android create avd -n scala_android_test -t 1

> sbt
> android:package-debug
> android:emulator-start scala_android_test
[error] Expected 'scala_android_test'
[error] android:emulator-start scala_android_test

~/.androidと$ANDROID_SDK_HOMEの両方にavdがあって、ごちゃってきたのでシンボリックリンクすることにした(強引)

> cd /usr/local/Cellar/android-sdk/r20.0.1
> ln -s ~/.android .android

> sbt
> android:emulator-start scala_android_test
> android:start-emulator

android:emulator-start scala_android_testでエミュレータが起動した時に画面にロックがかかっていたらandroid:start-emulatorする前にロックを外してホーム画面にしておく。

android:install-emulatorでもいい。
実機なら、
android:install-device
android:start-device

スクリーンショットも取れた。

> android:screenshot-emulator

sbtでandroid:のあとにタブ打てば色々とコマンドがでます。

[追記]
*1
sbtのファイルをみてみたら、

> cat /usr/local/bin/sbt
#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.0/libexec/sbt-launch.jar "$@"

となっているので、

vi ~/.sbtconfig
SBT_OPTS=-Xmx1024M

としてみたらとりあえずOutOfMemoryErrorが出なくなった(いまのところ)
psみたら、
/usr/bin/java -Xmx512M -Xmx1024M -jar /usr/local/Cellar/sbt/0.12.0/libexec/sbt-launch.jar
いいのかな。。