web-dev-qa-db-fra.com

Erreur de compilation du code source Android: "Essayez d'augmenter la taille du segment de mémoire avec l'option Java '-Xmx <taille>'"

Une erreur se produit lorsque j'essaie de compiler le code source Android (version du code source: 6.0.1; RAM: 6G; système hôte: Ubuntu 14.04).

including ./system/netd/Android.mk ...
including ./system/security/keystore-engine/Android.mk ...
including ./system/security/keystore/Android.mk ...
including ./system/security/softkeymaster/Android.mk ...
including ./system/tools/aidl/Android.mk ...
including ./system/update_engine/Android.mk ...
including ./system/vold/Android.mk ...
including ./system/weaved/Android.mk ...
including ./system/webservd/Android.mk ...
including ./tools/external/fat32lib/Android.mk ...
Starting build with ninja
ninja: Entering directory `.'
[  0% 1/21275] Ensure Jack server is installed and started
Jack server already installed in "/home/eddy/.jack-server"
Launching Jack server Java -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -cp /home/eddy/.jack-server/launcher.jar com.Android.jack.launcher.ServerLauncher
[  0% 17/21275] Host Java: conscrypt-Host (out/Host/common/obj/Java_LIBRARIES/conscrypt-Host_intermediates/classes)
warning: [options] bootstrap class path not set in conjunction with -source 1.7
external/conscrypt/src/openjdk/Java/org/conscrypt/Platform.Java:39: warning: AlgorithmId is internal proprietary API and may be removed in a future release
import Sun.security.x509.AlgorithmId;
                        ^
external/conscrypt/src/openjdk/Java/org/conscrypt/Platform.Java:243: warning: AlgorithmId is internal proprietary API and may be removed in a future release
            return AlgorithmId.get(oid).getName();
                   ^
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
3 warnings
[  0% 18/21275] Host Java: signapk (out/Host/common/obj/Java_LIBRARIES/signapk_intermediates/classes)
warning: [options] bootstrap class path not set in conjunction with -source 1.7
1 warning
[  0% 73/21275] Building with Jack: out/target/common/obj/Java_LIBRARIES/framework_intermediates/with-local/classes.dex
FAILED: /bin/bash out/target/common/obj/Java_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp
GC overhead limit exceeded
Try increasing heap size with Java option '-Xmx<size>'
Warning: This may have produced partial or corrupted output.
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] Error 1

#### make failed to build some targets (14:09 (mm:ss)) ####

eddy@eddy-OptiPlex-390:~/WORKING_DIRECTORY$ 

Tout le monde peut me dire pourquoi la compilation a échoué?

19
Eddy.Liu

J'ai eu le même problème. J'ai donc essayé de définir JACK_SERVER_VM_ARGUMENTS pour inclure -Xmx=4g, mais lors de la reconstruction, la sortie du journal a montré que cela n'était pas inclus dans le démarrage. Je ne sais pas pourquoi, on dirait que les vars env ne sont pas correctement transmis au script de construction.

Solution

Avant de lancer une nouvelle version d’Android, définissez JACK_SERVER_VM_ARGUMENTS pour inclure -Xmx=4g, puis arrêtez et démarrez le serveur Jack manuellement . Étant donné que vous êtes dans l'arborescence source principale d'AOSP, exécutez ce qui suit:

export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server

pour cm, vous pouvez utiliser 

export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
jack-admin kill-server && jack-admin start-server

Cela a résolu le problème pour moi.

45
icyerasor

La méthode actuelle pour définir Xmx pour la prise est:

export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
out/Host/linux-x86/bin/jack-admin kill-server
out/Host/linux-x86/bin/jack-admin start-server
8
user6310924

J'ai également eu ce problème après la mise à jour vers la version 6.0. Mon ordinateur est un ordinateur portable i7 avec 8 Go de RAM. Cela fonctionnait bien avec les versions v5.x et inférieures.

La raison est pas assez de mémoire comme l'indique le message d'erreur. Dans la version v6.x, plus de Jack est utilisé. Dans mon cas, réduire le nombre de prises à 1 a résolu le problème.

Je peux maintenant continuer à compiler avec 8 Go de RAM.

$HOME/.jack-server/config.properties
    jack.server.max-service=1

[100% 19740/19740]
#### make completed successfully (11:55:27 (hh:mm:ss)) ####
7
dave

La version Android (testée avec la version 7.1.2) utilise sa propre version privée de Jack (une chaîne d’outils Jack pourrait être installée ailleurs sur le système). Vous devez donc utiliser des variables spécifiques à Android.

De https://Android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-server.md :

(recherchez "Si les compilations de Jack échouent en raison d'une erreur de mémoire insuffisante.")

Résumer:

$ # Stop the Jack server
$ jack-admin stop-server
$ # apply the new setting
$ export Android_JACK_VM_ARGS="-Xmx2g -Dfile.encoding=UTF-8 -XX:+TieredCompilation"
$ Finally, restart the build (do not manually start the Jack server!)
$ m # or any other build command

Le système de compilation doit prendre en compte le changement et sortir la ligne:

Environment variable Android_JACK_VM_ARGS was set, regenerating...

ou (après un changement ultérieur):

Environment variable Android_JACK_VM_ARGS was modified (-Xmx2g -Dfile.encoding=UTF-8 -XX:+TieredCompilation => -Xmx4g -Dfile.encoding=UTF-8 -XX:+TieredCompilation), regenerating...
2
ack

C'était aussi mon problème: le paramètre Java par défaut de Xmx était déjà proche de 4 Go (plus précisément: 4011 Mo); le problème était donc plutôt le nombre de serveurs de prises simultanés en cours d'exécution. Ma machine avait 8 processeurs mais seulement 16 Go de RAM, mais aurait requis 32 Go (8 * 4 = 32).

Ma solution (légèrement plus dynamique):

MAX=$(($(free -g | awk '/^Mem:/{print $NF}') / 4))
if [ $MAX -le 0 ]; then
    MAX=1
fi
echo "SERVER_NB_COMPILE=$MAX" >> ~/.jack
mkdir -p ~/.jack-server
echo "jack.server.max-service=$MAX" >> ~/.jack-server/config.properties

Il ajoute le nombre MAX de serveurs jack à l'ancien et au nouvel emplacement en fonction du document officiel Android: 

Dépannage Jack: si votre ordinateur ne répond plus pendant la compilation ou si vous rencontrez des problèmes avec les compilations Jack, vous pouvez améliorer la situation en réduisant le nombre de compilations simultanées Jack en modifiant votre $ HOME/.jack. et changer SERVER_NB_COMPILE à une valeur inférieure. https://source.Android.com/source/jack.html

0
Reggie