使用docker 多次编译安卓生成docker 镜像,慢慢的居然磁盘不够用了,在其中一次编译过程中提示如下错误:
Failed to write file /src/out/build_error: write /src/out/build_error.tmp: no space left on device
Failed to write file /src/out/build_progress.pb: write /src/out/build_progress.pb.tmp: no space left on device
ninja failed with: exit status 1
Error closing trace writer: write /src/out/build.trace.gz: no space left on device
安卓的编译还是比较费磁盘空间的,上面就是直接把磁盘占满了,影响后续其他操作
可以看到上面基本是吧磁盘用光了
释放磁盘或增大磁盘空间
单纯从磁盘空间角度来看,这时候有1财大气粗的方式,扩容磁盘 2精打细算的方式,清空缓存
1扩容磁盘
如果你是使用linux虚拟机编译安卓源码,可以参照下文连接进行磁盘扩容
磁盘扩容https://blog.csdn.net/qq_37059136/article/details/140498324 直接将根目录扩容
2.清空缓存
(该方法会删除编译生成文件,再次编译虚重头编译极其费时,只在磁盘占满的时候应急操作)
在安卓源码根目录,就是能看到out子目录的目录
执行如下命令删除缓存
OUT_DIR=out
rm -rf ${OUT_DIR}/target/common/obj
rm -rf ${OUT_DIR}/soong/.bootstrap
rm -rf ${OUT_DIR}/soong/.intermediates
rm -rf ${OUT_DIR}/target/product/generic/obj
rm -rf ${OUT_DIR}/build-*
rm -rf ${OUT_DIR}/dist
rm -rf ${OUT_DIR}/staging
可以看到能释放80G左右的缓存,当然这跟你的编译次数有关
或着干脆将out目录删了,上述清理缓存的方式跟将out目录删了的方式都需要重新全部编译,还是挺费时间的,当然了先把他们删了释放电磁盘空间便于我们后面调整
ps: 可以在编译前执行一次make clean清除下缓存
比较建议的方法是增加磁盘空间,同事在编译之前执行make clean ;不建议直接删除out目录,因为下次编译会全量编译,极其耗时,但是如果磁盘爆满影响虚拟机运行,可以先删了
查找占用磁盘的元凶
当然了,上面的两个方法只能处理磁盘占满的问题,却没有处理磁盘为何不够的问题
切换root权限进入 / 目录
看到var目录很大,进入var目录再看
进入lib目录再看
好家伙原来是docker缓存占用了磁盘空间
进入docker再看
元凶找到了,居然是/var/lib/docker/overlay2 占用了大量磁盘
docker的overlay2中存的都是什么?
存的是我们的镜像文件和容器内的文件
直接执行 如下命令给他删了
#清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
docker system prune
删完再看一下
总结:docker的问题
因为使用docker编译打包安卓镜像,docker将每次的镜像都缓存起来了,导致占用磁盘越来越大
上面的命令会删除所有docker缓存,包括安卓的编译容器,所以基本上需要重新加载容器
先docker images 看下当前容器,然后docker rmi +ID 全部删了
再 docker load ; docker run 重新进入docker编译
docker ps -a #查看当前运行的镜像
docker rm 镜像name #删除镜像列表信息
docker images #查看当前载入的docker镜像
docker rmi 镜像id #移除已加载镜像
重新load docker容器
#从镜像加载启动docker
sudo docker load -i /home/XXX/XXX/aospbuilder.tar
sudo docker run -it --privileged --hostname aospbuilder --name aospbuilder -v /home/lijilei/aosp:/src aospbuilder:v1
#进入容器执行编译命令
cd /src
. build/envsetup.sh
lunch redroid_arm64-userdebug
m
#后续进入容器使用以下命令:
docker attach aospbuilder
#如果容器没有运行执行:
docker start aospbuilder
基本上就是这么个解决思路