.img 文件本质上是一个二进制文件,它逐字节地代表了一个分区或一个磁盘的内容。它的制作方法完全取决于您希望这个分区里 存放什么内容 。在嵌入式开发中, .img 文件通常可以分为以下三大类,每一类的制作方法都不同。


类别一:文件系统镜像 (如 system.img , vendor.img , userdata.img )

这类镜像是最复杂的,它内部包含了一个完整的、可以被操作系统挂载的文件系统(通常是 Linux 的 Ext4 格式),里面有成百上千个文件和目录。

  • 核心思想 :将一个包含所有所需文件和目录的文件夹,转换成一个 Ext4 文件系统的二进制镜像。

  • 制作源 :一个“暂存目录”(Staging Directory)。在编译过程中,系统会把所有属于这个分区的库、可执行文件、配置文件等都复制到这个目录下(例如 out/target/product/your_device/system/ )。

  • 制作工具

    1. mke2fs :这是一个标准的 Linux 工具,可以创建一个空的 Ext4 文件系统。
    2. simg2img / img2simg :用于在稀疏(Sparse)格式和原始(Raw)格式之间转换。稀疏格式可以跳过文件系统中的空白部分,从而大大减小镜像文件的体积。
    3. make_ext4fs :Android 系统中常用的一个专用工具,可以直接从一个目录创建 Ext4 格式的 .img 文件。
    4. 自定义脚本 (如 mkuserimg.sh ) :在复杂的编译系统中,通常会用一个脚本来封装上述工具的调用。
  • 制作流程(简化版)

    1. 计算大小 :根据暂存目录中所有文件的总大小,并加上一些预留空间,确定最终分区需要多大。
    2. 创建空镜像 :使用 dd mke2fs 创建一个指定大小、格式化为 Ext4 的空白镜像文件。
    3. 挂载镜像 :通过 mount 命令将这个空白镜像文件挂载到一个临时目录。
    4. 复制文件 :将“暂存目录”下的所有内容复制到这个挂载点。
    5. 设置权限 :对复制进去的文件和目录设置正确的用户、用户组和读写执行权限(这非常重要)。
    6. 卸载镜像 :通过 umount 命令卸载镜像。
    7. (可选) 转换为稀疏格式 :使用 img2simg 将原始镜像转换为稀疏格式,以减小体积。

在您的编译系统中,这一过程通常是自动化的。您只需要在 BoardConfig.mk 等文件中定义好分区大小 ( BOARD_SYSTEMIMAGE_PARTITION_SIZE ) 和文件列表,编译系统就会自动调用上述工具链来生成 system.img


类别二:原始数据镜像

这类镜像通常 不包含标准的文件系统 。它们更像是一个结构化的“数据块”,用于存储特定的配置信息、序列号、校准数据等。它们的格式是私有的,由读取它的程序来定义。这正是您之前一直在打包的类型。