AOSP编译失败:调整多线程编译参数后问题仍未解决
解决AOSP编译内存相关报错的实操方案
1. 扩容swap分区应对瞬时内存峰值
32GB物理内存仍出现内存类报错,大概率是编译过程中部分模块的瞬时内存峰值超过物理内存上限,仅调整编译线程数无法覆盖这种场景:
- 查看当前swap状态:
free -h - 临时新增16GB swap(重启后失效):
sudo fallocate -l 16G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile - 永久生效:将
/swapfile none swap sw 0 0追加到/etc/fstab文件中
2. 限制clang编译内存占用
AOSP默认使用的clang编译器在处理部分大模块时会无节制占用内存,可通过环境变量强制限制:
编译前执行以下命令:
export LLVM_USE_NEW_PASS_MANAGER=0 export CLANG_FORCE_MEMORY_LIMIT=8192
CLANG_FORCE_MEMORY_LIMIT单位为MB,可根据实际情况调整(比如设为10240即10GB)
3. 清理编译缓存后重新编译
缓存损坏可能导致异常内存占用,彻底清理后重新构建:
make clean rm -rf out/ source build/envsetup.sh lunch <你的编译目标> m -j$(nproc --ignore=2)
nproc --ignore=2会预留2核给系统进程,避免资源被编译完全耗尽
4. 解除系统内存限制
部分Linux发行版默认会限制进程的栈大小和虚拟内存,需解除限制:
- 查看当前限制:
ulimit -a - 临时解除:
ulimit -s unlimited ulimit -v unlimited - 永久生效:将上述两行命令追加到
~/.bashrc或~/.zshrc中
5. 单独排查异常模块
如果报错集中在特定模块,可单独编译该模块定位问题:
- 找到报错模块路径后,执行:
mm -j4(用低线程数单独编译) - 若仍报错,可尝试替换clang版本或检查该模块的Android.mk/Android.bp配置是否有特殊内存需求
内容的提问来源于stack exchange,提问作者franks
相关产品推荐
相关产品推荐

