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_a
  Group: qti_dynamic_partitions_a
  Attributes: readonly
  Extents:
    0 .. 487015 linear super 2048
------------------------
  Name: product_b
  Group: qti_dynamic_partitions_b
  Attributes: readonly
  Extents:
------------------------
  Name: system_a
  Group: qti_dynamic_partitions_a
  Attributes: readonly
  Extents:
    0 .. 4051775 linear super 489472
------------------------
  Name: system_b
  Group: qti_dynamic_partitions_b
  Attributes: readonly
  Extents:
------------------------
  Name: system_dlkm_a
  Group: qti_dynamic_partitions_a
  Attributes: readonly
  Extents:
    0 .. 24071 linear super 4542464
------------------------
  Name: system_dlkm_b
  Group: qti_dynamic_partitions_b
  Attributes: readonly
  Extents:
------------------------
  Name: system_ext_a
  Group: qti_dynamic_partitions_a
  Attributes: readonly
  Extents:
    0 .. 550263 linear super 4567040
------------------------
  Name: system_ext_b
  Group: qti_dynamic_partitions_b
  Attributes: readonly
  Extents:
------------------------
  Name: vendor_a
  Group: qti_dynamic_partitions_a
  Attributes: readonly
  Extents:
    0 .. 747055 linear super 5117952
------------------------
  Name: vendor_b
  Group: qti_dynamic_partitions_b
  Attributes: readonly
  Extents:
------------------------
  Name: vendor_dlkm_a
  Group: qti_dynamic_partitions_a
  Attributes: readonly
  Extents:
    0 .. 3036791 linear super 5865472
------------------------
  Name: vendor_dlkm_b
  Group: qti_dynamic_partitions_b
  Attributes: readonly
  Extents:
------------------------
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: super
  First sector: 2048
  Size: 12884901888 bytes
  Flags: none
------------------------
Group table:
------------------------
  Name: default
  Maximum size: 0 bytes
  Flags: none
------------------------
  Name: qti_dynamic_partitions_a
  Maximum size: 6438256640 bytes
  Flags: none
------------------------
  Name: qti_dynamic_partitions_b
  Maximum size: 6438256640 bytes
  Flags: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/771657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字节一年,人间三年

想来字节做研发,可以先看我这三年的体会和建议。 大家好,我是白露啊。 今天和大家分享一个真实的故事,是关于字节网友分享自己三年的工作经历和感受。 由于白露也曾在字节待过两年,可以说,说的都对。 你有没有想过来…

51-5 权限维持2 - 影子账号(隐藏用户)

权限维持技术 权限维持技术(Persistence,也称为权限持久化)是一种能够在系统重启、用户更改密码或其他可能导致访问中断的情况下保持对系统访问的技术。例如,它包括创建系统服务、利用计划任务、修改系统启动项或注册表、以及映像劫持等方法。 创建影子账户 影子账户是指隐…

目标检测入门:3.目标检测损失函数(IOU、GIOU、GIOU)

目录 一、IOU 二、GIOU 三、DIOU 四、DIOU_Loss实战 在前面两章里面训练模型时,损失函数都是选择L1Loss(平均绝对值误差(MAE))损失函数,L1Loss损失函数公式如下: 由公式可知,L1Loss损失函数…

Midway Serverless 发布 2

可以看看优化后的开发情况,不仅和应用一样,速度还比较快,也不会生成临时目录,修改实时生效。 这是 v2.0 和 v1.0 的根本性变化,也是整体架构升级带来的巨大优势。 当然,这一块并不是功能的新增&#xff0c…

【C++】类和对象(中)--上篇

个人主页~ 类和对象上 类和对象 一、类的六个默认成员函数二、构造函数1、构造函数基本概念2、构造函数的特性 三、析构函数1、析构函数的概念2、特性 四、拷贝构造函数1、拷贝构造函数的概念2、特征 一、类的六个默认成员函数 如果有个类中什么成员都没有,那么被称…

Python从0到100(三十六):字符和字符集基础知识及其在Python中的应用

1. 字符和字符集概述 字符(Character)是构成书面语言的基本元素,它包括但不限于各国家的文字、标点符号、图形符号和数字。字符集(Character set)则是一个包含多个字符的系统,用于统一管理和编码不同的字符。 常见字符集 ASCII:最早的字符…

Truenas scale入坑

家里有一台刚上大学时配的电脑,看着无用武之地,又还能用,于是想那它来搞个私有云nas。 一、选择想要入的坑 一开始对这块没什么了解和概念,最早是在旧主机上安装了个Ubuntu,然后再安装CassOS小尝试了下。可能CassOS里…

【Apache Doris】周FAQ集锦:第 9 期

【Apache Doris】周FAQ集锦:第 9 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…

eNSP-VLAN虚拟局域网

一、出现Vlan的原因 同一个局域网,使用交换机连接,虽然比集线器相连,降低了广播风暴,但是局域网主机数量够多的时候,正常的广播数据(arp、dhcp)也很影响网络性能,所以还需要进一步降低广播风暴——VLAN (图…

双指针算法:快速排序模拟实现

目录 1.思路解析 2:代码展示 1.思路解析 使用双指针pre和cur 指针cur用于检测符合条件的数据 cur和pre数据发生交换用于将符合条件的数据(比key小)向左扔 一轮循环结束时,以pre为分界点,除去key,pre左边的…

SpringMVC 的工作流程和详细解释

Spring MVC(Model-View-Controller)框架是基于经典的 MVC 设计模式构建的,用于开发 Web 应用程序。下面是 Spring Boot MVC 的工作流程和详细解释: 1.客户端发起请求 1.客户端(通常是浏览器)发起 HTTP 请求…

VUE Pinia状态持久化

效果 实现方法 插件:pinia-plugin-persistedstate 链接地址 具体操作 安装 npm i pinia-plugin-persistedstate 添加到 pinia 实例上 import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstateconst pinia cre…

自动化设备上位机设计 一

目录 一 设计原型 二 后台代码 一 设计原型 二 后台代码 namespace 自动化上位机设计 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}} }namespace 自动化上位机设计 {partial class Fo…

PDM与ERP物料编码技术在产品设计中的区别与应用

01 概 述 产品是企业赖以生存的基础,产品数据是企业最基本的也是最重要的数据,产品数据存在于产品设计、采购、生产、销售、服务、库存管理等全过程中。通过对产品设计数据进行编码,并增加采购、库存、生产、制造等属性信息,可以…

2.5 C#视觉程序开发实例1----设计一个IO_Manager

2.5 C#视觉程序开发实例1----设计一个IO_Manager 第一步目标: 1 实现获取IO触发信号Trig0 2 能够实现程序切换 3 图像处理后能够输出一个脉冲 1 IO 引脚定义 1.1 输入信号定义 1.2 输出信号定义 2 IO时序图 2.1 触发时序 2.2 切换程序时序图 3 IO_Manager.cs …

Android系统集成和使用FFmpeg

文章目录 前言FFmpeg源码下载交叉编译NDK下载x264编译源码下载编译 FFmpeg编译脚本 AOSP继承FFmpeg 前言 原生AOSP中并未继承FFmpeg,所以要想在android上使用,需要自己编译集成。 FFmpeg源码下载 git clone https://git.ffmpeg.org/ffmpeg.git目前最新…

云桌面运维工程师

一 深信服驻场工程师 1 深信服AC、AF、AD、NGAF、WOC Atrust、WAF项目实施经验者优先考虑。 负责云桌面POC测试 部署和配置:设置云桌面基础设施,包括虚拟化平台、云桌面管理软件和相关组件。确保正确配置网络、存储和安全设置。 用户体验&#xff1…

oracle用户过期/设置无限期用户/ORA-28001:the password has expired

oracle默认情况下,新建的账户只有180天的有效期,在有效期到期前一周就会报警。而一旦过了有效期,账户就会被锁定无法登录。所以为了方便起见,要修改oracle用户的有效期为无限。 1.查看用户密码的有效期设置,一般默认的…

如何解决滑块验证码 | 最佳滑块拼图验证码解决方案

你是否曾经在遇到滑块验证码时感觉像一个拼图大师?那种需要将拼图块完美地匹配到槽位中以证明你是人类的验证码?我也曾多次遇到过这些棘手的测试,虽然有点挑战性,但它们也是网络安全世界的一个迷人一瞥。在本指南中,我…