環境
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
参考