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

从Android生成的构建文件生成的Ant构建失败-如何修复?,android,memory,ant,build,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

从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
[应用]
[应用]意外的顶级错误:
[apply]java.lang.OutOfMemoryError:java堆空间
[apply]位于java.util.HashMap.(HashMap.java:209)
[apply]位于java.util.HashSet.(HashSet.java:86)
[apply]位于com.android.dx.ssa.Dominators.compress(Dominators.java:96)
[应用]com.android.dx.ssa.Dominators.eval(Dominators.java:132)
[apply]位于com.android.dx.ssa.Dominators.run(Dominators.java:213)
[apply]位于com.android.dx.ssa.DomFront.run(DomFront.java:84)
[应用]位于com.android.dx.ssa.SsaConverter.placePhiFunctions(SsaConverter.java:265)
[应用]位于com.android.dx.ssa.SsaConverter.convertToSsaMethod(SsaConverter.java:51)
[apply]位于com.android.dx.ssa.Optimizer.optimize(Optimizer.java:100)
[apply]位于com.android.dx.ssa.Optimizer.optimize(Optimizer.java:74)
[apply]位于com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:269)
[应用]位于com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:131)
[应用]位于com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:85)
[apply]位于com.android.dx.command.dexer.Main.processClass(Main.java:297)
[apply]位于com.android.dx.command.dexer.Main.processFileBytes(Main.java:276)
[apply]位于com.android.dx.command.dexer.Main.access$100(Main.java:56)
[apply]位于com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:228)
[apply]位于com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
[应用]com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:130)
[apply]位于com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:108)
[apply]位于com.android.dx.command.dexer.Main.processOne(Main.java:245)
[apply]位于com.android.dx.command.dexer.Main.processAllFiles(Main.java:183)
[apply]位于com.android.dx.command.dexer.Main.run(Main.java:139)
[apply]位于com.android.dx.command.dexer.Main.Main(Main.java:120)
[apply]位于com.android.dx.command.Main.Main(Main.java:87)
构建失败
我尝试通过设置Ant_OPTS=“-Xms256m-Xmx512m”来给Ant更多内存。(此生成计算机具有1Gb RAM)


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

尝试将
apply
任务的
spawn
属性设置为
true
,以便每个执行都作为自己的进程生成。您没有包括build.xml中使用
apply
任务的部分,但是它看起来像这样:

<apply spawn="true" executable="command">
  <fileset dir="."/>
</apply>


你明白了。

我将我们的构建迁移到一个新的Hudson安装在Linux机器上。问题消失。

找到此链接,可帮助:

解决方案似乎是编辑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时,您的更改都会遭到破坏。但它确实帮了我的忙。

您可以通过ant将堆参数传递给dex

<apply executable="${dx}" failonerror="true" parallel="true">
            <arg value="-JXmx4096M" />
            <arg value="--dex" />
            <arg value="--multi-dex" />


-JXmx4096M将被解析并设置为dex进程的堆大小。请参阅shell脚本dex。

我已通过编辑D:\java\android sdk windows\build tools\19.1.0\dx.bat(窗口环境)解决了此问题


您的项目中有多少类和资源?我从来没有见过这个错误。虽然我们使用JNI加载一个静态C库,但很少。我使用Android生成的build.xml,所以大部分配置都是从Android_rules.xml中提取的,我的构建文件大部分是空的。这里也有同样的问题。除了移动到另一个开发箱之外,还有其他解决方案吗?我也有这个问题,这个特定的解决方案不是问题。还有其他想法吗?现在已经没有这样的文件夹/工具/dx了。
set defaultXmx=-Xmx3072M
set defaultXss=-Xss512m