日常开发编译偶现 super.img’ 调用 stat 失败: 没有那个文件或目录 问题,一直没有细究

今天研究记录一下问题和解决方案,具体错误如下:

cp: 对 '/mnt/xxx/xxx/out/target/product/你的产品名字/super.img' 调用 stat 失败: 没有那个文件或目录
pack docke android images: user...
Cannot open input file super.img
lpunpack E 10-09 15:07:49 1121847 1121847 reader.cpp:125] [liblp] bool android::fs_mgr::ReadPrimaryGeometry(int, LpMetadataGeometry *) read 4096 bytes failed: Invalid argument
lpunpack E 10-09 15:07:49 1121847 1121847 reader.cpp:138] [liblp] bool android::fs_mgr::ReadBackupGeometry(int, LpMetadataGeometry *) backup read 4096 bytes failed: Invalid argument
Could not read metadata from the super image file 'super.img.ext4'.
super_img/
问题现象 可能原因
拷贝super.img失败:没有那个文件或目录 1. 编译未成功生成 super.img
2. 文件生成路径与脚本预期路径不符
3. 编译环境配置有误
lpunpack解包super.img.ext4失败:read 4096 bytes failed 1. 尝试解包的不是raw格式的super镜像
2. 原始super.img文件不完整或已损坏

先执行命令,检查文件是否存在

ls -l /mnt/xxx/xxx/out/target/product/你的产品名字/super.img

如果文件存在,且大小不为0,则说明编译成功生成了super.img。检查你的打包脚本中设置的源路径和目标路径是否准确。

如果文件不存在,说明编译过程可能没有成功生成super.img。

我这里是文件不存在,所以执行以下命令生成 super.img

make superimage

make 完成后在终端执行以下命令 监控输出目录的变化 看看是否生成super.img

ls -la /mnt/xxx/xxx/out/target/product/你的产品名字/ | grep -E "(super|img)"

检查生成结果

# 检查 super.img 是否生成
ls -lh /mnt/xxx/xxx/out/target/product/你的产品名字/super.img

# 检查文件类型
file /mnt/xxx/xxx/out/target/product/你的产品名字/super.img

验证镜像完整性

# 检查文件大小(不应该为0)
ls -l /mnt/xxx/xxx/out/target/product/你的产品名字/super.img

# 尝试识别镜像格式
head -c 100 /mnt/xxx/xxx/out/target/product/你的产品名字/super.img | hexdump -C | head -5

上述步骤ok,重新编译也成功没有报错!

如果你的问题不一样,建议按照一下思路尝试看看

清理构建:尝试执行make clean或rm -rf out/,然后重新编译,从干净的状态开始编译。

检查编译日志:重新编译时,关注一下终端输出是否有任何Error或Warning,特别是在编译过程的最后阶段,大部分情况下提供问题的线索。

检查设备配置:确认设备配置文件(通常是device/…/xxx/目录下的mk文件)正确,特别是与动态分区(Dynamic Partitions)相关的配置,因为super.img与动态分区密切相关。

解决思路:
在这里插入图片描述

Logo

电影级数字人,免显卡端渲染SDK,十行代码即可调用,工业级demo免费开源下载!

更多推荐