Android源代码编译错误:"尝试使用Java选项'-Xmx<size>'增加堆大小"。

25

在我尝试编译Android源代码时发生了错误(源代码版本:6.0.1;RAM:6G;主机系统: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$ 

有人可以告诉我编译失败的原因吗?


尝试查看这个链接: https://dev59.com/rpLea4cB1Zd3GeqP4ZkF - Qiming Chen
尝试这个解决方案:https://dev59.com/AFsW5IYBdhLWcg3wdnJh - Jacob Abraham
6个回答

53

我遇到了同样的问题。所以我试图设置JACK_SERVER_VM_ARGUMENTS-Xmx=4g,但是当再次构建时,日志输出显示这并未包含在启动中。我不知道为什么,似乎环境变量没有正确传递给构建脚本。

解决方案

在开始进行干净的Android构建之前,将JACK_SERVER_VM_ARGUMENTS设置为-Xmx=4g,然后手动停止和启动jack服务器。假设您在AOSP的主源树中运行以下命令:

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

你可以使用 cm 进行计量。

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

这对我解决了问题。


我成功地完成了这个修改~ - Eddy.Liu
第一次运行后,当Jack被解包时,您可以将JACK_SERVER_VM_ARGUMENTS添加到~/.jack-settings中。这样,在将来它将被自动添加,而不需要手动重新启动。 - Torbins
1
通常情况下,不需要指定 jack-admin 的完整路径,只需在执行 . build/envsetup.sh 后将其添加到 $PATH 中即可。要查找 jack-admin 是否存在以及其位置,请运行 which jack-admin - ack
这对我有用,谢谢。Jack到底是什么?它给我带来了无尽的问题。 - Edward Falk

9

目前设置jack的Xmx的方法是:

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

1
是的。根据jack-admin脚本,JACK_SERVER_VM_ARGUMENTS应该被捕获。不知道为什么在通过make启动常规android构建时没有发生这种情况,而不是手动启动jack服务器?可能是环境变量没有被正确注入! - icyerasor

7

我在升级到6.0版本后也遇到了这个问题。我的电脑是一台配备8GB内存的i7笔记本电脑。在v5.x及以下版本中运行良好。

原因是如错误信息所述,内存不足。在v6.x版本中,使用了更多的Jack。在我的情况下,将Jack数量减少到1就解决了这个问题。

现在,我可以继续使用8GB内存进行编译。

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

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

1
抱歉,我误操作了。 - Gyapti Jain
请参考我之前非常相似的答案,根据当前可用的RAM动态应用您的解决方案,并在旧位置(棉花糖之前)和新位置(牛轧糖及以上)中插入最大数量的jack服务器。 - Reggie

2
Android构建(已测试7.1.2)使用其自己的私有版本的Jack(系统中可能安装了其他地方的Jack工具链),因此您必须使用特定于Android的变量。
来自https://android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-server.md
(搜索“如果您在内存不足错误上遇到Jack编译失败:”)
总结一下:
$ # 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

构建系统应该检测到变化并输出以下行:
Environment variable ANDROID_JACK_VM_ARGS was set, regenerating...

或者(在随后的更改之后):
Environment variable ANDROID_JACK_VM_ARGS was modified (-Xmx2g -Dfile.encoding=UTF-8 -XX:+TieredCompilation => -Xmx4g -Dfile.encoding=UTF-8 -XX:+TieredCompilation), regenerating...

+1 是的,我也在构建7.1.2版本,并且这个答案对我的情况最有效。其他答案提供了有用的信息和帮助,但是这个解决了问题。 - Les

1
我找到了这篇文章: 只使用8 GiB RAM构建AOSP 7.x Nougat
在一台8 GiB的机器上,最大堆大小不到2 GiB。
$ java -XshowSettings 2>&1  | grep Heap
    Max. Heap Size (Estimated): 1.71G

解决方案

一旦我理解了问题,只需要在启动jack-server时更改默认堆大小即可解决。要修复它,您需要编辑~/.jack-settings,并添加此行

JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"

然后,重新启动jack-server - 否则,如果它在后台运行,它将继续使用旧的Xmx值:

$ prebuilts/sdk/tools/jack-admin kill-server
$ prebuilts/sdk/tools/jack-admin start-server
Launching Jack server java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m
-cp /home/chris/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher

0
这也是我的问题:Java默认的Xmx设置已经接近4GB(确切地说是4011MB),因此问题实际上是并发jack服务器的数量。我的机器有8个CPU,但只有16GB的RAM,但需要32GB(8*4=32)。
我的(稍微更动态的)解决方案:
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

根据Android官方文档,它将MAX Jack服务器的数量添加到旧位置和新位置:

Jack故障排除:如果在编译过程中计算机变得无响应或者您遇到“内存溢出错误”的Jack编译失败,您可以通过编辑$ HOME / .jack并将SERVER_NB_COMPILE更改为较低的值来减少Jack同时编译的数量,从而改善情况。https://source.android.com/source/jack.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接