Scala 是基於 Java 平台的多範式程式語言,最著名的使用者就是原本從 Ruby 起家的 Twitter。由於 Java 平台賦予的可攜性,除了應用於各式各樣的後端程式,Scala 也能用來撰寫 Android 的 app。

我嘗試的環境如下:

  • Mac OS X 10.8.2
  • Android 4.2 SDK
  • Scala 2.9.2

由於我習慣用 ant 來建置,需要先做的就是修改 build.xml 加入以下步驟:

<import file="mac-shim.xml" />
<import file="build-scala.xml" />
<target name="-post-compile" depends="-post-compile-scala" />

重點在於加入 -post-compile-scala 這個步驟來編譯 src/ 下的 .scala 檔案。mac-shim.xml 是為了解決 Android SDK 的 ant script 在 Linux/MacOS 下的差異;build-scala.xml 則是包含可重複使用的 Scala 建置規則。

另外執行 ant 前要先用 android update project 把 local.properties 產生出來,並把 scala.dir 指向 Scala 的安裝位置:

$ android update project -p . -t android-17
$ echo scala.dir=/usr/local/share/scala-2.9.2 >> local.properties
$ ant

完整的範例可以到我 GitHub 裡面抓 HelloActivity 這個目錄,一個這樣空的 activity 產生出來的 APK 大小是 5,686 bytes,還不錯:

package com.example.android.helloactivity

import android.app.Activity
import android.os.Bundle
import android.widget.TextView

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

接下來嘗試比較龐大的範例如 ApiDemos,如果不幸地在 proguard 過程會有 OOM error:

-post-compile-scala:
...
[proguard] Reading library jar [/usr/local/share/android-sdk-mac_x86/platforms/android-17/android.jar]

BUILD FAILED
/Users/patrick/src/android/scala-android-examples/android-sdk/ApiDemos/build-scala.xml:186: java.lang.OutOfMemoryError: Java heap space
        at proguard.classfile.constant.Utf8Constant.getStringRepresentation(Utf8Constant.java:251)
        ...

可以適當地加大 ant 的記憶體配置:

$ export ANT_OPTS=-Xmx512m
$ ant

應該這樣就會順利成功建出 APK 在手機上執行。更進階的用法可以參考的 Stéphane Micheloud 的 Exploring Android