AntでScalaをAndroidする

環境

ScalaとProGuardのライブラリをSDKにコピーする。scala-library.jarはこのままではまずいらしいけど今回は端折る。

% cp $SCALA_HOME/lib/scala-{compiler,library}.jar $SDK_HOME/tools/lib
% cp $PROGUARD_HOME/lib/proguard.jar $SDK_HOME/tools/lib

ビルドルールをScala用に差し替える。

--- $SDK_HOME/platforms/android-2.0/templates/android_rules.xml~
+++ $SDK_HOME/platforms/android-2.0/templates/android_rules.xml
@@ -125,8 +125,7 @@
              <arg value="--output=${intermediate.dex.file}" />
              <extra-parameters />
              <arg line="${verbose.option}" />
-             <arg path="${out.classes.absolute.dir}" />
-             <fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
+             <fileset dir="${out.dir}" includes="*.min.jar" />
              <external-libs />
          </apply>
        </sequential>
@@ -252,10 +251,39 @@
                 <fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
             </classpath>
         </javac>
+        <taskdef resource="scala/tools/ant/antlib.xml"
+           classpath="${android.tools.dir}/lib/scala-compiler.jar:${android.tools.dir}/lib/scala-library.jar" />
+        <scalac force="changed" deprecation="on"
+                srcdir="${source.dir}" includes="**/*.scala"
+                destdir="${out.classes.dir}">
+            <classpath>
+                <pathelement location="${android.jar}"/>
+                <fileset dir="${android.tools.dir}/lib" includes="*.jar"/>
+                <fileset dir="${external.libs.absolute.dir}" includes="*.jar" />
+            </classpath>
+        </scalac>
+    </target>
+
+    <!-- Shake off unneeded classes -->
+    <target name="proguard" depends="compile">
+      <taskdef resource="proguard/ant/task.properties"
+               classpath="${android.tools.dir}/lib/proguard.jar" />
+      <proguard>
+        -injars ${out.dir}/classes:${external.libs.dir}:${android.tools.dir}/lib/scala-library.jar(!META-INF/MANIFEST.MF,!library.properties)
+        -outjars ${out.dir}/classes.min.jar
+        -libraryjars ${android.jar}
+        -dontwarn
+        -dontoptimize
+        -dontobfuscate
+        -keep public class * extends android.app.Activity
+        -dontskipnonpubliclibraryclasses
+        -dontskipnonpubliclibraryclassmembers
+        -allowaccessmodification
+      </proguard>
     </target>
 
     <!-- Converts this project's .class files into .dex files -->
-    <target name="-dex" depends="compile">
+    <target name="-dex" depends="proguard">
         <dex-helper />
     </target>

Androidプロジェクトの作成。いつもの感じで。

% android create project --package com.example.helloscala --activity HelloScala --target android-5 --path HelloScala

helloscala.javaを消すなりリネームして修正するなりで。

//src/com/example/helloscala.scala

package com.example.helloscala

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

class HelloScala extends Activity {
  override def onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)
  }
}

あとはJavaの時と同じで。

% android create avd --target android-5 --name android-5
% emulator -avd android-5
% ant debug
% adb install bin/HelloScala-debug.apk

参考