问题 Android,Scala和Proguard


在首先遇到与Android命令行工具集相同的问题之后,我终于设法将Scala和Java源代码的混合编译成可用的apk。

正如许多人所说,我用过 proguard 通过。挤压Scala库 dex 工具。问题是这样的:

BUILD SUCCESSFUL
Total time: 1 minute 29 seconds

一分半钟。我们在这里讨论的是具有Hello-World复杂性的应用程序。我认为我不能那样发展。我需要参加冥想课程。

这是 proguard 组态:

-injars ${out.absolute.dir}/classes:${scala-library.jar}(!META-INF/MANIFEST.MF,!library.properties)
-outjars ${out.absolute.dir}/classes.min.jar
-libraryjars ${android.jar}
-dontwarn
-dontoptimize
-dontobfuscate
-keep public class * extends android.app.Activity

有没有办法加快proguard步骤?

编辑:我在一台相当不错的双核3GB ram机器上运行它,在64位Linux上运行。一阵奔跑 ant compile (scalac/javac)需要3秒钟。满满的 ant install 需要1:30,如上所述。就是这样 proguard 根据输出,“冻结”的步骤很可能是因为scala / android运行时lib大小。


3530
2017-10-09 14:11


起源

我们需要更多细节,例如你的机器设置...... cpus,ram等的数量。 - Fred Grott
据说编译器会成为你使用的编译器的瓶颈吗? - Fred Grott
也可以看看: proguard.sourceforge.net/manual/examples.html#scala。我认为这不是编译器的瓶颈,但只有8.5 Mb的scala运行时需要很长时间才能读入和打包。 - Rogach
根据要求进行了修改 - slezica
测试运行时不需要proguard步骤。只要仿真器可以处理大尺寸,您也可以避免使用proguard进行测试。 - Daniel C. Sobral


答案:


通过android Ant构建工作可能不是解决这个问题的正确方法。

目前“最佳建议”是使用SBT

插件。


7
2017-10-09 15:07



同意。但请注意我在上面的评论中提到的2.9.1的问题。可以在设备上安装Scala(2.8.x)库并避免proguard步骤,如下所述: zegoggl.es/2011/07/... 但请注意,最新版本的Android SDK存在一些问题(据我所知尚未解决)。 - Paul Butcher
我还没有尝试过SBT,但我不明白它会有什么帮助。它是否自动执行我手动安排的相同proguard运行? - slezica
请注意,proguarding现在是sbt android插件的一部分(不要害怕它显示的误导和错误的许可证消息,请参阅 github.com/jberkel/android-plugin/issues/129) - ron


与Scala 2.8.1库相比,ProGuard需要更长的时间来缩小Scala 2.9.1库(54秒对13秒,对于8.5 MB对比6.2 MB)。库类的结构从根本上发生了变化,或者某些新类导致了过多的计算。我必须弄清楚ProGuard或其配置是否可以针对这种情况进行改进。目前,您可以使用Scala 2.8.1。

我假设您的ProGuard配置还包含Android和Scala所需的选项,如中所述 ProGuard手册。如果您使用的是常规Android构建过程,则输入(classeslibs)和图书馆(android.jar)已在Ant构建文件中为您指定,并且您无需在ProGuard配置文件中再次指定它们。阅读它们两次只需要花费时间并产生许多警告(你已经完全关闭了 - 选择性地关闭它们会更安全)。


5
2017-10-09 23:16



尽管花费的时间更长,我还是遇到了Proguard和Scala 2.9.1的奇怪问题。在混淆之后,shrinkin删除了基本的scala东西,比如Traversable或HashMap.foreach等。所以它会导致程序失败,ClassNotFoundError类axy(etc ..)proguard_map指向上面提到的和使用过的Scala对象。 - vertti
@vertti一个已处理的HelloWorld程序(与Scala 2.9.1结合使用)在我尝试时运行正常,所以我需要有关你代码的更多细节。如果您在此处或在ProGuard的帮助论坛中发布单独的问题,我会调查它。 - Eric Lafortune
谢谢,我会尝试,但我目前的游戏是大约6000行scala并且撕掉一个功能部分仍然打破了proguard可能会很困难。 - vertti
感谢您的帮助(在proguard bug tracker上)。致别人:我的问题与Windows文件系统有关,而与Scala无关(参见上一篇文章: proguard.sourceforge.net/manual/limitations.html) - vertti
看到这个: scalandroid.blogspot.com/2012/03/...  - Scala 2.10将再次与proguard一起摇滚 - ron


如果你有一个带根的手机并且只想测试它,你可以直接在你的手机上安装scala libs,这样你就不再需要proguard步骤了:

https://github.com/jrudolph/scala-android-libs


3
2017-10-11 15:19