Android生成的构建文件中的Ant构建失败 - 如何修复?

时间:2010-04-15 23:22:17

标签: android memory ant build

从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)。

我是否只需要更多内存或者还有什么可以尝试的吗?

5 个答案:

答案 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