Сборка Ant из сгенерированного Android файла сборки не удалась - как это исправить? - PullRequest
2 голосов
/ 16 апреля 2010

Сборка нашего Android-приложения из Ant завершается с ошибкой:

    [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 больше памяти, установив ANT_OPTS = "- Xms256m -Xmx512m". (Эта сборочная машина имеет 1 ГБ ОЗУ).

Мне просто нужно больше памяти или я могу попробовать что-нибудь еще?

Ответы [ 5 ]

3 голосов
/ 18 июня 2010

Нашел эту ссылку, которая помогает: http://groups.google.com/group/android-beginners/browse_thread/thread/1e0a66a5ab115168

Решение, по-видимому, состоит в том, чтобы отредактировать скрипт оболочки dx или dx.bat (в зависимости от вашей платформы) и раскомментировать строку, которая устанавливает размер кучи.

Например,

vi $ANDROID_SDK/platforms/*/tools/dx

позволит вам редактировать каждый из ваших dx файлов на mac (и, возможно, linux).

Затем раскомментируйте строку 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 своей платформы. Но это помогло мне.

0 голосов
/ 11 октября 2016

Я решил эту проблему, отредактировав D: \ java \ android-sdk-windows \ build-tools \ 19.1.0 \ dx.bat (Окружающая среда)

set defaultXmx=-Xmx3072M
set defaultXss=-Xss512m
0 голосов
/ 10 ноября 2015

Вы можете передавать аргументы кучи в dex через ant.

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

-JXmx4096M будет проанализирован и установлен как размер кучи процесса dex. см. сценарий оболочки dex.

0 голосов
/ 28 апреля 2010

Я переместил нашу сборку на новую установку Hudson на Linux. Проблема ушла.

0 голосов
/ 16 апреля 2010

Попробуйте установить для атрибута spawn задачи apply значение true, чтобы каждое выполнение вызывалось как отдельный процесс. Вы не включили часть своего build.xml, где вы используете задачу apply, но она будет выглядеть примерно так:

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

Вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...