https://blog.csdn.net/z755924843/article/details/132190581

https://www.cnblogs.com/sjjg/p/6071847.html
https://betheme.net/news/txtlist_i148637v.html?action=onClick (对分区及分区下的文件作了详细的介绍)

传统分区镜像文件

  • ramdisk.img :
    android启动时 首先加载ramdisk.img镜像,并挂载到/目录下,并进行了一系列的初始化动作,包括创建各种需要的目录,初始化console,开启服务等。

解压:

如何解压ramdisk.img:https://blog.csdn.net/nullzxy/article/details/9995203
ramdisk.img是一个gzip格式的文件,我们只需要进行标准的解压缩操作。
gunzip -c your-ramdisk-file | cpio -i

压缩:

使用压缩格式
mkbootfs -f ../config.txt . | minigzip > ../ramdisk.img
不使用压缩格式
mkbootfs -f ../config.txt . > ../ramdisk.cpio

如果是压缩目录,不带-f参数。

  • system.img :
    System.img是在init.rc中指定一些脚本命令,通过init.c进行解析并挂载到根目录下的/system目录下的。

修改system.img并重新打包:https://blog.csdn.net/u012851408/article/details/88720278
https://blog.csdn.net/tabactivity/article/details/125993855

如果挂载失败,请尝试使用只读方式挂载:mount -o ro system_raw.img /system_mount_test/

  • userdata.img :
    用户数据

Android10动态分区镜像文件

https://blog.51cto.com/u_15243273/5284126
https://source.android.google.cn/docs/core/architecture/bootloader/system-as-root?hl=zh-cn
https://blog.csdn.net/qq_45698138/article/details/135079440
http://www.licqi.com/artikel/15578.html
https://blog.csdn.net/vviccc/article/details/120264902

一、解包工具

https://blog.csdn.net/In_engineer/article/details/126507288 (镜像文件解包)

1.1 simg2img

简述:
将sparse格式的image文件转化为raw格式的image文件。
编译android源码默认会生成。

路径:
out/host/linux-x86/bin/simg2img

1.2 lpunpack

简述:
这个工具可以将system.img,product.img,vendor.img等文件从super.img解析出来。

源码目录:system/core/mkbootimg

路径:
out/host/linux-x86/bin/lpunpack

编译指令:

source build/envsetup.sh
lunch
make lpunpack

1.3 unpack_bootimg

简述:
专门用于解析boot.img的工具。

路径:

out/host/linux-x86/bin/unpack_bootimg
system/core/mkbootimg/unpack_bootimg.py

编译指令:

source build/envsetup.sh
lunch
make unpack_bootimg

1.4 mkdtimg

简述:
将dtbo.img文件转化为dtb文件,一个dtbo.img会包含多个dtb文件;
编译android源码默认会生成。

路径:
out/host/linux-x86/bin/mkdtimg

1.5 dtc

简述:
将dtb文件转化为可阅读的dts文件;
编译android源码默认会生成。

路径:
out/host/linux-x86/bin/dtc

二、镜像文件

system.img

boot.img

镜像基本构成为:头部, 内核, ramdisk镜像

  • boot.img拆包
    unpack_bootimg --boot_img boot.img --out boot

dtbo.img

设备树增量编译(Device Tree Overlay)的镜像文件。它包含了设备树的增量信息,用于在运行时修改设备树,以支持动态硬件配置。

  • 拆包

(1) 先从dtbo.img解析出dtb文件

#创建dtbo目录,然后使用mkdtimg工具解析dtbo.img,-b后边是输出路径(dtb是自定义的文件名前缀)
sun@sun-pc:~/android/imgs$ mkdir dtbo && ../out/host/linux-x86/bin/mkdtimg dump dtbo.img -b dtbo/dtb
sun@sun-pc:~/android/imgs$ ls dtbo
dtb.0  dtb.1  dtb.10  dtb.11  dtb.12  dtb.13  dtb.14  dtb.15  dtb.16  dtb.17  ...  dtb.6  dtb.7  dtb.8  dtb.9

#查看一下文件信息,的确是dtb(Device Tree Blob)文件
sun@sun-pc:~/android/imgs$ file dtbo/dtb.0
dtbo/dtb.0: Device Tree Blob version 17, size=110367, boot CPU=0, string block size=7979, DT structure block size=102332

(2) 再将上一步的dtb文件转化为可以阅读的dts文件

#将dtb.0转化为0.dts
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/dtc dtbo/dtb.0 dtbo/0.dts

#如果觉得一个个文件转化比较麻烦,可以使用下面的命令
find ./dtbo -name 'dtb.*' | xargs -n1 sh -c '../out/host/linux-x86/bin/dtc $1 -o $1.dts && rename "s/dtb\.//" $1.dts' sh

recovery.img

用于Android系统恢复模式(Recovery Mode)的镜像文件。在恢复模式下,可以使用recovery.img中的功能来执行系统恢复、刷入OTA更新等操作。

  • 拆包
    与boot.img一样,都是Android bootimg格式,解包方式一样:unpack_bootimg --boot_img recovery.img --out recovery

vbmeta.img

与验证启动(Verified Boot)相关的镜像文件。

super.img

https://www.lsjlt.com/news/371844.html
Android10开始使用动态分区,system、vendor、 odm等都包含在super.img里面,可以按如下方式对super.img进行解包和组包。

  • super.img解包

super的解包需要工具lpunpack,但是默认没有编译,源码目录位于:system/extras/partition_tools/ ,需要手动编译生成;
在android根目录下执行

make lpunpack
编译后生成 out/host/linux-86/bin/lpunpack

开始解包:
第一步,格式转换,转化为ext4

simg2img super.img super_ext4.img
第二步,创建目录super_ext4/ 存放解包后的文件

mkdir super_ext4
第三步,解包super_ext4.img

out/host/linux-86/bin/lpunpack super_ext4.img super_ext4/
解包后在super_ext4/存放着是哪个完整的system.img vendor.img product.img 是ext4格式的,也可以通过mount挂载为文件目录

  • 打包super.img

打包需要的工具lpmake,工具在out/host/linux-86/bin/lpmake
第一步,确认各个img的大小
上面解包出来super_ext4目录下的img文件,需要重新打包成super.img,在super_ext4/目录下执行

@sys2_206:~/5_Android11_sdk_78/rockdev/Image-rk3568_r/super_ext4$ stat -c '%n %s' *odm.img 626688product.img 213348352system_ext.img 123666432system.img 980586496vendor.img 315723776

第二步,开始打包super.img
按如下命令打包

out/host/linux-86/bin/lpmake \--metadata-size 65536 --super-name super \--metadata-slots 2 \--device super:3263168512 \--group rockchip_dynamic_partitions:3258974208 \--partition system:readonly:980586496:rockchip_dynamic_partitions --image system=out/target/product/rk3568_r/system.img \--partition system_ext:readonly:123666432:rockchip_dynamic_partitions --image system_ext=out/target/product/rk3568_r/system_ext.img \--partition vendor:readonly:315723776:rockchip_dynamic_partitions --image vendor=out/target/product/rk3568_r/vendor.img \--partition product:readonly:213348352:rockchip_dynamic_partitions --image product=out/target/product/rk3568_r/product.img \--partition odm:readonly:626688:rockchip_dynamic_partitions --image odm=out/target/product/rk3568_r/odm.img \--sparse \--output out/target/product/rk3568_r/super.img

这个命令可以在编译android的时候通过编译log获取,log保存在out/verbose.log.gz中,可以通过如下命令显示所有log,然后在里面找lpmake

gzip -cd out/verbose.log.gz|less

metadata.img

即各个.img文件的参数信息

metadata 分区包含了关于分区布局和文件系统的元数据信息。它记录了分区的大小、文件系统类型、位置等。这些信息对于系统的分区管理和文件系统的正确识别很重要。

  • 解包

(1) 将sparse格式的metadata.img转化为raw格式的metadata_raw.img

sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/simg2img metadata.img metadata_raw.img
(2) 将metadata_raw.img挂载到一个目录上,此时访问这个目录就可以访问镜像文件的内容了

#首先创建目录metadata,然后将metadata_raw.img挂载到此目录
sun@sun-pc:~/android/imgs$ mkdir metadata && sudo mount -o ro metadata_raw.img metadata

#可以看到metadata目录已经有内容了
sun@sun-pc:~/android/imgs$ ls
lost+found

persist.img

persist分区主要用于存储持久化的系统设置和配置数据。它是 Android 系统中的一个特殊分区,用于保存设备设置、用户首选项和应用程序配置等信息,以便在设备重新启动后保持持久性。

  • 拆包

这个镜像是linux ext4格式的,直接挂载即可

sun@sun-pc:~/android/imgs$ mkdir persist
sun@sun-pc:~/android/imgs$ sudo mount -o ro persist.img persist

sun@sun-pc:~/android/imgs$ ls persist
lost+found  sensors
分类: img文件

0 条评论

发表回复

您的电子邮箱地址不会被公开。