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。