ext4格式sparse image chunk type
挺简单的问题,触及到了知识盲区,记录一下
问题描述:
system分区制卡失败,提示chunk_type error,system近期没有做更新;
问题分析:
-
查看工具侧,确认在升级ext4格式分区时会做chunk type的检测,当前工具中支持dont care & raw类型,而解析system.img对比该部分内容发现,该chunk type为fill类型,以前没有看到过这种类型;
-
google确认该类型:
sparse image 的格式参考 system/core/libsparse/sparse_format.h
#define CHUNK_TYPE_RAW 0xCAC1 #define CHUNK_TYPE_FILL 0xCAC2 #define CHUNK_TYPE_DONT_CARE 0xCAC3 #define CHUNK_TYPE_CRC32 0xCAC4
所以定义中是有fill这个类型的,确认上述几个类型所对应的不同内容:
- 对于 CHUNK_TYPE_RAW, 相关数据即为 chunk_size 个 block 的原始数据
- 对于 CHUNK_TYPE_DONT_CARE, 相关数据为空
- 对于 CHUNK_TYPE_FILL, 相关数据为 4 个字节的 fill data
fill 类型是将相同的数据缩成4个字节来处理;
-
确认fill类型是如何生成的
既然是官方定义的,那么为什么我之前从来没有见到过?
特地了解近期system.img的差异情况,了解到打包方式有所改变:
- 以前:使用make_ext4fs直接打包system分区
- 现在:使用makfs.ext4打包system分区,其实使用的就是img2simg这个工具
-
验证上述猜测是否正确:
-
确认img中chunk类型:
system/core/libsparse/simg_dump.py -v cache
-
使用make_ext4fs打包文件,并确认生成类型:
-
使用simg2img将上述文件还原,并重新使用img2simg生成sparse image,并查看
发现,确实使用img2simg生成的是有fill类型的
然而,我们以前使用的img2simg测试居然没有生成fill类型,这又是咋回事??
是否为版本问题
-
-
多版本验证:
android 4.2
android 6.0
linux
apt-get install android-tools-fsutils
other
-
上述make_ext4fs与img2simg差异:
确认是属于安卓打包工具img2simg自动生成的。若未压缩的img,存在全0部分。该部分自动生成chunk_type_fill类型。原打包流程使用make_ext4fs工具是打包和压缩一体化命令,由于该命令清楚具体文件目录结构,因此不需要针对全0数据进行压缩。而img2simg工具,仅是img压缩,只是基于img的二进制数据生成sparse file,没法根据文件的组织结构情况进行压缩。