
Android 虚拟 A/B 分区

文章平均质量分 97
本专栏分析 Android 虚拟 A/B 分区功能和实现,内容陆续更新,目前已合并所有动态分区内容,请勿再重复订阅动态分区专栏。已订阅的朋友加我微信进专栏答疑群。
优惠券已抵扣
余额抵扣
还需支付
¥299.90
¥399.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
洛奇看世界
中山大学毕业,某芯片公司技术支持工程师,十几年的行业资深老油条,2b 狗主人,一个喜欢运动的老爹,一只热爱生活的程序猿。
展开
-
Android 虚拟分区详解(一) 参考资料推荐
离上一系列 Android 动态分区详解有一段时间了,群里有时候有朋友抱怨说 VAB 的资料很少,VAB 学习起来有些困难;再加上一些其它因素,我最终决定继续写一写 Android 的虚拟分区系统。这一篇主要梳理一下我学习 Android 虚拟分区所用到的资料,也顺便推荐给你。主要有 3 类,Android 官方 VAB 文档,Device Mapper 文档以及 Android 代码。原创 2022-11-27 23:15:57 · 6320 阅读 · 1 评论 -
Android 虚拟分区详解(二) 虚拟分区布局
上一篇《Android 虚拟分区详解(一) 参考资料推荐》提到了学习虚拟分区的一些参考资料,本篇简单说下虚拟分区的布局。说到 Android 虚拟分区布局,基本上都是直接上一张布局图就完事了,一张图就能搞定的事所以其实也没什么好说的。那为什么又要单独开篇来说呢,因为本文想在分区布局图之外说点别的,如果你很清楚各分区的布局,又能回答以下问题,那就不需要再看本文了。原创 2022-12-03 22:02:01 · 3849 阅读 · 0 评论 -
Android 虚拟分区详解(三) 分区状态变化
到目前为止,虚拟分区前两篇分别推荐了一些参考资料,以及虚拟分区布局分析。实际上,中间为了增加对虚拟分区快照底层的理解,我又写了两篇 linux snapshot 快照的原理和实践作为参考。本文基于 Android 的官方文档关于快照和合并流程一节的内容进行介绍,试图向你解释整个升级过程中分区槽位的状态变化。原创 2023-01-02 00:57:51 · 3862 阅读 · 0 评论 -
Android 虚拟分区详解(四) 编译开关
这一系列名为虚拟分区详解,到目前为止写了三篇,分别是:参考资料推荐,虚拟分区布局和分区状态变化》,中间也补充了虚拟分区底层 linux snapshot 快照的原理。从这一篇开始,逐步深入代码,从代码层面来讲解虚拟分区的代码实现。本文主要讨论一个问题,虚拟分区 VAB 的编译开关,这些开关最终都干了写什么?下篇分析 Android 虚拟分区空间的计算。原创 2023-01-05 17:44:58 · 3642 阅读 · 0 评论 -
Android 虚拟分区详解(五) BootControl 接口的变化
前段时间有朋友在 OTA 讨论群里说他的设备升级以后无法启动了,想要解析 metadata 分区的数据来查看整个系统升级的 merge 状态,因为他怀疑 merge 过程失败导致系统无法启动。实际上,记录系统 merge 状态的 merge status 数据不在 metadata 分区,而是在 misc 分区,这一切和 BootControl 为支持 Virtual A/B 的升级变化有关。本篇主要分析 Android R 上 BootControl HAL 接口的变化。原创 2023-01-31 23:08:14 · 3186 阅读 · 0 评论 -
Android 虚拟 A/B 详解(六) 升级中的状态数据保存在哪里?
对于虚拟 A/B 系统来说,其虚拟的基础是 snapshot,核心是 libsnapshot 库,而 libsnapshot 中,一切操作都又交由类 SnapshotManager 处理,所以如没有搞懂 SnapshotManager 类的行为,很难说你掌握了 Android 虚拟 A/B 系统的运作方式。libsnapshot 的源码位于 system/core/fs_mgr/libsnapshot 目录下面,,本篇和接下来的几篇会详细分析 libsnapshot 代码,完成后再回到虚拟 A/B 升级原创 2023-02-17 21:40:45 · 4266 阅读 · 4 评论 -
Android 虚拟 A/B 详解(七) 升级中用到了哪些标识文件?
如果你在分析某个问题时,碰巧遇到了这 3 个标识文件(/metadata/ota/snapshot-boot, /metadata/ota/rollback-indicator 和 /metadata/ota/allow-forward-merge),你都知道这些标识(indicator)文件中写了什么内容,是做什么用的吗?你知道这些文件是何时创建,何时更新,何时销毁的吗?原创 2023-02-18 11:18:34 · 3520 阅读 · 0 评论 -
Android 虚拟 A/B 详解(八) cow 的大小是如何计算的?
在虚拟 A/B 升级的过程中,假设当前运行在 A 槽位,即将升级 B 槽位的分区,因此系统需要为 B 槽位的分区(比如 system_b) 创建相应的 snapshot (快照) 设备,而创建快照时需要提供快照的 cow 文件。创建 cow 设备时,cow 所需空间会先从 super 分区的空闲空间分配,然后剩余的部分从 userdata 分区分配,并以文件的形式保存在 userdata 分区的目录下。这里先不讨论 cow 到底从哪里分配,而是讨论 cow 的大小到底是如何确定的?原创 2023-03-12 00:07:11 · 4131 阅读 · 0 评论 -
Android 虚拟 A/B 详解(九) cow 的存储是如何分配的?
上一篇《Android 虚拟 A/B 详解(八) cow 的大小是如何计算的?》详细分析了快照(snapshot)设备的后端 COW 空间所需大小是如何计算的。虚拟 A/B 在升级更新分区创建 COW 设备时,会先利用 super 设备上的空闲分区,不够的部分再从 userdata 分区(/data) 下分配文件,然后把这两部分拼接映射出 COW 设备。具体上是如何操作的呢?本文通过跟踪代码为您解开这个答案。原创 2023-03-13 15:04:50 · 4658 阅读 · 2 评论 -
Android 虚拟 A/B 详解(十) 判断 Virtual A/B 是否打开的 5 种办法.md
这是一篇临时加入的文章,计划中的第十篇并不是准备分析这个,只不过因为时常会有小伙伴在 OTA 讨论群和专栏答疑群里问如何判断一个设备是否打开了虚拟分区(Virtual A/B)功能。本文总结我知道的 5 种办法:1. 从源码判断。2. 从编译输出判断。3. 从 image 镜像文件判断。4. 从运行设备的系统属性判断。5. 从运行设备的 super 分区数据判断。原创 2023-10-19 01:10:00 · 3032 阅读 · 0 评论 -
Android 动态分区详解(一) 5 张图让你搞懂动态分区原理
从 Android Q 引入动态分区,到 Android R/S 在动态分区之上增加虚拟分区管理, OTA 升级时需要对分区变更进行处理,不了解动态分区就无法深入 Android OTA 升级。因此最近花了些时间阅读代码,学习 Android 动态分区。本篇主要讲述动态分区的核心数据结构以及动态分区的生成和映射流程。原创 2022-04-01 15:44:49 · 23776 阅读 · 2 评论 -
Android 动态分区详解(二) 核心模块和相关工具介绍
上一篇提到 Android 动态分区的核心是位于 super 分区头部 4K 偏移处开始的 metadata 数据,本篇简单介绍动态分区核心的代码模块和相关工具原创 2022-04-02 23:50:02 · 5215 阅读 · 4 评论 -
Android 动态分区详解(三) 动态分区配置及super.img的生成
官方页面从比较高的角度综述了 Android 动态分区,包括基本原理,配置说明,注意事项等,目的还是给大家介绍如何使用动态分区,重点不在于强调原理。本文根据设备是否存在 super 分区,将包含 super 分区的称为原生动态分区,对应于 Android 的默认动态分区配置;将从低版本升级上来不包含 super 分区的称为改造动态分区,对应于 retrofit 的配置。本文重点介绍 Android 动态分区的这编译配置,这些配置是如何生效,super.img 又是如何生成的。原创 2022-04-08 22:53:38 · 13924 阅读 · 2 评论 -
Android 动态分区详解(四) OTA 中对动态分区的处理
动态分区机制的底层由 linux 的 device mapper 驱动实现。因此,Android 的动态分区,主要强调的是 linux 驱动之上,Android 对动态分区的管理。第一篇《Android 动态分区详解(一) 5 张图让你搞懂动态分区原理》中提到过我对 Android 动态分区本质的看法: 动态分区管理的本质就是对分区数据的增删改查操作,操作的数据对象就是动态分区描述数据 metadata。原创 2022-04-17 04:46:07 · 4157 阅读 · 3 评论 -
Android 动态分区详解(五) 为什么没有生成 super.img?
主要介绍动态分区生成 super.img 的两个隐藏开关。如果你配置了动态分区,结果编译时却没有生成 super.img,本文值得一看,否则不需要看本文。原创 2022-11-23 18:18:39 · 3886 阅读 · 1 评论 -
Android 动态分区详解(六) 动态分区的底层机制
本文作为《Android 动态分区详解(一) 5 张图让你搞懂动态分区原理》 的补充,进一步解释 device mapper,dm-linear 以及动态分区。并通过 3 个实验来加强对 linear 设备以及 Android 动态分区的理解。原创 2022-12-13 17:49:54 · 2860 阅读 · 0 评论 -
Android 动态分区详解(七) overlayfs 与 adb remount 操作
最近突发奇想,在 OTA 讨论群里搜索一下 remount 相关的聊天记录,这个问题引起的话题实在是太多了,所以是时候觉得有必要详细说明 overlay 和 remount 这个问题了。本文从 overlay 文件系统的基本原理出发,简单介绍了 Linux 和 Android 系统中的 overlay 文件系统及相关内容,重点在 Android 中的 remount 操作会从 super 设备或 data 分区分配空间用于 overlay 文件系统。如果只对结论感兴趣,请直接跳转到第 6 节。原创 2023-02-04 14:03:20 · 14620 阅读 · 7 评论 -
Android Update Engine分析(一)Makefile
写完《Android AB System OTA分析》系列后打算一口气将Update Engine也写了的,但一直由于各种借口,最终没有完成。后来6月份的时候陆陆续续读了Update Engine部分代码,记了点笔记,本打算等彻底读完再分享的,但按照目前的进度不知道读完是哪一天,所以先将笔记贴在这里,如果我的这几篇笔记能对您阅读或理解Update Engine机制有一丝帮助,那花时间整理也是值得的...原创 2017-08-28 16:28:21 · 17092 阅读 · 4 评论 -
Android Update Engine分析(二)Protobuf和AIDL文件
Android Update Engine分析(二)Protobuf和AIDL文件 技术文章直入主题,展示结论,容易让人知其然,不知其所以然。 我个人更喜欢在文章中展示如何阅读代码,逐步分析解决问题的思路和过程。这样的思考比知道结论更重要,希望我的分析能让你有所收获。1. Update Engine中的特殊源文件在上一篇《Android Update Engine分析(...原创 2018-06-26 19:38:44 · 5952 阅读 · 1 评论 -
Android Update Engine分析(三)客户端进程
Android Update Engine分析(三)客户端update_engine_client 技术文章直入主题,展示结论,容易让人知其然,不知其所以然。 我个人更喜欢在文章中展示如何阅读代码,逐步分析解决问题的思路和过程。这样的思考比知道结论更重要,希望我的分析能让你有所收获。前面两篇分别分析了Makefile,Protobuf和AIDL相关文件,从本篇开始正式深入功能实...原创 2018-06-26 20:20:14 · 14452 阅读 · 4 评论 -
Android Update Engine分析(四)服务端进程
Android Update Engine分析(四)服务端进程前面三篇分别分析了Makefile,Protobuf和AIDL相关文件以及Update Engine的客户端进程update_engine_client,Android Update Engine分析(一)MakefileAndroid Update Engine分析(二)Protobuf和AIDL文件Android Up...原创 2018-08-27 17:22:19 · 8007 阅读 · 4 评论 -
Android Update Engine分析(五)服务端核心之Action机制
Android Update Engine分析(五)服务端核心之Action机制前面四篇分别分析了Makefile,Protobuf和AIDL相关文件, Update Engine的客户端进程update_engine_client以及Update Engine的服务端:Android Update Engine分析(一)MakefileAndroid Update Engine分析(...原创 2018-08-30 18:36:19 · 6587 阅读 · 0 评论 -
Android Update Engine分析(六)服务端核心之Action详解
Android Update Engine分析(六)服务端核心之Action详解本系列到现在为止的前五篇分别分析了Makefile,Protobuf和AIDL相关文件, Update Engine的客户端进程,Update Engine的服务端及Action机制:Android Update Engine分析(一)MakefileAndroid Update Engine分析(二)Pr...原创 2018-09-04 20:44:16 · 6567 阅读 · 2 评论 -
Android Update Engine分析(七) DownloadAction之FileWriter
Android Update Engine分析(七) DownloadAction之FileWriter本系列到现在为止的共有六篇,分别分析分析了Makefile,Update Engine的客户端、服务端及Action机制的细节:Android Update Engine分析(一)MakefileAndroid Update Engine分析(二)Protobuf和AIDL文件Andr......原创 2018-09-21 18:54:10 · 8887 阅读 · 6 评论 -
Android Update Engine分析(八)升级包制作脚本分析
Android Update Engine分析(八)升级包制作脚本分析本系列到现在为止共有七篇,分别如下:Android Update Engine分析(一)MakefileAndroid Update Engine分析(二)Protobuf和AIDL文件Android Update Engine分析(三)客户端进程Android Update Engine分析(四)服务端进程And...原创 2018-09-27 18:30:03 · 10027 阅读 · 1 评论 -
Android Update Engine分析(九) delta_generator 工具的 6 种操作
最初计划《Android Update Engine分析》系列的时候,大概有十二篇左右,后来分析 payload 数据生成时觉得要花很多时间去分析整理和消化,就放了一放,结果这一放,3 年就过去了,时间真是过得很快。中间不少朋友加我微信询问 delta 数据生成的问题,也只能不了了之。最近决定继续这一系列的写作。计划中的后续内容包括 payload 生成的所有细节,以及 update engine 从 Android N 开始的演化,动态逻辑分区等。原创 2022-01-06 19:48:14 · 3294 阅读 · 0 评论 -
Android Update Engine分析(十) 生成 payload 和 metadata 的哈希
本篇从代码上一步一步分析生成 payload 和 metadata 数据的哈希值的逻辑流程。如果只想看整个函数调用总结,请转到第 3 节,如果想在 linux 命令行通过手工计算来验证,请跳转到第 4 节。原创 2022-01-09 14:18:37 · 3064 阅读 · 0 评论 -
Android Update Engine分析(十一) 更新 payload 签名
上一篇《Android Update Engine 分析(十)生成 payload 和 metadata 的哈希》详细分析了 metadata 和 payload 的哈希时如何生成的,本篇继续分析脚本中是如何对这两个哈希进行签名,并将签名结果更新到 payload 文件中。原创 2022-01-20 11:10:04 · 4379 阅读 · 0 评论 -
Android Update Engine 分析(十二) 验证 payload 签名
上两篇详细分析了 metadata 和 payload 的哈希如何生成,如何签名,如何更新到 payload 文件中,本篇继续分析代码是如何验证 payload 签名的,包括代码中验证签名的流程和签名在命令行的手动验证。本篇主要内容有三点:1. 如何提供公钥和验证签名;2. 总结 payload 的处理流程;3. 手动在命令行提取 payload 的数据进行验证。原创 2022-01-22 10:53:56 · 2600 阅读 · 0 评论 -
Android Update Engine分析(十三) 提取 payload 的 property 数据
前面三篇分别分析了,如何生成 payload 的哈希,如何对 payload 的哈希签名,如何将 payload 的签名写回 payload 文件中。本篇分析如何提取 payload 文件的属性数据,包括 payload 的 "`FILE_SIZE`" 和 "`FILE_HASH`",以及 metadata 数据的 "`METADATA_SIZE`" 和 "`METADATA_HASH`"。原创 2022-01-23 00:01:37 · 4555 阅读 · 0 评论 -
Android Update Engine分析(十四) 生成 payload 数据
生成 payload 数据是 `delta_generator` 工具最主要的功能,当我准备重新更新这一些列文章时,一开始就想写这个的,不过因为太久没看,不记得 payload 细节了,更无从从细节上分析。所以就先写一些简单的操作,等熟悉了再开始写。经过前面篇的分析了解 payload 结构,现在是时候来解决这个问题了。原创 2022-01-30 15:27:27 · 3562 阅读 · 0 评论 -
Android Update Engine 分析(十五) FullUpdateGenerator 策略
生成 payload 时,会选择不同的策略去遍历每一个分区的每一个 block 生成相应的 Operation 数据:1. 差分升级的情况下,如果 version.minor = 1, 则使用 InplaceGenerator 策略2. 差分升级的情况下,其它情况使用 ABGenerator 策略3. 全量升级情况, 使用 FullUpdateGenerator 策略 本篇分析最简单的 FullUpdateGenerator 策略原创 2022-02-02 00:12:24 · 2798 阅读 · 0 评论 -
Android Update Engine 分析(十六) ABGenerator 策略
上一篇《Android Update Engine 分析(十五) FullUpdateGenerator 策略》详细分析了制作全量包使用的 FullUpdateGenerator 策略,本篇详细分析制作差分包使用的 ABGenerator 策略,虽然说叫详细分析,但因为涉及代码多,层次深,这里主要捡一些重要函数进行注释,其它略过。原创 2022-02-11 18:10:40 · 2446 阅读 · 0 评论 -
Android Update Engine 分析(十七)10 类 InstallOperation 数据的生成和应用
Update Engine 在升级时,最底层的操作就是一个个的 InstallOperation, 根据 InstallOperation 的 Type 和 data, 在源分区和目标分区执行相应的操作,最终在目标分区得到期望的数据。在本篇中,我们不用去管升级的各种流程, 各种签名,只关注 InstallOperation 的 10 种 Type 对应的数据时如何生成的,又是如何使用的。原创 2022-02-15 13:37:35 · 3344 阅读 · 0 评论 -
Android Update Engine 分析(十八)差分数据到底是如何更新的?
过去一直以来陆续有朋友问,差分数据到底是如何更新的?其实我一开始在这个问题上也犯了错误,没搞清楚整个分区更新流程。本文详细跟踪差分数据接收到以后,manifest 数据时如何被解析和使用,InstallOperation 数据又是如何被用于更新的。原创 2023-03-11 16:09:24 · 4500 阅读 · 0 评论 -
Android Update Engine 分析(十九)Extent 到底是个什么鬼?
说来惭愧,几年前,我把 Android 的 system/update_engine 目录下早期的代码翻了一遍,很多地方提到了并且使用了 extent 这个概念来处理数据,但我一直没有搞懂 extent 到底是个什么东西,只是知道一个 extent 由两个数据表示,一个表示起始位置,另一个表示长度。在制作升级包时,差分操作基于 extent 进行;在设备端升级时基于 extent 进行还原。仅致于此,并没有继续深究~最近才了解到 extent 是现在常见的文件系统组织方式,突然一惊,真是 out 了原创 2023-09-16 11:29:28 · 1847 阅读 · 1 评论 -
Android Update Engine 分析(二十)为什么差分包比全量包小,但升级时间却更长?
时不时有同学在 OTA 讨论群和 VIP 答疑群问升级速度的问题,其中一个典型的问题是:为什么差分包比全量包小,但升级时间却更长?与几百 M 甚至几个 G 的全量包相比,差分包相对较小,有时候甚至小到只有几个 M,这么小的差分包,意味携带的 payload 数据很少,写入很少的数据耗时应该很少才是。但为什么现实中差分升级时,差分包很小,但升级时间却比大很多的全量包升级更长。前段时间又有类似话题出现在 VIP 答疑群,几经讨论,这个问题算是彻底弄清楚了。本篇专门探讨这个问题为你揭晓答案。原创 2023-08-17 16:27:07 · 2826 阅读 · 0 评论 -
Android Update Engine 分析(二十一)Android A/B 更新过程
我的第一篇 A/B 系统分析文章《Android A/B System OTA分析(一)概览》从总体上介绍了什么是 A/B 系统,A/B 系统如何进行升级切换,应该是不少人 A/B 系统升级的入门读物。从那之后,我陆续写过几十篇 Android A/B 系统升级的文章(到现在也还有很多话题没有写),但每一篇都只分析了很小的一部分,要不就是分析功能代码,要不就是分析处理流程,要不就是演示工具使用。似乎从来没有一篇从总体角度上,全面又很详细介绍 Android A/B 系统升级。幸运的是,Android 官方对原创 2023-08-28 13:11:45 · 2886 阅读 · 0 评论 -
Android Update Engine 分析(二十二)OTA 降级限制之 timestamp
在我的 OTA 讨论群以及 VIP 答疑群里每隔一段时间就会有人问关于 OTA 降级,以及升级时检查 max_timestamp 失败的问题。我觉得有必要把这个问题总结一下。因此,本篇详细分析 OTA 升级时检查 max_timestamp 失败的原因,以及 max_timestamp 的整个处理流程。原创 2023-09-23 02:03:36 · 2135 阅读 · 0 评论 -
Android Update Engine 分析(二十三)如何在升级后清除用户数据?
在 OTA 讨论群呆久了,经常就能听到各种需求。最常见的一个就是升级后清除用户数据。对老同学们来说这个问题非常非常简单;但对不了解 OTA 的新同学来说,这可能有点无从下手。如何在升级后清除用户数据?一句话,在制作升级包时指定 “–wipe-user-data” 选项就可以了。今天单独写一篇关于升级后如何清除用户数据的话题,其实主要不是为了介绍怎么做,而是梳理一下清除用户数据的流程,包括从制作升级包开始,到最终用户数据被清除的这一整个过程。原创 2023-09-25 20:30:00 · 2289 阅读 · 0 评论