15. 系统镜像解包与打包

针对【XNIUPI-小牛派】R系列开发板,我们提供了完整系统镜像xxx_update.img,完整的系统镜像是按照一定的规则将系统所需的各个分区打包在一起形成一个统一的完整镜像。

# 统一完整镜像一般由以下分区组成
rockdev                  # 固件打包工作目录,存放镜像构建所需的关键组件
├─ MiniLoaderAll.bin     # 底层加载器,负责初始化硬件并引导U-Boot
├─ Parameter.txt         # 分区参数配置文件,定义存储设备分区表信息
├─ uboot.img             # U-Boot引导程序镜像,负责系统启动流程控制
├─ misc.img              # 杂项功能镜像,通常用于恢复模式和系统切换
├─ boot.img              # 内核启动镜像,包含Linux内核和设备树
├─ recovery.img          # 恢复模式镜像,用于系统修复和升级
├─ rootfs.img            # 根文件系统镜像,包含系统运行所需的基本文件和工具
├─ oem.img               # 厂商定制化分区镜像,存放设备特定配置
└─ userdata.img          # 用户数据分区镜像,存储用户应用和数据

在实际开发中,有时候我们希望能够方便的将完整镜像拆分成各个独立分区文件,然后对分区文件进行单独修改以后,又重新打包成统一的完整镜像。以下就简要介绍下如何进行操作。

15.1 Linux下解包和打包

15.1.1 下载工具

下载rkpack点击下载,并复制到Linux PC中,解压得到rkpack文件夹:

rkpack
├─ unpack.sh
├─ mkupdate.sh
├─ afptool
├─ rkImageMaker

15.1.2 解包

第一步:将统一完整镜像拷贝到rkpack目录下,并重新命令为update.img

第二步:执行./unpack.sh

xniupi-work-dir/rkpack$ ./unpack.sh 
start to unpack update.img...
********rkImageMaker ver 2.0********
Unpacking image, please wait...
Exporting boot.bin
Exporting firmware.img
Unpacking image success.
Android Firmware Package Tool v2.0
Check file... OK
------- UNPACK ------
package-file    offset=0x800    size=0x25D
Image/MiniLoaderAll.bin offset=0x1000   size=0x6D9C0
Image/parameter.txt     offset=0x6F000  size=0x1F7
Image/uboot.img offset=0x6F800  size=0x400000
Image/misc.img  offset=0x46F800 size=0xC000
Image/boot.img  offset=0x47B800 size=0x25BAA00
Image/recovery.img      offset=0x2A36800        size=0x2FE4A00
Image/rootfs.img        offset=0x5A1B800        size=0x1095B7000
Unpack firmware OK!
------ OK ------
Unpacking update.img OK.
Press any key to quit: #点击回车退出

解压成功后,生成文件位于output目录下:

xniupi-work-dir/rkpack$ tree
.
├── afptool
├── mkupdate.sh
├── output
│   ├── Image
│      ├── boot.img
│      ├── MiniLoaderAll.bin
│      ├── misc.img
│      ├── parameter.txt
│      ├── recovery.img
│      ├── rootfs.img
│      └── uboot.img
│   └── package-file
├── rkImageMaker
├── unpack.sh
└── update.img

15.1.3 打包

我们现在配置了一个rootfs,并且备份了,需要替换自己制作的rootfs重新打包,那么可以参考如下步骤执行:

第一步rootfs.img替换到xniupi-work-dir/rkpack/output/Image目录(务必重命名成rootfs.img再替换进去)

第二步:将mkupdate.sh拷贝到xniupi-work-dir/rkpack/output目录

第三步:进入output目录重新打包执行./mkupdate.sh

xniupi-work-dir/rkpack/$ cd output
xniupi-work-dir/rkpack/output/$ ./mkupdate.sh
start to make update.img...
Android Firmware Package Tool v2.0
------ PACKAGE ------
Add file: ./package-file
package-file,Add file: ./package-file done,offset=0x800,size=0x28b,userspace=0x1
Add file: ./Image/MiniLoaderAll.bin
bootloader,Add file: ./Image/MiniLoaderAll.bin done,offset=0x1000,size=0x6d9c0,userspace=0xdc
Add file: ./Image/parameter.txt
parameter,Add file: ./Image/parameter.txt done,offset=0x6f000,size=0x203,userspace=0x1
Add file: ./Image/uboot.img
uboot,Add file: ./Image/uboot.img done,offset=0x6f800,size=0x400000,userspace=0x800
Add file: ./Image/misc.img
misc,Add file: ./Image/misc.img done,offset=0x46f800,size=0xc000,userspace=0x18
Add file: ./Image/boot.img
boot,Add file: ./Image/boot.img done,offset=0x47b800,size=0x25b9a00,userspace=0x4b74
Add file: ./Image/recovery.img
recovery,Add file: ./Image/recovery.img done,offset=0x2a35800,size=0x2fe3200,userspace=0x5fc7
Add file: ./Image/rootfs.img
rootfs,Add file: ./Image/rootfs.img done,offset=0x5a19000,size=0x3809b6000,userspace=0x70136c
Add file: ./Image/oem.img
oem,Add file: ./Image/oem.img done,offset=0x3863cf000,size=0x10a8000,userspace=0x2150
Add file: ./Image/userdata.img
userdata,Add file: ./Image/userdata.img done,offset=0x387477000,size=0x446000,userspace=0x88c
Add CRC...
Make firmware OK!
------ OK ------
********rkImageMaker ver 2.0********
Generating new image, please wait...
Writing head info...
Writing boot file...
Writing firmware...
Generating MD5 data...
MD5 data generated successfully!
New image generated successfully!
Making ./Image/update.img OK.

xniupi-work-dir/rkpack/output/update.img即为更新rootfs后的完整固件!

15.2 Windows下解包

15.2.1 解包

15.2.1.1 准备工作

  1. 瑞芯微开发工具 RKDevTool

  2. 待解包系统镜像 xxx_update.img

15.2.1.2 解包说明

打开瑞芯微开发工具RKDevTool,进入高级功能选项页,选择要解包的镜像,点击解包按钮,等待解包完成。

unpack

解包完成以后文件保存在RKDevTool的Output目录中:

Output  
├─ boot.bin(打包时的loader,即MiniLoaderAll.bin)  
├─ firmware.img(打包时afptool生成的固件,即除了MiniLoader.bin以外的分区集合)  
└─ Android(firmware.img具体展开内容)
   ├─ package-file(分区与分区镜像名的对应关系)
   ├─ parameter.txt(分区表)
   ├─ MiniLoaderAll.bin(loader文件,与上一级boot.bin一致)  
   └─ Image(firmware.img展开后的分区镜像内容)  
      ├─ boot.img
      ├─ misc.img  
      ├─ oem.img
      └─ recovery.img
      ├─ rootfs.img  
      ├─ uboot.img
      └─ userdata.img   

15.2.2 打包

略,推荐在Linux下进行统一镜像打包!