当前位置: 首页 > news >正文

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 分区。

1.3 super分区结构

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

# lpdump super_ext4.img
$ sudo linux-x86/bin/lpdump super_ext4.img
Slot 0:
Metadata version: 10.2
Metadata size: 1232 bytes
Metadata max size: 65536 bytes
Metadata slot count: 3
Header flags: virtual_ab_device
Partition table:
------------------------Name: product_aGroup: qti_dynamic_partitions_aAttributes: readonlyExtents:0 .. 487015 linear super 2048
------------------------Name: product_bGroup: qti_dynamic_partitions_bAttributes: readonlyExtents:
------------------------Name: system_aGroup: qti_dynamic_partitions_aAttributes: readonlyExtents:0 .. 4051775 linear super 489472
------------------------Name: system_bGroup: qti_dynamic_partitions_bAttributes: readonlyExtents:
------------------------Name: system_dlkm_aGroup: qti_dynamic_partitions_aAttributes: readonlyExtents:0 .. 24071 linear super 4542464
------------------------Name: system_dlkm_bGroup: qti_dynamic_partitions_bAttributes: readonlyExtents:
------------------------Name: system_ext_aGroup: qti_dynamic_partitions_aAttributes: readonlyExtents:0 .. 550263 linear super 4567040
------------------------Name: system_ext_bGroup: qti_dynamic_partitions_bAttributes: readonlyExtents:
------------------------Name: vendor_aGroup: qti_dynamic_partitions_aAttributes: readonlyExtents:0 .. 747055 linear super 5117952
------------------------Name: vendor_bGroup: qti_dynamic_partitions_bAttributes: readonlyExtents:
------------------------Name: vendor_dlkm_aGroup: qti_dynamic_partitions_aAttributes: readonlyExtents:0 .. 3036791 linear super 5865472
------------------------Name: vendor_dlkm_bGroup: qti_dynamic_partitions_bAttributes: readonlyExtents:
------------------------
Super partition layout:
------------------------
super: 2048 .. 489064: product_a (487016 sectors)
super: 489472 .. 4541248: system_a (4051776 sectors)
super: 4542464 .. 4566536: system_dlkm_a (24072 sectors)
super: 4567040 .. 5117304: system_ext_a (550264 sectors)
super: 5117952 .. 5865008: vendor_a (747056 sectors)
super: 5865472 .. 8902264: vendor_dlkm_a (3036792 sectors)
------------------------
Block device table:
------------------------Partition name: superFirst sector: 2048Size: 12884901888 bytesFlags: none
------------------------
Group table:
------------------------Name: defaultMaximum size: 0 bytesFlags: none
------------------------Name: qti_dynamic_partitions_aMaximum size: 6438256640 bytesFlags: none
------------------------Name: qti_dynamic_partitions_bMaximum size: 6438256640 bytesFlags: none
------------------------

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

simg2img super.img super_ext4.img

2. super.img解包和组包

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

2.1 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挂载为文件目录

2.2 打包super.img

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

out/host/linux-86/bin/lpmake

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

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

$ stat -c '%n %s' *
odm.img 626688
product.img 213348352
system_ext.img 123666432
system.img 980586496
vendor.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

相关文章:

  • Android Gradle开发与应用Gradle详细使用
  • STM32第十四课:低功耗模式和RTC实时时钟
  • 「C++系列」C++ 变量作用域
  • 谈谈检测浏览器类型
  • Jenkins 使用 Publish over SSH进行远程访问
  • p标签文本段落中因编辑器换行引起的空格问题完美解决方案
  • 【Element-UI】vue使用 this.$confirm区分取消与关闭,vue给this.$confirm设置多个按钮
  • WHAT - React Immer
  • QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器
  • 【软件工程】计算机内存单位解析及换算
  • vue3中svg图标的封装与使用
  • 万字 | 菊花厂C语言编程10大规范
  • Python基础小知识问答系列-过滤列表元素
  • python 基础综合应用——小开发
  • Swift 定制 Core Data 迁移
  • [译]Python中的类属性与实例属性的区别
  • 2019.2.20 c++ 知识梳理
  • emacs初体验
  • JavaScript 基本功--面试宝典
  • Java基本数据类型之Number
  • MYSQL 的 IF 函数
  • Python打包系统简单入门
  • scala基础语法(二)
  • vagrant 添加本地 box 安装 laravel homestead
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 给第三方使用接口的 URL 签名实现
  • 来,膜拜下android roadmap,强大的执行力
  • 软件开发学习的5大技巧,你知道吗?
  • 线性表及其算法(java实现)
  • 一个项目push到多个远程Git仓库
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 运行时添加log4j2的appender
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (Ruby)Ubuntu12.04安装Rails环境
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (五)关系数据库标准语言SQL
  • (转)socket Aio demo
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .Net Winform开发笔记(一)
  • .NET 的程序集加载上下文
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • /etc/fstab和/etc/mtab的区别
  • @PreAuthorize注解
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • []指针
  • [bzoj1324]Exca王者之剑_最小割