从Ant构建我们的Android应用程序失败,出现此错误:
[apply]
[apply] UNEXPECTED TOP-LEVEL ERROR:
[apply] java.lang.OutOfMemoryError: Java heap space
[apply] at java.util.HashMap.<init>(HashMap.java:209)
[apply] at java.util.HashSet.<init>(HashSet.java:86)
[apply] at com.android.dx.ssa.Dominators.compress(Dominators.java:96)
[apply] at com.android.dx.ssa.Dominators.eval(Dominators.java:132)
[apply] at com.android.dx.ssa.Dominators.run(Dominators.java:213)
[apply] at com.android.dx.ssa.DomFront.run(DomFront.java:84)
[apply] at com.android.dx.ssa.SsaConverter.placePhiFunctions(SsaConverter.java:265)
[apply] at com.android.dx.ssa.SsaConverter.convertToSsaMethod(SsaConverter.java:51)
[apply] at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:100)
[apply] at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:74)
[apply] at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:269)
[apply] at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:131)
[apply] at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:85)
[apply] at com.android.dx.command.dexer.Main.processClass(Main.java:297)
[apply] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:276)
[apply] at com.android.dx.command.dexer.Main.access$100(Main.java:56)
[apply] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:228)
[apply] at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
[apply] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:130)
[apply] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:108)
[apply] at com.android.dx.command.dexer.Main.processOne(Main.java:245)
[apply] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:183)
[apply] at com.android.dx.command.dexer.Main.run(Main.java:139)
[apply] at com.android.dx.command.dexer.Main.main(Main.java:120)
[apply] at com.android.dx.command.Main.main(Main.java:87)
BUILD FAILED
我尝试通过设置ANT_OPTS =“ - Xms256m -Xmx512m”来为Ant提供更多内存。 (这个构建机器有1Gb RAM)。
我是否只需要更多内存或者还有什么可以尝试的吗?
答案 0 :(得分:3)
找到此链接有助于:http://groups.google.com/group/android-beginners/browse_thread/thread/1e0a66a5ab115168
解决方案似乎是编辑你的dx或dx.bat shell脚本(取决于你的平台)并取消注释设置堆大小的行。
例如,
vi $ANDROID_SDK/platforms/*/tools/dx
将允许您在mac(可能还有Linux)上编辑每个dx文件。
然后取消注释javaOpts
行,其中包含以下内容:
# If you want DX to have more memory when executing, uncomment the following
# line and adjust the value accordingly. Use "java -X" for a list of options
# you can pass here.
#
# javaOpts="-Xmx256M"
这显然不是一个理想的解决方案,因为每次更新平台SDK时,您的更改都会受到破坏。但它确实为我做了伎俩。
答案 1 :(得分:0)
尝试将apply
任务的spawn
属性设置为true
,以便每次执行都作为自己的进程生成。您没有在build.xml中包含使用apply
任务的部分,但它看起来像这样:
<apply spawn="true" executable="command">
<fileset dir="."/>
</apply>
你明白了。
答案 2 :(得分:0)
我将构建移动到Linux机器上的新Hudson安装。问题消失了。
答案 3 :(得分:0)
您可以通过ant将堆参数传递给dex。
bind_ip=0.0.0.0
-JXmx4096M将被解析并设置为dex进程的堆大小。参见shell脚本dex。
答案 4 :(得分:0)
我通过编辑D:\ java \ android-sdk-windows \ build-tools \ 19.1.0 \ dx.bat(窗口环境)解决了这个问题
set defaultXmx=-Xmx3072M
set defaultXss=-Xss512m