Android2.3 编译错误处理 make ......./noproguard.classes-with-local.dex] 已杀死

本文介绍了解决Dailybuild机器首次编译失败的问题,详细记录了如何通过增加虚拟内存(Swap)来解决编译过程中遇到的内存不足问题,并提供了具体的操作步骤。

今天在解决Daily build机器第一遍编译失败时,从网上获取一些消息,没有一个完整到方案,特整合供大家享用。

错误现象描述:

Install: out/host/linux-x86/framework/dx.jar
Copy: dx (out/host/linux-x86/obj/EXECUTABLES/dx_intermediates/dx)
Install: out/host/linux-x86/bin/dx
target Dex: core
make: *** [out/target/common/obj/JAVA_LIBRARIES/core_intermediates/noproguard.classes-with-local.dex] 已杀死

开始怀疑是软件的环境没有搭建好导致或者工具的版本不对,后来通过free -m查到内存快被耗光但是虚拟内存为0。通过增加虚拟内存解决该问题。


增加虚拟内存的方法如下:

查看内存空间大小:free -m // m表示显示的字节单位是m(megabytes)

下面我们就来增加系统的 Swap 大小。

1.首先用命令free查看系统内 Swap 分区大小。
free -m

total used free shared buffers cached
Mem: 1002 964 38 0 21 410
-/+ buffers/cache: 532 470
Swap: 951 32 929

可以看到 Swap 只有951M,不符合 Oracle-xe-client 的安装要求。

2.创建一个 Swap 文件。
mkdir swap
cd swap
sudo dd if=/dev/zero of=swapfile bs=1024 count=100000

出现下列提示,上面命令中的 count 即代表swap文件大小。

记录了 100000+0 的读入
记录了 100000+0 的写出
102400000 字节 (102 MB) 已复制,0.74704 秒,137 MB/秒

把生成的文件转换成 Swap 文件
sudo mkswap swapfile

Setting up swapspace version 1, size = 102395 kB
no label, UUID=09fde987-5567-498a-a60b-477e302a988b

3.激活 Swap 文件。
sudo swapon swapfile

再次查看 free -m 的结果。

total used free shared buffers cached
Mem: 1002 967 34 0 22 410
-/+ buffers/cache: 534 467
Swap: 1053 32 1021

添加成功。

扩展:
如果需要卸载这个 swap 文件,可以进入建立的 swap 文件目录。执行下列命令。
sudo swapoff swapfilehttp://it.china-b.com/linux/xtgl/20090525/21754_1.html

如果需要一直保持这个 swap ,可以sudo -s换到root
然后把它写入 /etc/fstab 文件。

swapfilepath swap swap defaults 0 0

引用“http://wangkerui.com/%E8%BD%ACubuntu%E4%BF%AE%E6%94%B9%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%EF%BC%88%E5%8D%B3swap%E7%A9%BA%E9%97%B4%EF%BC%89/”

[ 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、付费专栏及课程。

余额充值