最近在基于Amlogic平台编译Android 9.0系统时,遇到了一个典型问题——system分区空间不足导致编译失败。这种情况在嵌入式系统开发中相当常见,特别是当我们需要集成更多系统应用或功能模块时。本文将详细记录我的解决过程,希望能帮助遇到类似问题的开发者。
问题的本质在于:Android编译系统会根据BoardConfig.mk中定义的分区大小来生成镜像文件。当实际系统内容超过预设分区大小时,就会抛出"system image too large"的错误。通过分析错误日志,我发现原始配置中32位系统的system分区只有1.25GB(1342177280字节),而实际编译需要约1.6GB空间。
在device/amlogic/p291/BoardConfig.mk文件中,我们需要调整两个关键参数:
makefile复制ifeq ($(ANDROID_BUILD_TYPE), 64)
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1551892480 # 保持64位系统1.45GB不变
BOARD_VENDORIMAGE_PARTITION_SIZE := 524288000 # vendor分区从320MB扩展到500MB
else
# 32位系统分区调整
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1879048192 # 从1.25GB增加到1.75GB
BOARD_VENDORIMAGE_PARTITION_SIZE := 943718400 # vendor分区从320MB扩展到900MB
endif
这里有几个技术细节需要注意:
提示:修改分区大小时,建议使用2的幂次方值(如1GB、2GB等),这能更好地匹配闪存特性。
在common/arch/arm/boot/dts/amlogic/partition_mbox_normal_P_32.dtsi文件中,我们需要确保分区表与BoardConfig.mk中的定义一致:
dts复制partitions: partitions{
parts = <17>;
part-0 = <&logo>;
...
part-13 = <&system>; // 对应BOARD_SYSTEMIMAGE_PARTITION_SIZE
part-14 = <&product>;
...
};
system:system{
pname = "system";
size = <0x0 0x70000000>; // 1.75GB的十六进制表示
mask = <1>;
};
设备树中的size字段需要与BoardConfig.mk中的数值对应。1.75GB=0x70000000字节(十六进制)。
备份原始文件:
bash复制cp device/amlogic/p291/BoardConfig.mk BoardConfig.mk.bak
cp common/arch/arm/boot/dts/amlogic/partition_mbox_normal_P_32.dtsi partition_mbox_normal_P_32.dtsi.bak
修改BoardConfig.mk:
使用vim或你喜欢的编辑器,按照前面给出的数值修改分区大小定义。
更新设备树文件:
确保system分区的size字段与BoardConfig.mk中的定义匹配。
清理并重新编译:
bash复制make clean
make -j8
编译完成后,检查生成的镜像文件大小:
bash复制ls -lh out/target/product/p291/system.img
应该显示大小接近1.75GB。同时检查刷机包中的分区表:
bash复制grep "system" out/target/product/p291/partition.txt
如果调整后仍然报错,可能是以下原因:
make clean后重新编译rm -rf out/target/product/p291/obj/PACKAGING如果设备使用的闪存芯片擦除块为1MB,那么分区大小应该是1MB的整数倍。可以通过以下命令检查:
bash复制cat /proc/mtd # 或查看芯片手册
当需要同时支持32位和64位系统时,务必确保两个配置块都正确更新。我曾经遇到过只修改了32位配置而忘记更新64位配置的情况,导致64位编译失败。
对于更复杂的项目,可以使用动态计算方式:
makefile复制BOARD_SYSTEMIMAGE_PARTITION_SIZE := $(shell echo $$(( 1879048192 )))
在编译完成后,检查实际使用量:
bash复制du -sh out/target/product/p291/system
这能帮助你更合理地设置分区大小。
如果分区限制严格无法扩大,可以考虑:
经过这些调整后,我的Android 9.0编译顺利通过了。这种分区调整在嵌入式开发中很常见,关键是要理解各分区的作用和相互关系。在实际项目中,建议预留20%以上的空间以备后续更新。