14

在 android 上使用 Scala 的权威参考似乎在这里:http ://www.scala-lang.org/node/160

不幸的是,所有关于在 android 中使用 scala 的参考资料都基于 Scala 2.7,并引用了一个自定义构建 android-library.jar,其中有几个神秘的引用表明更高版本的 android 不需要这个自定义构建(I' m 使用 2.1 / API v7)

那么...在 android 项目中使用 Scala 2.8 需要哪些步骤?最好使用 Eclipse 和 Google 为该 IDE 提供的 Android 工具。

4

5 回答 5

11

编辑:

我这样做的新方法是使用我的 Eclipse 插件:https ://github.com/banshee/AndroidProguardScala (自述文件有安装说明和指向正常 Eclipse 更新站点的指针)。

旧答案仍然有效,但新方法更好。

【老办法】我的做法:

  • 使用普通的 Android/eclipse 工具来创建 Java 项目。
  • 添加包含 Scala 代码的第二个项目。这样我就可以保留生成的代码以供将来参考(我是 Android 和 Scala 的新手)。本项目可以参考android.jar。
  • scala 项目生成一个用于 java 项目的 jar 文件
  • 使用 proguard 剥离库。我相信这避免了对 2.7 中使用的 scala-android.jar 的需要

不过,我没有将它用于比 hello, world 更雄心勃勃的事情,所以把它当作更多的提示。

在 scala 项目中,我添加了一个构建器(Builder > New),它只是一个名为 pguard 的 shell 脚本,位于项目的根目录中,其中包含:

#!/bin/sh
cd $1
PROGUARD=$HOME/dev/proguard/lib/proguard.jar
LIBS=
OUTPUT=lib/proguard.jar
rm -f $OUTPUT
AJAR=/Users/jamesmoore/dev/android-sdk-mac_86/platforms/android-7/android.jar
# java -jar $PROGUARD -injars 'bin:lib/scala-library.jar(!META-INF/MANIFEST.MF,!library.properties)' -outjar $OUTPUT -libraryjars  @proguard.txt
java -Xmx1g -jar $PROGUARD -injars 'bin:lib/scala-library.jar(!META-INF/MANIFEST.MF,!library.properties)' -outjar $OUTPUT -libraryjars $AJAR @proguard.txt

构建器将位置设置为:

${build_project}/pguard

工作目录和参数都设置为

${build_project}

同样在 scala 项目的根目录中,有一个 proguard 参数文件 @proguard.txt:

-dontwarn
-dontoptimize
-dontobfuscate
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class com.banshee.** {
    public protected *;
}

当然,您需要更改 -keep 参数以保留您自己的代码。

在 java 项目中,我添加了由 scala 项目生成的 jar 文件(我在上面的脚本中使用 lib/proguard.jar)。

但是,不要将 scala 项目作为必需项目添加到 java 项目的构建路径中。这将在 jar 文件之外添加 scala 类文件并混淆 dex(因为它会同时获得 .class 文件和 jar 中的相同内容)。据我所知,Eclipse 将在工作区中构建所有内容,因此当您点击 go 按钮时,两个项目都会构建。

于 2010-05-04T17:35:27.840 回答
3

经过大量调查,看起来 Proguard 确实对于将应用程序部署的大小和速度保持在合理水平至关重要。

遗憾的是,没有合适的方法将 proguard 作为构建步骤嵌入。使用脚本可能是可能的,但我还需要支持 Windows、Linux 和 OSX 环境。

我也不确定双项目解决方案,因为它阻止了 Scala 代码使用生成的资源文件 R.java,而我希望能够这样做。

最后,我能够让 SBT 和 Ant 都使用 Scala 2.8 构建一个 android 2.1 应用程序。Ant 是最受欢迎的最终解决方案,因为它使用与 Android 的 eclipse 插件相同的文件组织。我在这里写了解决方案:http: //scala-ide.assembla.com/wiki/show/ae55a-oWSr36hpeJe5avMc/Developing_for_Android

Eclipse 然后启动 Ant 作为外部工具来打包和安装应用程序。

于 2010-05-05T14:03:26.410 回答
2

我现在正在使用对我之前答案的修改来在 Windows 上运行:只需将所有内容移动到 @proguard_windows.txt 中,这样您就不必担心作为脚本运行。

我的新 @proguard_windows.txt 看起来像:

-injars bin;lib/scala-library.jar(!META-INF/MANIFEST.MF,!library.properties)

-outjar gen/scandroid.jar

-libraryjars lib/android.jar

-dontwarn
-dontoptimize
-dontobfuscate
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class com.banshee.** { public protected *; }
-keep public class org.xml.sax.EntityResolver { public protected *; }

请注意,在 Windows 中,您需要为 -injars 使用分号。讨厌。

构建器如下所示:

(running cygwin here, so the cat option path takes a slash)
James@Greine:/cygdrive/c/Users/james/workspace/Scala2$ cat .externalToolBuilders/proguard.launch
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">
<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="C:\Windows\System32\java.exe"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,auto,"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-Xmx1g -jar lib/proguard.jar @proguard_windows.txt"/>
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${build_project}"/>
</launchConfiguration>

您需要将其放在 .externalToolBuilders/proguard.launch 中。

这里有趣的是它只是一个 java 命令,而不是任何类型的 shell 脚本,所以在 Windows/Mac 之间移植相当容易(我假设是 Linux,但还没有这样做),因为你是只需更改实际 java 二进制文件的位置。

(将此作为新答案提交,因为它与被标记为正确(ish)答案的有点不同)

于 2010-05-08T00:06:46.337 回答
0

我一直在使用 Proguard 在 Eclipse/ADT 构建中对 Scala 库进行 treeshake,但它还有很多不足之处。它很慢,而且会弄乱其他 .class 文件,因此您必须经常重建项目。

受这些问题和 Android 问题跟踪器中的一些问题的启发,我制作了另一个工具(基于 Jar Jar Links),现在我用它来摇动 scala 库。通过这个构建步骤,我实际上对整个 Eclipse+ADT Scala 在 Android 上的情况相当满意。也许它也对你有用,试一试,它可以从http://code.google.com/p/treeshaker/ 获得

于 2011-04-27T12:36:25.957 回答
-1

如果您习惯使用 Gradle 构建工具,那么 Gradle 的 Android 插件将使整个过程变得非常简单。见:https ://github.com/jvoegele/gradle-android-plugin/wiki

于 2010-05-12T14:23:43.467 回答