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
0 条评论