代码之家  ›  专栏  ›  技术社区  ›  Eno

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

  •  2
  • Eno  · 技术社区  · 15 年前

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

    我只是需要更多的记忆还是有什么我可以尝试的?

    5 回复  |  直到 8 年前
        1
  •  3
  •   emmby    14 年前

    找到有助于: 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时,您的更改都会受到影响。但它确实帮了我一把。

        2
  •  0
  •   Rob Heiser    15 年前

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

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

    你明白了。

        3
  •  0
  •   Eno    15 年前

    我将我们的构建转移到了一个新的Hudson安装在Linux设备上。问题消失了。

        4
  •  0
  •   hoot    9 年前

    可以通过Ant将堆参数传递给dex。

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

    -JXMX4096M将被解析并设置为DEX进程的堆大小。参见shell脚本dex。

        5
  •  0
  •   Kim    8 年前

    我通过编辑d:\java\Android SDK Window \Bug工具\19.1.0\dx.BAT(窗口环境)解决了这个问题。

    set defaultXmx=-Xmx3072M
    set defaultXss=-Xss512m