Android 虚拟分区详解(二) 虚拟分区布局

news2024/9/23 5:22:25

文章目录

    • 0. 导读
    • 1. Android 传统 A/B 分区和动态分区布局
    • 2. Android 虚拟分区布局
    • 3. 虚拟分区的思考
      • 2.1 分区只有一套,如何实现 A/B 系统特性?
      • 2.2 部分分区还有 A/B 两套,只要一套不行吗?
      • 2.3 为什么不把所有分区都放到动态分区里?
    • 4. 其它

Android 从 R 开始引入 Virtual A/B 系统,简称 VAB,这里称为虚拟分区。

Android 虚拟分区详解系列:

  • 《Android 虚拟分区详解(一) 参考资料推荐》

本系列文章基于 Android R(11) 进行分析,如果没有特别说明,均基于代码版本 android-11.0.0_r46

0. 导读

上一篇《Android 虚拟分区详解(一) 参考资料推荐》提到了学习虚拟分区的一些参考资料,本篇简单说下虚拟分区的布局。

说到 Android 虚拟分区布局,基本上都是直接上一张布局图就完事了,一张图就能搞定的事所以其实也没什么好说的。那为什么又要单独开篇来说呢,因为本文想在分区布局图之外说点别的,如果你很清楚各分区的布局,又能回答以下问题,那就不需要再看本文了。

  1. 虚拟分区中的各种系统分区(system, vendor, product, oem)只有一套,如何实现所说的 A/B 系统特性?
  2. 分区布局有还有部分分区有 A/B 两套,只要一套不行吗?
  3. 对于这些还存在 A/B 两套的分区,为什么不和其他分区一样,都放到 super 对应的动态分区里?

如果只对虚拟分区的布局感兴趣,请跳转到第 2 节;

如果只对上面的问题感兴趣,请跳转到第 3 节;

1. Android 传统 A/B 分区和动态分区布局

有部分新接触升级系统的朋友可能不了解以前的 Android 分区布局,我这里再贴一下以前传统 A/B 分区以及动态分区的布局,清楚以前分区布局的请自行略过本节。

  • 传统 A/B 分区

Android 从 N(7.1) 开始引入 A/B 升级系统,所有分区都有 A/B 两套,且分区大小固定,这里将其称为传统 A/B 分区,至于 A/B 之前的系统,这里不再提及。

更多传统分区布局,请参考: 《Android A/B System OTA分析(一)概览》

  • 动态分区

Android 从 Q(10) 开始引入动态分区,本质还是 A/B 系统,所有分区也都有 A/B 两套,只是将 system/vendor/product/oem 等分区放到 super 分区这个容器中,大小不再固定,升级时可以变化。

这里贴一张 《Android 动态分区详解(一) 5 张图让你搞懂动态分区原理》 中的配图:

传统分区和动态分区

从图中可以看到,对于 system, vendor, product 等这一类分区统一存放到 super 分区中,但还是存在 A/B 两套分区,在 super 分区的头部存放 metadata 数据(相当于分区表),通过解析 metadata 得到分区内的具体构造,从而加载相应的分区。

更多动态分区布局细节,请参考: 《Android 动态分区详解(一) 5 张图让你搞懂动态分区原理》

2. Android 虚拟分区布局

对于 Android 虚拟分区布局,我记得以前 Android 官方网站的页面 Virtual A/B Overview (或无障碍版本: 虚拟 A/B 概览) 是有这个图的,但最新的网页上已经没有这个图了。

以下内容来自官方文档: Android_VirtualAB_Design_Performance_Caveats.pdf

在文档中是这么说的:

Android 文档关于分区布局的解释
把上面这张分区布局图要点总结如下:

  1. 分区有两类,橙色分区和包含在 super 内部的绿色分区;

  2. 橙色分区是启动的关键,直接由 bootloader 加载;

  3. 绿色分区(橙色分区之外的其它分区)都是动态的,因此包含在 super 分区中;

  4. 橙色分区有 A/B 两套,并且分区都比较小,保留 A/B 分区后缀 (_a_b);

    1. 例如: vbmeta 为 64 KB,boot 为 64MB,dtbo 为 8MB
    2. 由于橙色部分对应的分区都比较小,因此使用 A/B 两套带来的开销相对较小;
  5. 绿色分区不使用后缀(只有一套包含在 super 内部的动态分区)

重点:启动中需要的关键分区(橙色)还保留 A/B 两套及相应后缀,其它分区(绿色)都放到动态分区中。即使橙色分区保留了 A/B 两套,但由于绿色分区只有一套,因此也能有效减少升级时对空间的需求。

这里展开说下上图中 A/B 两套分区带来的开销。

  • 手机系统有很强烈的 App 安装需求,目前基本上都是 64G 存储起步,128G,256G 算是标配,往上 512G, 1T 甚至更多。

  • 手机之外的设备,例如电视和机顶盒,没有强烈的 App 安装需求,大部分设备出厂时内置的 App 就贯穿了整个生命周期,所以这类设备的存储大小一般为 16G 或 32G,有部分设备甚至只有 8G(不过随着 Android 本身系统的增大,8G 已经不太够用了),主流 16G 左右。

对一个有 16G 存储的设备来说,分区中多一套(vbmeta + boot + dtbo 等)带来的开销大概率少于 200M。以 200M 为例,相较于总体的 16G 存储,比例 1.25%,几乎可以忽略不计。

3. 虚拟分区的思考

2.1 分区只有一套,如何实现 A/B 系统特性?

相比于动态分区,虚拟分区中的 system, vendor 等分区只有一套,那是如何实现 A/B 系统两套分区升级特性的呢?

答案就在虚拟二字。

以下从宏观的角度大致阐述虚拟分区系统的升级流程:

  1. update engine 接收到升级数据以后,根据升级数据 payload 头部的 metadata 更新设备动态分区 super 头部的分区表。

从第一节的图可以看到,动态分区头部实际上存放的是一个 metadata 结构,但为了不和 payload 头部的 metadata 混淆,这里将动态分区头部的 metadata 称为分区表。

通过解析动态分区头部的分区表就可以加载 Android 需要的各 system, vendor 等分区。

  1. 系统平时基于 super 内的实际分区运行,这里称为真实分区 A。升级时,系统根据分区表的内容,使用 super 内空闲的空间,以及 data 分区内的空间,映射出一套虚拟分区 B;

系统优先使用 super 分区内的空闲空间,不够的时候再从 data 内分配空间。映射的虚拟分区信息也会写入分区表中。

  1. update engine 往虚拟分区 B 里写入升级数据,和以前 A/B 系统两套分区时的方式一样进行升级;
  2. 升级完成后第一次重启,通过 super 头部的分区表加载虚拟分区 B;如果失败,则回退回真实分区 A (升级开始前的状态);
  3. 系统从虚拟分区 B 启动成功以后,需要把虚拟分区 B 的内容同步回真实分区 A,从而确保真实分区 A 和虚拟分区 B 的内容一样;

把分区 B 的内容同步回分区 A 的操作实际上叫做 merge,为了简单起见,这里理解为一种同步操作即可。

在同步没有完成以前,分区 A 是不可用的,但虚拟分区 B 一直可用,所以如果同步被中断了,重新开机以后还会进入虚拟分区 B 继续同步。但此时如果虚拟分区 B 损坏了,那此时整个系统就无法启动了。

  1. 同步完成后,系统重启并从真实分区 A 启动,删除虚拟出来的分区 B,成功完成一次升级;

为了方便理解,以上步骤屏蔽了复杂的虚拟分区底层映射和操作细节。至于虚拟分区的工作原理(如何创建,使用和销毁),请参考后续博客。

2.2 部分分区还有 A/B 两套,只要一套不行吗?

答案是不行。

在官方页面 Virtual A/B Overview (或无障碍版本: 虚拟 A/B 概览) 的一开始就介绍了虚拟分区的特性:

虚拟分区特性描述

无缝回滚两个特性都要求在某个时刻必须同时存在两套分区:

  • 基于无缝的增量升级,要求在更新的时候,从一个分区复制内容到另外一个分区。对于 Virtual A/B 系统,就是一套正在运行的实际分区,和一套基于实际分区虚拟出来的目标分区
  • 回滚要求如果升级失败,需要回退到升级前的分区。对于 Virtual A/B 系统,升级是总是往虚拟出来的分区写内容,如果升级失败,需要回退回世纪分区。

所以如果只有一套分区,满足不了需求。

2.3 为什么不把所有分区都放到动态分区里?

现在系统的 system, vendor 等分区放在动态分区(super)中,正常启动时通过解析 super 分区头部的分区表映射出实际分区;升级时通过虚拟化得到两套分区,即实际分区 A 和基于分区 A 虚拟出来的分区 B。

那为什么不把所有分区都这样进行处理?

了解动态分区加载和虚拟的原理以后,理论上肯定是可以把所有分区都放到动态分区里面的。

一般来说是这样做:

第一级 bootloader 启动后,读取 super 头部的分区表,解析找到所需要的分区数据,例如 boot, vbmeta, dtbo 等,加载使用相关数据启动 kernel,在 kernel 启动后进一步解析 super 的数据加载 system, vendor 等分区。

但 bootloader 本身作为一个加载器,内容比较简单,执行时间很短,目的就是准备并加载 linux kernel。

所以,如果需要把所有分区都放到动态分区的话,一级的 bootloader 就需要添加解析和使用动态分区数据的功能,从而可以操作 super 内的分区。解析线性映射的分区映射还好,解析虚拟分区映射的数据则更加复杂。

相比于承担 1% 左右的空间开销(在动态分区之外单独实现 A/B 两套分区),给简单的 bootloader 添加复杂的动态分区和虚拟分区操作功能代码显得极不划算。

另外,也要考虑从旧设备升级的可能,这里不再展开描述。

因此,把所有分区都放到动态分区中,理论可行,但实际没什么必要。

4. 其它

洛奇工作中常常会遇到自己不熟悉的问题,这些问题可能并不难,但因为不了解,找不到人帮忙而瞎折腾,往往导致浪费几天甚至更久的时间。

所以我组建了几个微信讨论群(记得微信我说加哪个群,如何加微信见后面),欢迎一起讨论:

  • 一个密码编码学讨论组,主要讨论各种加解密,签名校验等算法,请说明加密码学讨论群。
  • 一个Android OTA的讨论组,请说明加Android OTA群。
  • 一个git和repo的讨论组,请说明加git和repo群。

在工作之余,洛奇尽量写一些对大家有用的东西,如果洛奇的这篇文章让您有所收获,解决了您一直以来未能解决的问题,不妨赞赏一下洛奇,这也是对洛奇付出的最大鼓励。扫下面的二维码赞赏洛奇,金额随意:

洛奇自己维护了一个公众号“洛奇看世界”,一个很佛系的公众号,不定期瞎逼逼。公号也提供个人联系方式,一些资源,说不定会有意外的收获,详细内容见公号提示。扫下方二维码关注公众号:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化运维工具-----Ansible

一、主流自动 1.1 Puppet Puppet 是早期的 Linux 自动化运维工具,是一种 Linux、Unix、Windows 平台的集中配置管理系统,发展至今目前已经非常成熟,可以批量管理远程服务器,模块丰富,配置复杂,基于 Ruby …

[附源码]Python计算机毕业设计Django楼盘销售管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Netty系列(四):源码解读 backlog 参数作用

sun.nio.ch.ServerSocketChannelImpl#bind方法 在ServerSocketChannel接口中,有一个bind方法,这个方法的作用是将通道的套接字绑定到本地地址并配置套接字以侦听连接。即用于在套接字和本地地址之间建立关联。而一旦建立关联,套接字将保持绑…

html5期末大作业——HTML+CSS公益关爱残疾人( 6个页面)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Metabase学习教程:系统管理-3

保持条理化 当用户、问题和仪表盘的数量不可避免地增加时,如何保持分析的组织性。 如果您想保持竞争力,您需要让组织中的人员访问他们需要的数据,以便做出更好的决策。然而,这种数据自主化的代价是不可避免的大量分析——这会使…

CentenOS安装使用Docker

1 先更新一下yum 执行 yum -y update 这样算完成 2 清理一下,原来可能安过的docker yum remove docker docker-common docker-selinux docker-engine 3 安装所需软件包 yum install -y yum-utils device-mapper-persistent-data lvm2 安装过的可以跳过 4 配置yum中…

Qt OpenGL 光照和键盘控制

这次教程中,我们将添加光照和键盘控制,它让程序看起来更美观。我将教大家如何使用键盘来移动场景中的对象,还会教大家在OpenGL场景中应用简单的光照,让我们的程序更加视觉效果更好且受我们控制。 程序运行时效果如下:…

java项目_第168期ssm二手车交易网站-_计算机毕业设计

java项目_第168期ssm二手车交易网站-_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm二手车交易网站》 该项目分为2个角色,管理员和用户。 用户可以浏览前台,包含功能有: 首页、商品信息、论坛信息、新闻资讯 、留言反馈、购物车、跳转…

目的:ubuntu配置使用opengl - 初探-创建一个空窗口

目的:ubuntu配置使用openGL - 初探-创建一个空窗口 环境: 系统:Ubuntu18.04 环境:g步骤: Ubuntu下使用openGL,搭建配置环境并测试窗口 1、openGL库,需要单独安装,由于本机是vmwar…

萌新源api管理系统更新教程

前言 萌新源API管理系统旨在大家提供一个更为方便的管理api的方法,经过几个月的时间,目前已经迭代到v4.41版本 那么这篇文章呢,也是想要教一下大家怎样去更新我们最新版本的管理系统,我最近也是在研究自动化更新,但是…

【CVPR2022】Detecting Camouflaged Object in Frequency Domain

【CVPR2022】Detecting Camouflaged Object in Frequency Domain 论文有一个非官方的实现:https://github.com/VisibleShadow/Implementation-of-Detecting-Camouflaged-Object-in-Frequency-Domain 感觉这个论文是CVPR2022 Learning in the frequency domain 论文…

具有 1 个射频链的 OFDM-MIMO 系统的波束训练(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

基于多能互补的热电联供型微网优化运行(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

特征缩放是强制性的吗? 什么时候使用标准化? 什么时候使用归一化?数据的分布会发生什么变化?对异常值有什么影响?模型的准确性会提高吗?

以上问题也是面试中经常被问到的问题,我将在本博客中尝试通过提供合适的例子来回答上述问题。我们将使用 sklearn 的 StandardScaler 和 MinMaxScaler。 让我们考虑一个数据集,其中Age和Estimated Salary是输入特征,我们必须预测产品是否已购买(输出标签)或未购买。 看看…

【1796. 字符串中第二大的数字】

来源:力扣(LeetCode) 描述: 给你一个混合字符串 s ,请你返回 s 中 第二大 的数字,如果不存在第二大的数字,请你返回 -1 。 混合字符串 由小写英文字母和数字组成。 示例 1: 输入…

Spring - BeanFactoryAware扩展接口

文章目录Preorg.springframework.beans.factory.BeanFactoryAware扩展点说明Aware接口Spring内建Aware接口的执行时机及顺序源码解析 (直接调用)源码分析 _ BeanPostProcessor调用执行顺序扩展点示例Pre Spring Boot - 扩展接口一览 org.springframewor…

Kotlin Flow 背压和线程切换竟然如此相似

前言 上篇分析了Kotlin Flow原理,大部分操作符实现比较简单,相较而言背压和线程切换比较复杂,遗憾的是,纵观网上大部分文章,关于Flow背压和协程切换这块的原理说得比较少,语焉不详,鉴于此&…

5G无线技术基础自学系列 | 5G上行功率控制

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G上行功率控制是针对每个UE的不同信道…

CS224W 8 GNN Augmentation andTraining

目录 Graph Augmentation for GNNs 引入 Why Graph Augmentation Graph Augmentation Approaches Feature Augmentation on Graphs Input graph没有node features GNN很难学习的一些特定结构 Graph Structure augmentation Augment sparse graphs——添加虚拟节点或边…

不同平台下运行历程代码

不同平台下运行历程代码 所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放; 所谓的小端模式,是指数据…