编译android源码时,jack server 出现out of memory error 错误的解决方法

本文介绍了解决Android源码编译过程中出现的Jackserver OutOfMemoryError问题的方法。主要包括修改相关源码及重启Jackserver两个步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译android源码时,jack server 出现out of memory error 错误的解决方法:

问题现象如下:



问题的解决方案如下,共两步:

Step1:修改jack server相关源码


Step2:重启Jack server

./prebuilts/sdk/tools/jack-admin stop-server

用以上命令关闭即可,重新make时它会被再次打开。


完毕

参考:

http://blog.csdn.net/pcsxk/article/details/52013904

http://www.cnblogs.com/changyuet/p/5951509.html

http://www.cnblogs.com/wanqieddy/archive/2013/01/28/2880175.html


[ 3% 989/30520] Building with Jack: out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/with-local/classes.dex FAILED: /bin/bash -c "(rm -f out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/with-local/classes.dex ) && (rm -f out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/classes.jack ) && (rm -rf out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/jack-rsc ) && (mkdir -p out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/with-local/ ) && (mkdir -p out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/ ) && (mkdir -p out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/jack-rsc ) && (rm -f out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/jack-rsc/java-source-list ) && (touch out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/jack-rsc/java-source-list ) && (echo -n 'libcore/dex/src/main/java/com/android/dex/Annotation.java libcore/dex/src/main/java/com/android/dex/ClassData.java libcore/dex/src/main/java/com/android/dex/ClassDef.java libcore/dex/src/main/java/com/android/dex/Code.java libcore/dex/src/main/java/com/android/dex/Dex.java libcore/dex/src/main/java/com/android/dex/DexException.java libcore/dex/src/main/java/com/android/dex/DexFormat.java libcore/dex/src/main/java/com/android/dex/DexIndexOverflowException.java libcore/dex/src/main/java/com/android/dex/EncodedValue.java libcore/dex/src/main/java/com/android/dex/EncodedValueCodec.java libcore/dex/src/main/java/com/android/dex/EncodedValueReader.java libcore/dex/src/main/java/com/android/dex/FieldId.java libcore/dex/src/main/java/com/android/dex/Leb128.java libcore/dex/src/main/java/com/android/dex/MethodId.java libcore/dex/src/main/java/com/android/dex/Mutf8.java libcore/dex/src/main/java/com/android/dex/ProtoId.java libcore/dex/src/main/java/com/android/dex/SizeOf.java libcore/dex/src/main/java/com/android/dex/TableOfConten
最新发布
07-26
<think>我们正在解决Android源码构建遇到的Jack编译错误,具体错误发生在core-libart模块,错误信息可能是类似"out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/with-local/classes.dex] Error 41"这样的。根据引用[5]中的信息,这个错误可能是由于Jack服务器端口冲突引起的。同,引用[2]和[3]提到Jack是一种新的Android工具链,它取代了传统的工具链(如javac、dx等),并且Jack Server编译过程中扮演重要角色。 ### 解决步骤 #### 步骤1:确认错误信息 首先,请确认完整的错误日志。典型的Jack编译错误可能包含以下信息: - `Communication error with Jack server` - `Jack server build failed` - `Failed to allocate Jack server port` 或端口冲突 #### 步骤2:检查Jack服务器配置(重点) 根据引用[5]的解决方案,错误可能是由于Jack服务器端口被占用或配置错误导致的。请按以下步骤操作: 1. **检查Jack服务器配置文件** 在用户主目录下找到`.jack`文件(隐藏文件): ```bash cat ~/.jack ``` 检查以下配置项(注意端口号): ```bash SERVER_PORT_SERVICE=8072 # 默认服务端口 SERVER_PORT_ADMIN=8073 # 默认管理端口 ``` 2. **修改端口号** 如果发现端口冲突(例如,同一台服务器上有多个用户同编译),修改端口号: ```bash vim ~/.jack ``` 修改为未被占用的端口(例如): ```bash SERVER_PORT_SERVICE=8272 SERVER_PORT_ADMIN=8373 ``` 3. **重启Jack服务器** 修改配置后,重启Jack服务器使其生效: ```bash # 停止Jack服务器 jack-admin stop-server # 启动Jack服务器 jack-admin start-server ``` #### 步骤3:清理Jack服务器缓存 如果端口配置正确但问题依旧,清理Jack服务器缓存并重置状态: ```bash # 停止Jack服务器 jack-admin stop-server # 删除Jack服务器工作目录 rm -rf ~/.jack-server # 重新启动Jack服务器 jack-admin start-server ``` #### 步骤4:检查服务器资源 Jack编译需要大量内存资源。如果系统内存不足,会导致编译失败: - 确保编译机器有足够内存(至少16GB,推荐32GB以上) - 调整Jack服务器内存设置(在环境变量中设置): ```bash export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m" jack-admin stop-server jack-admin start-server ``` 其中`-Xmx4096m`表示分配4GB内存,可根据实际情况调整(例如设置为`-Xmx8192m`分配8GB)。 #### 步骤5:检查多用户冲突 在共享服务器上,多个用户同使用Jack服务器可能导致冲突(引用[5]提到“编译有别人登录服务器”)。解决方案: - 每个用户使用独立的Jack服务器端口(通过修改`~/.jack`) - 或者,在编译前确保没有其他用户的Jack服务器正在运行: ```bash # 查看所有Jack进程 ps aux | grep jack # 强制结束其他用户的Jack进程(需管理员权限) sudo killall -9 java ``` #### 步骤6:禁用Jack(备用方案) 如果以上方法无效,且你不需要Jack的特性(如Java 8支持),可以禁用Jack: 1. 在Android源码的`build/core/main.mk`中,注释掉Jack相关配置: ```makefile # 注释掉以下行 # $(call jack-setup) ``` 2. 或者,在模块的Android.mk中设置: ```makefile LOCAL_JACK_ENABLED := disabled ``` > **注意**:禁用Jack可能导致无法使用Java 8特性。 ### 问题原因分析 - **端口冲突**:多个Jack服务器实例尝试绑定相同端口(引用[5]) - **内存不足**:Jack编译core-libart等核心模块需要大量内存 - **缓存损坏**:Jack服务器状态文件(`~/.jack-server`)损坏 - **并发冲突**:多用户同编译干扰Jack服务器 ### 相关问题 1. 如何查看当前Jack服务器的运行状态和端口占用情况? 2. 在Android源码编译中,如何为特定模块禁用Jack编译? 3. Jack工具链与传统的javac/dx工具有哪些主要区别? 4. 如何永久调整Jack服务器的内存分配设置? [^2]: 多用户环境下的Jack服务器端口冲突 [^5]: Jack服务器端口配置错误导致编译中断</think>### 解决Android源码构建中的Jack编译错误(core-libart模块) 当在构建Android源码遇到类似错误: ``` out/target/common/obj/JAVA_LIBRARIES/core-libart_intermediates/with-local/classes.dex] Error 41 ``` 这通常是Jack服务器(Android的Java编译工具链)的配置冲突或资源问题导致的。以下是系统化的解决方案: --- ### 解决方案步骤 #### 1. **修复Jack服务器端口冲突(最常见原因)** 根据引用[5],端口冲突是核心原因: ```bash # 编辑Jack配置文件 vim ~/.jack # 修改以下关键参数(端口号增加1000避免冲突) SERVER_PORT_SERVICE=8272 # 原8072 → 8272 SERVER_PORT_ADMIN=8373 # 原8073 → 8373 # 重启Jack服务器 jack-admin stop-server jack-admin start-server ``` > **原理**:多用户/多进程同编译会导致端口抢占,修改端口可避免冲突[^5]。 #### 2. **清理Jack服务器缓存** ```bash # 停止服务并清理缓存 jack-admin kill-server rm -rf ~/.jack-server/ # 删除服务器缓存 rm -rf out/target/common/obj/JAVA_LIBRARIES/core-libart* # 删除问题模块缓存 # 重新初始化 jack-admin start-server ``` > **注意**:此操作会清除所有编译缓存,首次重建较慢。 #### 3. **增加Jack服务器内存** 在`~/.jack`中添加内存配置: ```bash # 增加JVM内存限制(根据机器配置调整) JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m" ``` 重启服务后验证: ```bash jack-admin list-server ``` > **推荐值**:`-Xmx4096m`(4GB)或更高,尤其当编译大型模块如`core-libart`[^3]。 #### 4. **禁用Jack(备用方案)** 在源码中全局禁用Jack(回退到旧工具链): ```makefile # 在build/core/main.mk中添加 ANDROID_COMPILE_WITH_JACK := false ``` 或在模块级禁用: ```makefile # 在core-libart的Android.mk中添加 LOCAL_JACK_ENABLED := disabled ``` > **代价**:失去Jack的增量编译优势[^1][^3]。 --- ### 根本原因分析 1. **端口冲突** 多用户/多进程共享服务器,默认端口`8072/8073`被抢占导致通信失败[^5]。 2. **内存不足** `core-libart`是核心系统模块,编译需要较大内存,默认配置易溢出[^3]。 3. **缓存损坏** Jack服务器状态文件(`~/.jack-server`)损坏导致异常中断。 4. **并发限制** `SERVER_COUNT=1`(单实例)无法处理并行编译任务[^5]。 --- ### 验证修复 ```bash # 重新编译单个模块验证 mmm frameworks/base/core/jni # 完整系统编译(测试) make -j8 ``` 观察输出中是否出现: ``` Starting Jack server... Jack server started successfully ``` --- ### 相关问题 1. 如何检测当前系统中哪些进程占用了Jack服务器的默认端口(8072/8073)? 2. Android源码编译中,除了Jack还有哪些替代的Java编译工具链? 3. 当遇到`Jack server out of memory`错误,如何精确计算所需内存大小? 4. 在多用户协作的编译服务器上,如何安全地共享Jack服务器实例? [^1]: Jack通过预生成.dex提升编译速度 [^3]: Jack服务器配置错误导致通信中断 [^5]: 端口冲突是编译失败的常见原因
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值