我们知道这个安卓的镜像分区有很多个。
那么这个文章要介绍什么呢?
三个点:
一是现在的android支持动态分区,很多的东西都被放到super分区里面了,这个应该是可以配置的。然后super里面有比如system、vendor这种比较大的分区。那么就有对应的vbmeta_system、vbmeta_vendor分区去验证。
现在只有两个知识点了
1、怎么看AVB镜像的签名是否成功
看vbmeta和对应的分区。
然后对比两个的digest和salt值。
怎么看?
(注意使用你的路径)
./android/external/avb/avbtool.py info_image --image android/out/target/product/xxx/vbmeta.img
2、super镜像
这个镜像是谷歌 新推出的。
super分区也叫做dynamic动态分区,动态分区是Android的用户空间分区系统,在Android R版本开始引入,目的是为了解决system和vender等分区size不能动态调整的问题。例如物理分区表配置固定size后,如果软件版本对system,verdor分区size需要频繁调整时,需要修改物理分区表和重新编译gpt表,使用起来不是很便利。
引入super动态分区之后,将system,vendor等分区一起“打包”在super分区中,物理分区表只有super,不再单独配置system,vendor等分区的配置,其中的子分区可以动态的调整大小。编译的时候,会将system,vendor等分区的信息以metadata形式记录下来,生成super.img时会根据matadata信息进行处理
另外super分区中的子分区,也可以通过fastbootd以fastboot的方式刷入,或者使用lpunpack解压开。
super分区工作原理
动态分区时使用Linux内核中的dm-linear device-mapper模块实现的,Linear是指将device,mapper设备的线性范围映射到另一个设备的线性范围 属于LVM逻辑卷管理。 **Super分区包含列出了每个子分区的名称和块范围的metadata元数据.** 在开机init的first stage第一阶段运行期间,会解析并验证metadata元数据并创建虚拟block设备来表示每个子分区,创建logical逻辑分区出来。在init启动的第一阶段会去加载和处理,采用和以前类似的AVB校验流程,验证通过后,super包含的几个分区全部采用hashtree类型做dm-verity验证。在运行过程中对访问的block数据进行dm-verity安全校验。校验通过过,分别挂载这几个逻辑子分区。(校验通过才挂载)
3、怎么查看super镜像
当你直接使用avbtool去查看super镜像的时候,它会打印说这个不是个vbmeta镜像。
这是因为super确实不是,哈哈,他是多个的组合。怎么查看呢?先解压就可以看到super包含了哪些镜像,然后生成几个镜像,分别查看。
下面开始看这个super怎么解压:
需要两个东西: simg2img 和 lpunpack
- 安装:
安装simg2img
sudo apt-get install super.img
- 安装lpunpack
lpunpack 需要自己下载源码进行编译。lpunpack 生成后是通用的,所以下载别人编译好的 lpunpack 也是可以的,但 是需要添加依赖的相关 so 库。注意工具和 so 库是配套的,请一起使用。不要自己混搭工具和 so 库。下载好的 so 库文件放入 usr/lib/ 目录下即可也可以编辑 .bashrc 文件将 so 库所在目录路径加入到 LD_LIBRARY_PATH 中,命令如下 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库所在目录路径
- 或者你下载源码的话就需要:
source build/envsetup.sh make lpunpack
- 生成文件所在目录:out/host/linux-x86/bin
- 使用:
1、 super.img 从 Android sparse image 转换为 raw image(因为super是稀疏格式)
simg2img super.img super.img_ext4
- 2、从 raw image 解包出分区镜像文件
./lpunpack -p system super.img_ext4 system (这里 sytem 是目标目录,可以自己创建)
然后你就可以进入这个system的文件夹下看看生成了什么镜像,然后使用前面的avbtool看一下这个内容,验证一下。
然后你会怀疑这个解压的对不对啊?
于是你可以使用 lpdump 查看镜像的一些信息,信息里就包括了分区名称
./lpdump super.img_raw(这里是用 simg2img 转换后的文件)
应该还是有点用撒哈哈哈 周末愉快