2010-04-15 7 views
2

Construire notre application Android de Ant échoue avec cette erreur:Ant construire à partir du fichier de construction généré par Android échoue - comment réparer?

[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 

Ive a essayé de donner plus de mémoire Ant en définissant ANT_OPTS = "- Xms256m -Xmx512m". (Cette machine de construction a 1 Go de RAM).

Est-ce que j'ai juste besoin de plus de mémoire ou y at-il autre chose que je peux essayer?

+0

Combien de classes et les ressources sont là dans votre projet? Je n'ai jamais vu cette erreur. – CommonsWare

+0

Pas beaucoup du tout (bien que nous utilisions JNI pour charger une bibliothèque C statique). – Eno

Répondre

0

J'ai déplacé notre build vers une nouvelle installation Hudson sur une machine Linux. Le problème est parti.

+0

J'ai aussi ce problème, et cette solution particulière n'est pas un problème. D'autres idées? – emmby

0

Essayez de définir l'attribut spawn de la tâche apply sur true, afin que chaque exécution soit générée comme son propre processus. Vous n'avez pas inclus la partie de votre build.xml où vous utilisez la tâche apply, mais il ressemble à quelque chose comme ceci:

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

Vous avez l'idée.

+0

En utilisant le fichier build.xml généré par Android, la majeure partie de la configuration est tirée de android_rules.xml et mon fichier de construction est presque vide. – Eno

+0

même problème ici. D'autres solutions que de passer à une autre boîte de dev? – emmby

3

trouvé ce lien qui aide: http://groups.google.com/group/android-beginners/browse_thread/thread/1e0a66a5ab115168

La solution semble être de modifier votre dx ou dx.bat script shell (en fonction de votre plate-forme) et décommenter la ligne qui définit la taille du tas.

Par exemple,

vi $ANDROID_SDK/platforms/*/tools/dx 

vous permettra d'éditer chacun de vos fichiers dx sur un mac (et peut-être linux).

décommenter Puis la ligne javaOpts qui dit quelque chose comme ce qui suit:

# 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" 

Ce n'est pas une solution idéale évidemment, puisque vos changements seront mis à mal chaque fois que vous mettez à jour votre plate-forme SDKs. Mais ça a fait l'affaire pour moi.

+0

Il n'existe plus de dossier de ce type **/tools/dx **. –

0

Vous pouvez passer des arguments de tas à dex via ant.

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

-JXmx4096M sera analysé et défini comme la taille de tas de processus de Dex. voir shell script dex.

0

J'ai résolu ce problème en modifiant D: \ java \ windows-sdk-android \ build-tools \ 19.1.0 \ dx.bat (environnement fenêtre)

set defaultXmx=-Xmx3072M 
set defaultXss=-Xss512m 
Questions connexes