【问题标题】:android + scala + intellij sbt returns warning and app crashes on emulator: bad class file magic (cafebabe) or version (0033.0000)android + scala + intellij sbt 在模拟器上返回警告和应用程序崩溃:bad class file magic (cafebabe) or version (0033.0000)
【发布时间】:2012-09-06 20:40:22
【问题描述】:

我正在尝试让一个 hello world android 应用程序与 scala 和 intellij 一起工作 尝试过相同壮举的人必须熟悉以下步骤。当我使用 sbt 时,问题发生在最后

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

-下载并设置android sdk。我已经下载了从 1.5 (API 3) 到 4.1 (API 16) 的所有版本。我不会对此进行进一步的详细介绍。已经有很多教程了。

我们将需要环境变量中的 android home 路径。所以让我们为当前用户设置一个持久化环境变量

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-idea 1.1.0 版本:

gedit ~/.sbt/plugins/build.sbt

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

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

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

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

然后执行:

cs n8han/giter8

现在我使用 g8 从 jberkel 获取一个 android app 模板:

g8 jberkel/android-app

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

在运行 sbt 之前: android-plugin目前兼容0.11.3版本的sbt我们需要做一个调整。所以在新的android应用程序的文件夹中执行: gedit 项目/build.properties 并插入这一行: sbt.version=0.11.3

在同一个文件夹中执行: sbt 'gen-idea no-classifiers' 编译

然后进入sbt交互模式控制台: sbt

在控制台内执行: 安卓:包调试

我相信这些警告是问题的根源: 故障处理: 坏类文件魔术(cafebabe)或版本(0033.0000) ...同时解析 my/android/project/R$id.class

现在你可以尝试启动一个 android 模拟器: android:emulator-start # 用于获取 avds 列表 例如 android:emulator-start android2_3_3

在模拟器完全启动后,像这样执行 android 应用程序: 安卓:启动模拟器

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

【问题讨论】:

  • 这是我从 logcat 得到的: FATAL EXCEPTION: main 443 AndroidRuntime E java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{my.android.project/ my.android.project.MainActivity} : java.lang.Cl assNotFoundException: my.android.project.MainA 活动在加载程序dalvik.system.PathClassLoader [/data/app/my.android.project-1.apk]

标签: android scala ubuntu intellij-idea sbt


【解决方案1】:

问题在于您的 Java 版本。切换回 Java 6,或者如果您不能,https://stackoverflow.com/a/7705091/203487 可能会有所帮助。

“bad class file magic (cafebabe) or version (0033.0000)”表示生成的类文件的版本为 51,即 Java 7,因此很明显 dexer 和 ProGuard 都不能使用这些类文件。这里我不是在谈论最新的 ProGuard 版本,而是与 Android SDK 捆绑在一起的版本。

【讨论】:

    【解决方案2】:

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

    • 您将需要 Proguard 来创建大小合理的 apks。
    • 我使用 Scala 2.10-M6,因为 2.8 很旧并且有其怪癖,尤其是在 Android 中,而 2.9 对于 Proguard 来说非常慢。
    • keep class scala.collection.SeqLike { ... 很重要,否则该类将被忽略,相反它有一个方法引用 (I posted this workaround)。
    • Build.scala 使用了许多有趣的东西,如 scalaz 或 libgdx,请随意修剪它们。许多 android 的东西是从各种 g8 模板中破解出来的,感谢所有分享它们的人。

    所以这是我的设置转储:

    project/Build.scala project/plugins.sbt

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

    我正在开发一款使用非密集图形的小型游戏,到目前为止,我使用的是惯用的 Scala(甚至是 Scalaz)而没有减速。所以没有必要仅仅为了Android而恢复到数组、变量和while循环:)

    祝你好运!

    【讨论】:

    • 使用 2.10 的 proguard 能快多少?
    • Proguarding 2.10 stdlib 与 2.8(我的计算机上为 12-15 秒)相当,而 2.9 大约是两倍(35 秒)。另请参阅scalandroid.blogspot.hu/2012/03/… 了解更根本的差异。还指出了问题的原因:blog.duh.org/2011/11/scala-pitfalls-trait-bloat.html
    • 感谢您的链接。哦,我知道第二个链接和.class文件组合爆炸。
    • 通过设置 proguard 启用并使用这个额外的选项 Seq(proguardOption in Android := "-keep class scala.Function1") ++ 我让它工作了。但不幸的是,我从您的 sbt 配置和其他人的 sbt 配置中得到的信息是,必须对其进行持续维护!这不是一次性的……
    • George:如果您向项目添加新的奇异库,Proguard 配置可能需要更改。通常你不会每天都这样做:)
    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2015-09-28
    • 2014-04-02
    相关资源
    最近更新 更多