android+scala+intellij sbt在模拟器上返回警告和应用程序崩溃:错误的类文件magic(cafeb



我正在尝试让一个hello-world安卓应用程序与scala和intellij一起工作无论谁尝试了同样的壮举,都必须熟悉以下步骤。当我使用sbt时,问题会在最后发生

请注意我使用的每个工具的版本。对于初学者,我使用的是java版本1.7.0_07

-下载并设置android sdk。我已经下载了1.5(API 3)到4.1(API 16)的所有版本。我将不再详述这一点。已经有很多教程了。

我们将需要一个环境变量中的android主路径。因此,让我们为当前用户设置一个持久的环境变量

gedit ~/.pam_environment

现在附加以下内容:ANDROID_HOME=例如

ANDROID_HOME=/home/pligor/android-sdks

现在让我们拿起sbt工具。我们宁愿手动安装sbt。在链接中找到"Unix"部分:https://github.com/harrah/xsbt/wiki/Getting-Started-Setup然后下载sbt-launch.jar并将其放置在~/bin中目前版本为0.12.0然后创建一个sbt文件:

gedit ~/bin/sbt

在里面写下这行:

java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -jar `dirname $0`/sbt-launch.jar "$@"

并使脚本可执行:

chmod u+x ~/bin/sbt

现在,您需要为intellij安装一个sbt插件。sbt理念1.1.0:

gedit ~/.sbt/plugins/build.sbt

在行内添加append(记住每个.sbt文件用一个额外的空行分隔每个语句):

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.1.0")

对于github模板,您需要giter8工具。所以执行:

卷曲https://raw.github.com/n8han/conscript/master/setup.sh|sh

然后执行:

cs n8han/giter8

现在我使用g8从jberkel:获得一个android应用程序模板

g8 jberkel/android-app

有一些问题需要您设置。目前,我让一切默认。这意味着我使用scala版本2.9.1和Android 2.3.3(API 10)以及1.8.RC1的scalatest_version。我不习惯proguard,因为我以前没有使用过它,所以我将useProguard设置为false。

在运行sbt之前:安卓插件目前与0.11.3版本的sbt兼容,我们需要进行调整。因此,在新的android应用程序的文件夹中执行:gedit项目/build.properties并插入以下行:sbt.version=0.11.3

在同一文件夹内执行:sbt"gen idea no分类器"编译

然后转到sbt交互模式控制台:sbt

在控制台内部执行:android:包调试

我相信这些警告是问题的开始:故障处理:错误的类文件magic(cafebabe)或版本(0033.0000)…在解析我的/android/project/R$id.class 时

现在你可以尝试启动一个android模拟器:android:emulator start#use来获取avd列表例如。android:模拟器启动android2_3_3

模拟器完全启动后,执行android应用程序,如下所示:android:启动模拟器

在所有这些之后,应用程序将崩溃!!

问题出在Java版本上。切换回Java 6,否则,https://stackoverflow.com/a/7705091/203487可能会有所帮助。

"坏的类文件magic(cafebabe)或版本(0033.0000)"意味着生成的类文件的版本为51,即Java 7,因此很明显,dexer和ProGuard都无法使用这些类文件。这里我说的不是最新的ProGuard版本,而是与Android SDK捆绑在一起的版本。

我只能谈谈我的设置,到目前为止,它有点成功。

  • 您需要Proguard来创建大小合理的apk
  • 我使用Scala 2.10-M6,因为2.8很旧,也有它的怪癖,尤其是在安卓系统中,而2.9的Proguard速度很慢
  • keep class scala.collection.SeqLike { ...很重要,否则类就被忽略了,相反,它有一个方法引用(我发布了这个解决方法)
  • Build.scala使用了许多有趣的东西,比如scalaz或libgdx,可以随意修剪它们。许多安卓的东西都是从各种g8模板中黑客入侵到一起的,thx适用于所有共享它们的人

所以这里是我的设置转储:

项目/Build.scala项目/插件.sbt

我使用sbt 0.11.3Idea 11.1。我使用sbt控制台进行编译,主要使用android:start-device命令,有时使用android:emulator-start RomName+android:start-emulator。Idea与正在运行的Android进程很好地结合在一起。

我正在开发一款使用非密集图形的小游戏,到目前为止,我使用了惯用的Scala(甚至Scalaz),速度没有减慢。因此,不需要为了Android而恢复到数组、vars和while循环:)

祝你好运!

相关内容

最新更新