编译AOSP 6.0.0_r1时遭遇memory corruption错误求助
解决AOSP 6.0.0_r1编译时的malloc内存corruption错误(M1 Mac + Docker Ubuntu14环境)
问题场景
在M1 Mac上通过Docker运行Ubuntu14容器编译AOSP 6.0.0_r1时,反复触发malloc(): memory corruption错误,错误固定发生在dex2oatd进程生成boot.art阶段,多次清理编译缓存、重新执行编译流程均无法解决。
环境信息
- 宿主机:M1 Mac OS
- 容器:Ubuntu14(基于官方AOSP构建镜像)
- 容器内存:16G
- 交换空间:4G
- 容器构建命令:
docker build \ --tag=aosp-build:ubuntu14.04 \ --platform linux/amd64 \ --build-arg userid=1000 --build-arg groupid=1000 --build-arg username=tom \ --file=aosp.ubuntu14.dockerfile .
核心错误日志
*** Error in `/aosp-6.0.0_r1/out/host/linux-x86/bin/dex2oatd': malloc(): memory corruption: 0x000055555558d520 *** dex2oatd F 6560 6560 art/runtime/runtime_linux.cc:307] HandleUnexpectedSignal reentered make: *** [/aosp-6.0.0_r1/out/target/product/generic/dex_bootjars/system/framework/arm/boot.art] Error 1
可行解决方案
1. 调高dex2oat内存限制
AOSP 6.0默认给dex2oat分配的64M内存,在M1的x86_64模拟环境下不足以处理bootjar编译,编译前执行以下命令调整参数:
export ANDROID_JACK_VM_ARGS="-Xmx4g" export DEX2OAT_FLAGS="--runtime-arg -Xmx2g"
之后重新执行编译命令。
2. 调整Docker资源配置
M1 Mac的x86_64模拟环境对内存交换的兼容性较差,可尝试:
- 把Docker容器的可用内存调高到20G以上,交换空间调整为8G(在Docker Desktop的Resources > Memory中设置)
- 临时禁用容器交换空间(需确保内存足够支撑编译)
3. 修改art模块编译参数
针对老版本AOSP在模拟环境的兼容性问题,修改art/build/Android.common_build.mk中的编译优化参数:
DEX2OAT_HOST_DEBUG_FLAGS := -O0 -g DEX2OAT_TARGET_DEBUG_FLAGS := -O0 -g
修改完成后执行make clean,再重新编译。
4. 更换Ubuntu版本容器
Ubuntu14的glibc版本过旧,与M1的x86_64模拟环境兼容性不足,可尝试使用官方提供的Ubuntu16镜像构建容器,重新执行编译流程。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

