安卓源代码编译错误:"Try increasing heap size with java option '-Xmx<size>'"



当我尝试编译Android源代码时发生错误(源代码版本:6.0.1;内存: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$ 

任何人都可以告诉我为什么编译失败?

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

溶液

在开始干净的android构建之前,将JACK_SERVER_VM_ARGUMENTS设置为包含-Xmx=4g,然后手动停止并启动插孔服务器。假设您位于 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

这为我解决了问题。

当前为 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

更新到 6.0 后我也遇到了这个问题 我的电脑是一台带有 7GB 内存的 i8 笔记本电脑。它在 v5.x 及更低版本中运行良好。

原因是错误消息指出的内存不足。在 v6.x 版本中,使用了更多的插孔。就我而言,将插孔的数量减少到 1 解决了这个问题。

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

$HOME/.jack-server/config.properties
    jack.server.max-service=1
[100% 19740/19740]
#### make completed successfully (11:55:27 (hh:mm:ss)) ####

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...

我找到了这篇文章:仅使用 8 GiB RAM 构建 AOSP 7.x 牛轧糖


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

然后,重新启动插孔服务器 - 否则,如果它在后台运行,它将继续使用旧的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

这也是我的问题:java默认的Xmx设置已经接近4GB(准确地说:4011MB),所以问题在于运行的并发插孔服务器的数量。我的机器有 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

它根据安卓官方文档将插孔服务器的MAX数量添加到旧位置和新位置:

插孔

疑难解答:如果您的计算机在编译过程中无响应,或者如果您遇到杰克编译失败的"内存不足错误",您可以通过编辑 $HOME/.jack 并将SERVER_NB_COMPILE更改为较低的值来减少插孔同时编译的数量来改善这种情况。 https://source.android.com/source/jack.html

相关内容

最新更新