Edited at

【Android】Android with Scala 事始め【Scala】

More than 5 years have passed since last update.

2014/09/11時点

タイトル通り。

今ならずいぶん簡単にできますよ~ということをアピールします。

なお私、JavaでのAndroid開発はやったことはありません...。

※注意

利用しているpfn/android-sdk-pluginはバージョンアップが激しいです。情報がすぐに古くなる可能性が有ります。

この手法のメリットは、下記です


  • Scalaで書ける(Better Java, OOPxFP)

  • sbtによるビルド管理(パッケージの追加など、比較的楽)


検証環境


  • MacOSX 10.9.4

  • IntelliJ IDEA 14 EAP(Scalaプラグインインストール済み)

  • GenyMotion(エミュレータ)


事前準備


  • android sdk インストール

  • sbtインストール


プロジェクトの作成


  • 基本、ココの手順に沿って行くだけですが、一応順番に。


ひな形ファイルの用意

sbtプロジェクトを配置するディレクトリつくって、その配下にsbtプラグインの記述をします。

$ mkdir [path/to/project]

$ mkdir [path/to/project]/project
$ cd [path/to/project]
$ vi project/plugins.sbt


plugins.sbt

addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.3.5")

resolvers += Resolver.sbtPluginRepo("snapshots")

addSbtPlugin("com.hanhuy.sbt" % "sbt-idea" % "1.7.0-SNAPSHOT")


↑IntelliJ用のプラグインも入れてます


コマンドでプロジェクトのひな形作成

sbtコマンドと拡張コマンドで、プロジェクトのひな形を作ります


$ cd [path/to/project]
$ sbt
#~~~~~sbtコンソールが起動していろいろ入る
> gen-android android-19 com.takudo.hogehoge takudotest

gen-androidの引数は


  • APIレベル

  • パッケージ名

  • 名称

の順で↑の例のように渡す。

※この後 [error] java.lang.NoClassDefFoundError: sbt/Plugins が発生、sbtのバージョンを0.13.5に変更することでエラーが出なくなる


project/build.properties

sbt.version=0.13.5



IntelliJ用設定ファイルを作る

$ sbt

> gen-idea

IntelliJで開いてみる

File > Openからプロジェクトのディレクトリを選択する


エミュレータで動かしてみる


sbt でビルド

sbtコンソールでデバッグ用パッケージを作成します。

> ~android:package-debug

(頭の~でファイルの変更を監視してコンパイルかけてくれるようになります)


IntelliJ SDK設定

IntelliJのSDK設定ができていないはずなので、選択します

File > ProjectStructure


IntelliJデバッグ設定

IntelliJのデバッグのEditConfigurationsで、

下記のようにデバッグ設定を作ります。


デバッグ実行

虫のアイコンをクリックするとデバイス選択画面が出るので、GenyMotionで動かしているエミュレータを選択します。

おー動いた!

ブレイクポイントでも止まります。

でもまだこれJavaのソースなんで、Scalaで書きます。


Scalaでソースコード書いてみる

とりあえずデフォルトで出来上がるJavaのMainActivityをそっくりScalaに移植します。

src/main配下に、

src/main/scala/[パッケージ]/MainActivity.scala

を作りましょう。

(Javaのソースコードをコピーして、scalaのファイルに貼り付けると面白いので試してみてください)

scalaのコードはこんなかんじだと思います。


src/main/scala/[パッケージ]/MainActivity.scala


package [パッケージ]

import android.app.Activity
import android.os.Bundle

class MainActivity extends Activity {
/** Called when the activity is first created. */
override def onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
}
}


で、忘れずにjavaのファイルを消しておきましょう

src/main/java/[パッケージ]/MainActivity.java

では虫アイコンからデバッグ開始!

ブレークポイントでも止まります。

以上です。


Android始めたばかりというのもありますが、Scalaっぽいimmutableな書き方がしづらい場面が多々ある気がしています。

今後進めていく上で、Scalaでの開発上の良いプラクティスがあれば共有したいなと思っています。