注册 X
提交 注:点击提交后系统会发送邮件到邮箱验证!(仅支持中国大陆邮箱)
我已阅读并同意 服务条款
首页 > IT技术笔记 > 查看笔记

Android super.img结构及解包和重新组包

Android super.img结构及解包和重新组包

从Android10版本开始,Android系统使用动态分区,system、vendor、 odm等都包含在super.img里面,编译后的最终镜像不再有这些单独的 image,取而代之的是一个总的 super.img.

1. 基础知识

1.1 为什么用 super 分区代替独立的分区?

传统的分区方式将 system、vendor、product、分区各自独立,在实际的项目开发中,通常每个分区都会留有部分空间,三个(可能没有 product) 分区累计就需要预留不少的空间,并且各个分区的大小被固定,不能灵活调整,比如 system 分区容量不够了,但是 vendor 分区又有多余的空间。

统一合并成一个分区后,使用 super 动态调整分区功能可以灵活调整内部分区大小,从而能更好的利用存储空间。

1.2 支持的动态分区包括

system

Vendor

Product

System Ext

* ODM

对于 A/B 设备,super 分区的大小需要包括两个槽位的大小,super 分区会在内部处理 A/B 槽位,因此 A/B 设备不需要单独的 super_a 和 super_b 分区。

可以通过lpdump命令dump出super.img的结构:

        
        
      

lpdump 只能解析非 sparse 格式的 image,而系统编译的 super.img 是 sparse 格式,需要使用 simg2img将 Android 编译生成的 sparse 格式的 super.img 转换成 raw 格式。

        
        
      

安装simg2img工具

https://github.com/anestisb/android-simg2img

        
        
      

2. super.img解包和组包

可以按如下方式对super.img进行解包和组包。

2.1 super.img解包

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

在android根目录下执行

        
        
      

编译后生成物位置:

        
        
      

开始解包:

第一步,格式转换,转化为ext4

        
        
      

第二步,创建目录super\_ext4/ 存放解包后的文件

        
        
      

第三步,解包super\_ext4.img

        
        
      

解包后在super\_ext4/存放着是哪个完整的system.img vendor.img product.img 是ext4格式的,也可以通过mount挂载为文件目录

2.2 打包super.img

打包需要的工具lpmake,工具位置:

> out/host/linux-86/bin/lpmake

第一步,确认各个img的大小

上面解包出来super\_ext4目录下的img文件,需要重新打包成super.img,在super\_ext4/目录下执行

        
        
      

第二步,开始打包super.img

按如下命令打包,打包前需要注意,super.img、product.img、system.img、odm.img镜像格式需要是Android sparse image,

使用file system.img查看如果不是,使用img2simg转换格式

        
        
      

        
        
      

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

        
        
      


 打赏        分享



评论

邮箱: 昵称: