Ubuntu 18.04下编译AOSP遇Input/output error问题求解决
解决Ubuntu 18.04编译AOSP时的ld I/O错误
这种Input/output error在AOSP编译场景里,大多和磁盘性能、文件系统损坏、权限冲突或者编译中间文件异常有关。你已经试过换虚拟机和调整ccache,那咱们从其他核心方向入手排查:
1. 先排查磁盘基础问题
- 检查剩余空间:AOSP编译过程会生成大量临时文件,至少需要100G以上剩余空间,建议留150G+。执行命令查看:
df -h - 检查文件系统完整性:磁盘文件系统出错会导致读写失败,先卸载目标分区(或者进入单用户模式),执行文件系统修复:
sudo fsck -f /dev/你的磁盘分区名 - 排查磁盘IO性能:如果用的是机械硬盘,编译时高IO负载很容易触发这类错误,优先换成SSD;虚拟机的话,确保磁盘设置为“高性能”模式(比如关闭快照、启用磁盘缓存)。
2. 彻底清理编译产物后重新构建
中间文件损坏是常见诱因,彻底清理后重新编译试试:
# 清理make缓存和out目录 make clean rm -rf out/ # 清理ccache(如果之前调整过,干脆重置) rm -rf .ccache/ # 重新初始化编译环境 source build/envsetup.sh # 选择你的目标编译版本,比如aosp_x86_64-eng lunch aosp_x86_64-eng # 降低并行度,避免IO过载,比如用CPU核心数的1.5倍,或者直接-j4 make -j$(nproc)
3. 检查文件权限与SELinux
- 修复源码目录权限:确保AOSP源码和out目录的所有者是当前普通用户,不要用root编译:
sudo chown -R $USER:$USER /path/to/your/aosp/source - 临时关闭SELinux:Ubuntu 18.04默认SELinux是enforcing模式,可能干扰文件读写,临时关闭试试:
如果关闭后编译成功,你可以选择永久关闭SELinux(开发环境完全没问题),或者调整SELinux策略。sudo setenforce 0
4. 更换链接器或调整编译参数
错误里用的是GCC的ld链接器,试试改用LLVM的lld,它对大文件的处理更稳定:
# 在lunch之后执行,强制使用lld链接器 export USE_LD=lld # 然后重新编译 make -j$(nproc)
如果还是不行,进一步降低并行度,比如用-j2,减少同时读写的文件数量,降低磁盘压力。
5. 排查磁盘硬件/虚拟机磁盘镜像问题
- 物理机的话,检查磁盘是否有坏道:
sudo smartctl -a /dev/sda # 替换成你的磁盘设备名 - 虚拟机的话,尝试重新创建磁盘镜像(不要用快照),重新同步AOSP源码后再编译,避免镜像文件损坏导致的I/O错误。
内容的提问来源于stack exchange,提问作者XuSing
相关产品推荐
相关产品推荐

