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
いいのかな。。

広告

Scala Lift, サクっと設定とか

急ピッチで作業してやんよ。

なんでscala?というと、Androidで実行できるとか聞いたので。
決してこのようなページを見つけたからではない。
前置きはめんどくさいので以下。
scalaとは

scalaダウンロード
http://www.scala-lang.org/

StableのMac OS Xを適当な場所に落として環境変数設定

% export SCALA_HOME=/Users/runeleaf/works/scala-2.7.7.final
% export PATH=$PATH:$SCALA_HOME/bin

.zshrcにあとで書いておく。

最近のOSXならナニも考えずにできるはず。

インタプリタ

% scala                                     
Welcome to Scala version 2.7.7.final (Java HotSpot(TM) Client VM, Java 1.5.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

scala> println("こんにちわ")
こんにちわ

scala>:quit
%

さくさく次へ。
MavenとLift
scala liftとは

Mavenを使用するのですが、githubにあるliftwebのなかにあったのでそれを落として使います。

% git clone git://github.com/dpp/liftweb.git

落としてきたなかにmvnがあるのでパスを通す

% export PATH=/Users/runeleaf/works/code/git/liftweb/installer/src/apache-maven-2.2.0/bin:$PATH

プロジェクト作成

% mvn archetype:generate -U -DarchetypeGroupId=net.liftweb -DarchetypeArtifactId=lift-archetype-basic -DarchetypeVersion=1.0 -DgroupId=net.runeleaf.hello -DartifactId=helloliftweb
% mvn jetty:run

ブラウザから下記のアドレスを開く。
http://localhost:8080

上記のオプションだと、

こんなのとか、

こんなフォームとかできてます。

ようやくスタートラインですね。