在Android上使用Scala值得吗?有很多开销吗?问题?

ege*_*ari 28 android scala

我正在考虑使用Scala而不是常规Java(或者我猜的等价物)在Android上构建应用程序.这值得么?

有什么问题和不必要的麻烦吗?

Kev*_*ght 26

使用Scala应该是无痛的,因为dex编译器只使用字节码 - 这正是Scala产生的.

那么你最大的问题就是对scala-library的依赖,因为dex期望一切都在一个Jar中.这最好用Proguard处理(它也会删除未使用的代码并为您提供较小的可执行文件,非常适合移动设备)


目前的最佳做法是将SBT与Android插件一起使用; 它会照顾你的一切:http://github.com/jberkel/android-plugin

如果您必须使用Eclipse和Google提供的插件,那么您将拥有非标准的目录结构.我还写了一篇关于如何处理这个问题的文章:http://www.assembla.com/wiki/show/scala-ide/Developing_for_Android

但要注意......这样需要付出更多的努力!

  • 主要问题是那些库使用反射(类似于myClass.getMethod()),因为proguard无法检测它们,你需要声明手动保留这些类/函数.有些库很难让它与Scala/Proguard/Android一起使用,例如.GDATA-Java的客户端.或者你需要进行一些调整以在proguard处理JAR之后保留中文文件,例如.ical4j.否则,库通常可以非常容易地使用此组合. (3认同)

om-*_*nom 15

2011年Scala Days上来自bu.mp的人们的演讲.

免责声明:虽然他们谈论了他们所面临的问题,但整体体验肯定是积极的.而且,这是一个特定团队的问题,而且是次要问题.

摘要:

  • 内存使用情况.闭包吃了记忆.Scala已经关闭了所有地方.虽然你的台式PC上不是一个相对大的问题(内存开销),但是当你为手机开发时应该考虑它.你可能会问:他们是如何解决的?他们寻找紧密的循环,然后对它们进行优化(在无封闭的scala/java中重写).(第26分钟)我认为具有原生闭包支持的Java 8将缓解此问题下一个scala版本将针对具有新后端的Java 8平台,旨在提高性能.关于路线图的讨论就在这里.
  • 较慢的编译器(正如Michal Galpin所说,他们有15秒的时间用于Java代码编译,大约一分钟用于Scala,大约一个订单用于Proguard,但请注意它取决于你的代码库和机器,但我怀疑这个比例将是相同).在制作UI时尤其烦人,比如移动像素,按钮等,并希望快速查看结果.(第7分钟)
  • 内部类有一些问题,这对于Android来说很常见(详见23:00).
  • scala-java-collections interop中的scalac(scala编译器)中存在 罕见的错误.通过明确地写出这些东西来解决问题(我怀疑这根本不是很多样板).

虽然他也谈到了IDE,但我认为这不是一个问题(看看这篇文章,关于Scala 环境).做Scala IDE和IntelliJ的人做得很好,IDE支持越来越好.

对于单元测试,可以使用RoboSpecs(允许您在JVM内部而不是在模拟器内部运行单元测试),这样更快.

我偶然发现的最大问题之一是dex格式的限制(每个dex文件不超过65536个方法引用).Scala库根本不符合限制,因此您必须通过以下方式解决此问题:

  • 使用Proguard来修剪scala lib中的脂肪.但是我的笔记本电脑真的很慢,而且只是在开发阶段浪费时间(但是当你将你的应用发布到Google Play时非常有帮助)
  • 使用预定义库.不好的是,这个项目有点遗弃,仅包含2.9.0-1版本.
  • 在手机上预安装 scala

有些人声称IDE存在问题,但事情变化很快:当前版本的IntelliJ IDEA 12不仅支持Scala作为插件,而且还包含Android的UI Designer.此外,您可以使用Eclipse,它支持Android(由Google)和Scala(由Typesafe)支持.Android Studio(基于IDEA的新IDE,在Google IO '13上宣布并由Google开发)支持IDEA插件,因此Scala.


pr1*_*001 5

我们上周五在伦敦Scala Lift Off讨论了这个问题,并且一致认为只要你避开Actors,它一般都能正常工作.另外,强烈推荐使用sbt-android-plugin.Nathan Hamblen的博客上有很多关于Android的帖子,而且标记为Scala的帖子还有很多值得关注的问题.