Android SDK for Scala

というのがあったので弄ってみました。今週のScala勉強会@東北のネタです。

Android SDK for Scala

http://lamp.epfl.ch/~michelou/android/
android-sdk.zip(Scala版)

これは何かというと、AndroidアプリをScalaでビルドするためのANTファイルと、Android SDK付属サンプル集のScala翻訳版のパッケージです。

GoogleCode:scala-androidのようにScala向けAPIが提供されているわけではありませんので、Scala APIにありがちな妙なDSLとか無い分、Android初心者にはとっつきやすいと思います。(・・というかscala-android開発止まってますね。)

自分もAndroid初心者なので、Android SDKのインストールから手順をメモ。

Android SDKインストール

Android SDK
http://developer.android.com/sdk/index.html

解凍したら、android-sdk/tools に PATH を通す。

SDK Setup.exe(Android SDK and AVD Manager)を起動(またはコマンドでandroid)

  ※エラーが発生してパッケージが読み込めない場合、
  「Settings」-「Force https//... sources to be fetched using http://...」
  にチェック。

「Installed Package」「Available Package」でAPIをインストール。

  * Google APIs by Google Inc., Android API 8, revision 1
  * Documentation for Android SDK, API 8, revision 1
  * Usb Driver package, revision 3

など。各サンプルを動作させるために、古いバージョンも入れておいた方が良い。現在生きてるAPI Levelは、以下の4つになるようです。特に以降のサンプルでAPI level 4 と 7 は利用するのでいれておく。

  * 8 for the Android 2.2 platform (API level 8)
  * 7 for the Android 2.1 platform (API level 7)
  * 4 for the Android 1.6 platform (API level 4)
  * 3 for the Android 1.5 platform (API level 3)

  ※Windowsの場合、%USERPROFILE%\.android というフォルダができるが、
   ユーザーディレクトリをCドライブから移動している場合は注意。
   Cドライブのユーザーディレクトリに.androidがないと動かないので、
   別の場所にある人はジャンクションを作る。

   > cd %USERPROFILE%
   > mklink .android D:\myaccount\.android /J
   .android <<===>> D:\myaccount\.android のジャンクションが作成されました

Android SDK for Scala

Targeting Scala to the Android platform
に沿って確認していきます。

http://lamp.epfl.ch/~michelou/android/
android-sdk.zip(Scala版)をダウンロード

その他、以下を用意する。

 Apache Ant 1.7以上(resourcecountなど新しめのTaskを使ってる)
 Android-SDK 2.2(前述)
 Scala2.8.0(RC)(SCALA_HOMEとPATH設定)
 ProGuard
※ProGuardは使わないクラスを除外してJarを最適化してくれるツール。

以下動作確認の手順。

■仮想デバイス(エミュレータ)の作成
AVD Manager使ってもできるが、コマンドラインで作成するには、

  > android create avd --target 3 --name avd3
  > android create avd --target 4 --name avd4
  > android create avd --target 7 --name avd7
  > android create avd --target 8 --name avd8

--target は、前述のAPI levelを指定。8だとAndroid 2.2を使うことになる。

■エミュレータの起動

  > emulator [-no-boot-anim -no-skin] -avd avd4

■トレーサーの起動(別窓で)

  > adb logcat (エミュレータ内の情報を出力)

■HelloActivityの動作確認

  > emulator -no-boot-anim -avd avd4
  > adb logcat

  > cd HelloActivity

ここで、local.properties の各パスを設定してビルド&インストールする。

例:

  sdk.dir=D:/tools/android-sdk-windows
  scala.dir=D:/tools/scala-2.8.0.RC6
  proguard.dir=D:/tools/proguard4.5

  > set ANT_OPTS=-Xmx1024m (OOM対策)
  > ant debug
  > ant install

エミュレータのアプリケーション一覧にHello(Scala)というアプリが追加されている。クリックすれば動くはず。


■削除するには、

  > ant uninstall

■他のAntタスクも確認しておく。

  > ant -p

新規プロジェクト作成

任意の場所で(これはAndroid SDKの機能。Scala関係ない)

  > android create project \
    --package scalatohoku.android.example \
    --activity SampleActivity \
    --target 8 --path SampleActivity

注意!:パッケージ名は3階層以上にすること。後述しますが、そうしないと後でハマります。

作成したプロジェクトを以下の手順でScala対応する

  サンプル/HelloActivity/
        + proguard.conf
        + build-scala.xml
        + local.properties

上記3ファイルを新しいプロジェクトにコピーする。

build.xmlの"<setup />" の次に、以下を追加。

    <import file="build-scala.xml"/>
    <!-- Converts this project's .class files into .dex files -->
    <target name="-dex" depends="compile, scala-compile, scala-shrink">
        <dex-helper />
        <scala-helper />
    </target>

HelloActivity.scalaを参考に、SampleActivity.scalaを作成。SampleActivity.javaは削除。
(この辺、地味な手作業になります。)

あとは、ビルド&インストール

  > set ANT_OPTS=-Xmx1024m
  > ant debug
  > ant install

パッケージ名が短い場合

proguard.conf のパラメータ@MYAPP_PACKAGE@の埋め込みが失敗してしまい、作成したクラスファイルがproguardによって除外されてしまう。その場合は、proguard.confに含めたいパッケージを直接書けば解決。

例:
  -keep public class scalatohoku.android.**

エミュレータにインストール後、ClassNotFoundExceptionが発生してしまう場合は、proguard.confに原因があることがほとんどです。

追:"パッケージ3階層以上"は、Android naming conventionだそうです。それに従って、build-scala.xmlの中で正規表現かけているので、短いパッケージ名は避けた方がいいみたい。

Scalandris

せっかくなので、このSDKを使って何か作ってみました。次回のScala東北のネタです。実はこのSDK for Scalaの存在もScala東北で教えていただきました。

Scalandris
Scala+Android+Tetrisなので、Scalandrisです。
使い方はREADME参照してください。

AndroidではThread.sleepが非常に危険なのと、子スレッドが親スレッドのオブジェクトを更新できないなど、いろいろとハマって調べていたら、無駄にRemoteServiceまで作成してしまいました。このあたりを勉強会で説明したいと思います。

Android SDK for ScalaをEclipseで利用する場合

Scala IDE for Eclipse
今現在では、Eclipse Classic3.5.2に対応しているようです。3.6.0を使うとScalaエディタを起動できませんでした。

Eclipseを起動したら、Help - Install New Software...に
https://dl-ssl.google.com/android/eclipse/
http://download.scala-ide.org/update-current

を登録して、Developer ToolsとScala IDEをインストール。
再起動後、Window-PreferencesでAndroidのインストールパスを設定をしておく。

File-New-Other-Android Project を選択し、Create project from existing source で作成する。

作成したプロジェクトを右クリック-Configure-Add Scala NatureすればAndroid+Scalaの環境が整う。

この検証をやってる間しばらく使ってみましたが、Scalaエディタが嫌になるほどモッサリしてたのと、補完などがあまりうまく効かない感じでした。
ただ、コンパイルエラーが事前にチェックできたり、XMLのビジュアル編集やトレーサーなどのAndroid側の機能が豊富だったので、使ってみる価値はあると思います。


同じカテゴリのエントリ
1.Lift再入門 / 8.javascriptからsubmitできない / 7.Ajax Form / 6.Radio、Checkboxについて / 5.行列型の編集FORM / 4.サーバーサイドバリデーションとサーバサイド関数 / 3.ログインFORM - S.param使ったら負け / 2.Snippetメソッドとして許される型 / sbt0.12.xで依存jar抽出タスク / scala2.10+lift2.5+NetBeans7.2 / Scalaで入門関数プログラミング / reactive-webを試してみました / Lift2.2M1のテンプレート機能 / Scala Compiler Plugin / View Bound/Context Bound / ScalaZa01参加してきました / Akka Frameworkチュートリアルの次 / Akka Frameworkチュートリアルその2 / Akka Frameworkチュートリアル / LiftでJCaptcha / Url Rewrite Filter / sbt-android-plugin / Android SDK for Scala / 祝Lift2.0リリース / Liftの携帯対応まとめ / Scala2.8への移行 / Lift 2.0-scala280-SNAPSHOT/sbt0.7.1 / Scalaお絵かき環境 - Kojo / Lift+Quartzでバッチ / Scala&Liftを採用した理由 / Liftでdate_select系ヘルパーを作る / LiftでAjax / LiftのSubmitかしこい / lift-mapperのpaginateを使う / snippetをspecする / Lift Mapperを拡張する / LiftのDBをMySQLに / Liftプロジェクト環境を整える / Scala本読み比べてみました / NetBeans6.7&scala / じつはScalaはライトな言語 / Scalaバザ~ル / lift1.0所感 / specsを読む / implicit def / ScalaならNetBeansがサイコー / scala勉強会@東北がスタート / それでも俺はLiftをやるってのか / Scala&Liftセットアップ / ブログリニューアル /
コメント

コメントしてください

closed.