这个错误信息:
Not enough free space to expand partition: system_b
Cannot resize partition system_b to size 2741215232. Not enough space?
表明在进行 Android OTA 升级时,update_engine 尝试扩展 system_b 分区的大小到 2,741,215,232 字节(约 2.6GB),但由于磁盘空间不足而失败。
🔍 原因分析
Android 使用 A/B 分区机制进行无缝 OTA 升级。OTA 更新会将新系统写入未使用的那个系统分区(例如当前运行在 system_a,则更新 system_b),然后重启切换过去。
当提示 Not enough free space 时,通常是以下原因之一:
1. 动态分区空间不足
- Android 从 P 版本开始使用 Dynamic Partitions。
- 所有系统镜像(如
system、vendor、product)被打包进一个超级分区(super partition)中。 - 如果 super 分区没有足够空间容纳新的
system_b镜像,则无法扩容。
2. OTA 包太大或分区配置不合理
- 新版本的 system 分区变大了,但 super 分区预留的空间不够。
- 或者 OTA 更新包没有适配当前设备的 super 分区容量。
3. 设备存储空间碎片化或占用过高
- 如果其他分区(如 data、cache)占用了太多空间,可能导致 super 分区无法动态调整。
✅ 解决方案
方案一:增大 super 分区容量(推荐)
在设备的 device tree 或 bootloader 中修改 super 分区的大小,确保其能容纳升级后的所有子分区(system、vendor 等)。
示例(在 flash_super_image.sh 或 board_config.mk 中设置):
BOARD_SUPER_PARTITION_SIZE := 4294967296 # 设置为 4GB
注意:确保你的 eMMC/UFS 总容量足够支撑这个值。
方案二:优化 OTA 包体积
- 使用
--payload-branding和压缩算法减小 payload 大小。 - 检查是否引入了不必要的模块或资源。
- 在构建 OTA 时启用差分更新(delta update)来减少 payload 体积。
# 构建差分包示例
ota_from_target_files -i PREVIOUS-target_files.zip CURRENT-target_files.zip output_ota.zip
方案三:清理缓存分区 / 格式化 data 分区(临时应急)
如果是因为用户设备上 data 分区占用过多导致无法扩容,可以尝试:
- 在 recovery 中格式化
/data和/cache(⚠️ 会丢失用户数据)。 - 强制 OTA 清除本地数据(适用于刷机场景)。
方案四:强制擦除分区(慎用)
可以在 OTA 脚本中添加擦除命令(在 update-script 中):
ui_print("Erasing cache...");
erase_cache();
或者手动执行:
fastboot erase cache
fastboot erase userdata
🛠️ 排查建议
-
查看当前 super 分区大小:
fastboot getvar super_partition_size -
查看当前设备分区布局:
fastboot oem device-info fastboot gpt dump -
查看 OTA 包中的分区需求:
unzip -p your_ota_package.zip payload.bin | payload-dumper-go
✅ 总结
| 问题 | 原因 | 建议解决方式 |
|---|---|---|
Not enough free space to expand partition: system_b |
super 分区太小 / OTA 包太大 / 存储碎片 | 增大 super 分区大小 / 优化 OTA 包 / 擦除 cache/data |