我正在尝试让一个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.3
和Idea 11.1
。我使用sbt
控制台进行编译,主要使用android:start-device
命令,有时使用android:emulator-start RomName
+android:start-emulator
。Idea与正在运行的Android进程很好地结合在一起。
我正在开发一款使用非密集图形的小游戏,到目前为止,我使用了惯用的Scala(甚至Scalaz),速度没有减慢。因此,不需要为了Android而恢复到数组、vars和while循环:)
祝你好运!