我使用的源码为SudaMod,3.1分支的源代码,第一次编译Android M以上的源码,就莫名其妙的遇到了几个关于JACK的坑,以下就列举几个常见的错误以及解决办法。
第一个错误:
Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@google.com)).
GC overhead limit exceeded.
Try increasing heap size with java option'-Xmx'.
Warning: This may have producedpartial or corrupted output.
造成原因:
这个错误最傻瓜,解决方法在输出信息里已经提示得很明确了。错误大概意思是当前需要的堆大小超出限制,于是内存溢出了,尝试使用java 选项'-Xmx'.来增加堆大小。
解决方法:
(1)编辑 prebuilts/sdk/tools/jack-admin,找到第29行:
#
# Settings
#
JACK_HOME="${JACK_HOME:=$HOME/.jack-server}"
CLIENT_SETTING="${CLIENT_SETTING:=$HOME/.jack-settings}"
TMPDIR=${TMPDIR:=/tmp}
JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation}"
增加选项: -Xmx4096m,或是: -Xmx4g,修改好即为(二选一):
JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m}"
JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g}"
(2)编辑 prebuilts/sdk/tools/jack-admin,找到第454行:
RUNNING=$?
if [ "$RUNNING" = 0 ]; then
echo "Server is already running"
else
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
增加选项: -Xmx4096m,或是: -Xmx4g,修改好即为(二选一):
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS-Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS-Xmx4g -cp $LAUNCHER_JAR $LAUNCHER_NAME"
推荐第一种解决方法,-Xmx后面为分配的堆大小,这个值根据你的电脑内存而定,标准为内存大小的4分之1。当不够的时候再自己增加。
第二个错误:
FAILED: /bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar 2>&1 || (exit 0) ) && (JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8 -XX:+TieredCompilation\" prebuilts/sdk/tools/jack-admin start-server 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update server prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar 4.8.ALPHA 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-2.28.RELEASE.jar 2.28.RELEASE || exit 47; prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-3.36.CANDIDATE.jar 3.36.CANDIDATE || exit 47; prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.7.BETA.jar 4.7.BETA || exit 47 )"
Jack server already installed in "/home/gesangtome/.jack-server"
Communication error with Jack server (77), try 'jack-diagnose' or see Jack server log
Failed to contact Jack server: Problem reading /home/gesangtome/.jack-server/server.pem. Try 'jack-diagnose'
Failed to contact Jack server: Problem reading /home/gesangtome/.jack-server/server.pem. Try 'jack-diagnose'
造成原因:
通过查看$HOME/.jack-server下的日志,定位到具体错误为:Failed to contact Jack server: Problem reading /home/gesangtome/.jack-server/server.pem. Try 'jack-diagnose',像这种情况,我们重新安装以下JACK服务,一些关键文件就重新生成了。
解决方法:
进入jack目录:cd ./prebuilts/sdk/tools/
先停止服务:jack-admin stop-server
再卸载服务:jack-admin uninstall-server
重新安装服务:jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar