自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

洛奇看世界

种一棵树的最好时间是十年前,其次是现在。微信公众号:洛奇看世界。

  • 博客(172)
  • 收藏
  • 关注

原创 Android OTA 升级专栏文章导读

从 2017 年起,我陆续写了一些 Android OTA 升级相关的文章,主要介绍从 Android 7.1 开始引入的 A/B 升级系统,包括从早前的 A/B 系统,到后来的动态分区,再到最近的虚拟 A/B 分区,以及最新的一些 Android OTA 话题。毫不夸张的说,这是目前全网关于 Android OTA 升级最系统,最全面的专栏,没有之一。

2023-02-13 23:56:35 7179 1

原创 博客文章汇总(持续更新中)

技术文章汇总(持续更新中)1. u-boot编译链接分析系列u-boot-2016.09 make配置过程分析u-boot-2016.09 make编译过程分析(一)u-boot-2016.09 make编译过程分析(二)u-boot-2016.09 make工具之fixdepu-boot-2016.09 make工具之confu-boot-2016.09 ld链接脚本分析...

2018-06-24 01:21:15 1945 1

原创 一篇了解TrustZone

这篇文章源于老板想了解TrustZone,要求我写一篇文章简单介绍TrustZone的原理。既然是给领导看的,只介绍原理哪里够,因此也添加了公司自己现有TEE环境的设计、实现和发展,也顺带加入了一些题外话。也是因为要给领导看,所以文章也不能涉及太多技术细节,包括TrustZone模块的详细设计以及示例代码等,所以只从总体上讲解了什么是TrustZone,TrustZone是如何实现安全隔离的、Tr...

2017-09-18 16:03:15 81678 23

原创 为什么RSA公钥每次加密得到的结果都不一样?

《OpenSSL和Python实现RSA Key公钥加密私钥解密》中提到,发现使用RSA公钥对同一数据加密,每次的结果都不一样。百度一下,很多人都有这个疑问,但并没有看到详细的分析解答,即使有人说是因为padding填充的原因,也都是一带而过。为什么私钥对同一数据进行签名加密的结果是一样的,使用公钥进行加密就不一样了呢? 是的,这个问题跟对数据的padding即填...

2017-07-10 16:50:23 87242 16

原创 Android Update Engine 分析(三一)Android 能在升级时新增分区吗?

经常在讨论群和答疑群看到有同学问能不能在升级时新增分区,以及如何新增分区的问题。这里打算分两篇来介绍:第一篇,介绍分区调整的基本原理。包括普通分区的增加,以及 super 设备上分区的增加;第二篇,新增分区实战。基于 Android 12(S) 代码,提供一个新增分区的实例。作为第一篇,本文从原理角度出发,详细分析分区更新的底层逻辑,让你对升级时能否增加、修改和删除分区,以及修改分区可能的风险有一个彻底的认识。

2024-07-17 23:32:26 36

原创 Android Update Engine 分析(三十)有了A/B系统,为什么还要 Recovery?

本文先单独分析 A/B 系统和 Recovery 系统各自的功能,然后对比功能差异来找到 A/B 系统并不能完全替代 Recovery 系统的原因。如果 Recovery 系统所有的功能 A/B 系统都能满足,那自然的结果就是有了 A/B 系统,就可以不需要 Recovery 系统了。如果 A/B 系统并不能实现所有的 Recovery 所具有的功能,那就无法完全替换。同时,也解释了 Recovery 系统存在的意义。

2024-07-11 10:55:08 72

原创 Android Update Engine 分析(二十九)如何进行连续多个版本的升级?

关于如何连续进行多个版本升级,这是一个很常见的需求,也是 OTA 讨论群里试不试就会讨论的一个话题。这个场景一般来自测试对多版本连续升级的检查需求:当前系统运行在 A 槽位(版本 v1),然后希望对 B 槽位进行连续多个版本的升级。以升级两个版本 v2, v3 为例,希望先将 B 槽位升级到版本 v2,然后保持系统运行在 A 槽位,继续将 B 槽位版本从 v2 升级到 v3。这个场景看起来很合理,但实际上没有必要。

2024-05-14 12:46:28 263

原创 Android OTA 交流群 2024 年 1 月问题汇总

问题汇总: 202401-001-recovery里面有没有什么机制是防止VAB升级重启后还没merge完,用户就去恢复出厂设置的?202401-002-有好用的反编译so库的工具吗?202401-003-recovery里边挂载不上cache是怎么回事?202401-004-知道一个so的base addr和so里某个函数的addr之后,怎么算出代码行数?202401-005-不做filesystem_verifier_action,对差分升级有影响吗?202401-006-non ab差分升级

2024-05-07 21:26:17 1113

原创 Android OTA 交流群 2024 年 4 月问题汇总

问题汇总202404-001-user版本替换vendor boot debug版镜像后,然后再刷回来,之后ota能继续升级么?202404-002-mtk平台的gpio号怎么计算202404-003-烧录android系统时没有擦除flash 烧录完成后系统进入救援模式了202404-004-差分payload.bin能不能解析出说需要的底版本号,和升级后的版本号啊202404-005-Failed to read /cache/recovery/block.map

2024-05-07 21:21:59 1136

原创 Android OTA 交流群 2024 年 2 月问题汇总

问题汇总202402-001-服务器打包的ROM缺失某个module202402-002-安卓11上升级超4g的升级包失败问题202402-003-vold操作完模拟存储后有没有属性标识或者其他标识202402-004-有没有了解EAS的 Energy Aware Scheduling202402-005-怎么生出一个空的payload.bin?202402-006-Android14是不是要求64bit only了202402-007-logical partition 在recov

2024-04-25 20:50:53 717 5

原创 Android Update Engine 分析(二十八)payload.bin 文件还能再压缩吗?

之前 Android OTA 交流群里有人问过,说他的升级包太大,有什么办法可以调整升级包的大小,其中一种尝试的方式就是进行压缩。碰巧前段时间群里又有人发起话题,想知道 payload.bin 是不是一个压缩文件,估计是他的 payload.bin 文件太大了,希望能够压缩一下。简单来说,payload.bin 并不是一个压缩文件,但里面的数据大部分已经充分压缩过了,所以整个文件也就没有多少可以再压缩的空间了。

2024-04-20 23:13:46 250

原创 Android OTA 交流群 2024 年 3 月问题汇总

202403-001-升级过程中空间不足导致创建cow数据失败202403-002-OTA包中添加dtbo.img202403-003-apex文件的升级202403-004-解erofs镜像的开源工具202403-005-单独升级super内某个分区202403-006-打印多个同名文件路径及其内容202403-007-使用U盘在recovery下做ab升级202403-008-recovery模式下,SD卡挂载失败

2024-04-20 08:30:21 753 1

原创 Android OTA 问题交流微信群和知识星球

Android OTA 交流微信群和知识星球介绍

2024-04-20 00:15:06 790

原创 Android Update Engine 分析(二十四)制作降级包时,到底发生了什么?

Android 中,跟降级相关的选项比较多,在 Android 13 的代码中就包含了以下这些选项:downgrade,override_timestamp,vabc_downgrade,spl_downgrade。后续会逐个场景展开分析,本篇主要分析使用 `–downgrade`制作降级包的场景。读完本文,你将得到以下问题的答案:升级或降级的本质是什么?我们制作降级包时到底发生了什么?使用降级包进行 OTA 更新时又发生了什么?

2023-10-22 17:54:23 1673

原创 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 2380

原创 Android Update Engine 分析(二十七)如何实现 OTA 更新但不切换 Slot?

上篇《Android Update Engine分析(二十六)OTA 更新后不切换 Slot 会怎样?》 分析了 OTA 更新但如果不进行切换,重启会失败的原因,以及我的一种解决思路。分享到 OTA 答疑群后,小伙伴子非鱼分享了他的理解,比我提到的方法更简单,立马打脸了(也不完全算是打脸,主要是现成的,更简单直接,在这里也特别对子非鱼的分享表示感谢)。哈哈,我欢迎这样打脸,大家多交流才有进步。简而言之,如果我们升级以后,又不希望切换 Slot,就可以借用 "SWITCH_SLOT_ON_REBOOT=0"

2023-10-15 23:43:05 1701

原创 Android Update Engine 分析(二十六)OTA 更新后不切换 Slot 会怎样?

上一篇《Android Update Engine分析(二十五)升级状态 prefs 是如何保存的?》 主要分析了 Update Engine 中 prefs 的实现,以及对所有使用 prefs 的统计。在最后打算以 kPrefsBootId 为例,提供一些研究 prefs 的方法。但随着学习的深入,发现 kPrefsBootId 的变化涉的内容很多。这个过程包括,系统升级,成功更新各分区镜像,接着写入 prefs 状态标记,设备重启,系统启动 Update Engine 服务进程,Update Engin

2023-10-08 22:59:44 1691

原创 Android Update Engine 分析(二十五)升级状态 prefs 是如何保存的?

本系列到现在为止一共二十四篇,前面十七篇基本上就是阅读 update engine 的核心代码和函数,第十七篇以后开始按照话题进行分析。在前面十七篇中,把核心功能代码过了一遍,但仍然有不少功能代码还没分析过。例如,Update Engine 的升级状态数据时如何保存的?系统到底定义了哪些 prefs 数据?本文就管理 Update Engine 状态的 Prefs 类进行详细分析。

2023-09-30 01:43:15 1434

原创 Android Update Engine 分析(二十三)如何在升级后清除用户数据?

在 OTA 讨论群呆久了,经常就能听到各种需求。最常见的一个就是升级后清除用户数据。对老同学们来说这个问题非常非常简单;但对不了解 OTA 的新同学来说,这可能有点无从下手。如何在升级后清除用户数据?一句话,在制作升级包时指定 “–wipe-user-data” 选项就可以了。今天单独写一篇关于升级后如何清除用户数据的话题,其实主要不是为了介绍怎么做,而是梳理一下清除用户数据的流程,包括从制作升级包开始,到最终用户数据被清除的这一整个过程。

2023-09-25 20:30:00 1798

原创 Android Update Engine 分析(二十二)OTA 降级限制之 timestamp

在我的 OTA 讨论群以及 VIP 答疑群里每隔一段时间就会有人问关于 OTA 降级,以及升级时检查 max_timestamp 失败的问题。我觉得有必要把这个问题总结一下。因此,本篇详细分析 OTA 升级时检查 max_timestamp 失败的原因,以及 max_timestamp 的整个处理流程。

2023-09-23 02:03:36 1835

原创 Android Update Engine 分析(十九)Extent 到底是个什么鬼?

说来惭愧,几年前,我把 Android 的 system/update_engine 目录下早期的代码翻了一遍,很多地方提到了并且使用了 extent 这个概念来处理数据,但我一直没有搞懂 extent 到底是个什么东西,只是知道一个 extent 由两个数据表示,一个表示起始位置,另一个表示长度。在制作升级包时,差分操作基于 extent 进行;在设备端升级时基于 extent 进行还原。仅致于此,并没有继续深究~最近才了解到 extent 是现在常见的文件系统组织方式,突然一惊,真是 out 了

2023-09-16 11:29:28 1695 1

原创 Android OTA 相关工具(八) 使用 lpadd 添加镜像到 super.img

我一直以为没有人会使用 lpadd 工具,就像我以为没有人会去使用 lpmake 手动生成 super.img 一样。然鹅,真的有小伙伴使用 lpadd 和 lpmake 去学习和了解 super.img。话说 lpmake 和 lpadd 还真是一个学习 super.img 的好工具,要是再有一个 lpdelete/remove 就更好了。当然,这些都是非常低频甚至几乎不会用到的小工具,以至于在上一篇提到的 lpunpack 中有 bug 也一直没有修复。前几篇分别介绍了 lpdump, lpmake 和

2023-09-02 10:27:44 2014

原创 Android OTA 相关工具(七) 使用 lpunpack 解包 super.img

从 Android 10(Q) 开始,引入了动态分区,伴随的就是一组动态分区内容数据增删改查相关的操作,以及这些操作所需要的工具,包括 lpdump, lpmake, lpunpack, lpadd, lpflash。工具名称前缀 lp 表示是 logic partition,即逻辑分区。前面两篇分别介绍了 lpdump 和 lpmake,本篇介绍 lpunpack。

2023-08-31 11:07:05 3848

原创 Android OTA 相关工具(六) 使用 lpmake 打包生成 super.img

我在介绍过 lpmake 工具,这款工具用于将多个分区镜像打包生成一个 Android 专用的动态分区镜像,一般称为 super.img。Android 编译时,系统会自动调用 lpmake 并传入相关参数来生成 super.img,不需要我们手动操作。但难免还是有朋友想深入研究下 super.img,希望自己手动生成 super.img。所以这里专门开一篇详解介绍下 lpmake 工具。

2023-08-30 14:37:53 4006

原创 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 2205

原创 Android Update Engine 分析(二十)为什么差分包比全量包小,但升级时间却更长?

时不时有同学在 OTA 讨论群和 VIP 答疑群问升级速度的问题,其中一个典型的问题是:为什么差分包比全量包小,但升级时间却更长?与几百 M 甚至几个 G 的全量包相比,差分包相对较小,有时候甚至小到只有几个 M,这么小的差分包,意味携带的 payload 数据很少,写入很少的数据耗时应该很少才是。但为什么现实中差分升级时,差分包很小,但升级时间却比大很多的全量包升级更长。前段时间又有类似话题出现在 VIP 答疑群,几经讨论,这个问题算是彻底弄清楚了。本篇专门探讨这个问题为你揭晓答案。

2023-08-17 16:27:07 2279

原创 如何下载和编译 Android 源码?

网上关于如何下载 Android 源码和编译的文章很多,其中最常见的就是 Android 官方文档。即使有官方文档,但因为访问这些文档需要科学上网的原因,很多人并没有阅读过,所以不断有朋友在我的 OTA 讨论群和 OTA 的 VIP 答疑群里问如何下载和编译 Android 源码?如何制作升级包?本文对到底该如何下载和编译 Android 源码?如何制作和使用升级包?进行手把手解释说明。

2023-08-05 22:30:56 1999

原创 Android OTA 相关工具(五) 使用 lpdump 查看动态分区

在 Android 10(Q) 开始引入动态分区,super 设备内的分区信息存放在头部的 lpmetadata 中,设备异常时经常需要检查分区情况,动态分区工具 lpdump 就是最常用的工具。编译 Android 源码时,默认会编译 lpdump 的 host 和 android 两个版本,分别在 x86 PC 和 Android 设备上运行。本文详细演示 lpdump 工具的用法,以及运行 lpdump 时遇到错误及相应的解决办法。

2023-03-26 22:28:37 5090 1

原创 Android 虚拟 A/B 详解(九) cow 的存储是如何分配的?

上一篇《Android 虚拟 A/B 详解(八) cow 的大小是如何计算的?》详细分析了快照(snapshot)设备的后端 COW 空间所需大小是如何计算的。虚拟 A/B 在升级更新分区创建 COW 设备时,会先利用 super 设备上的空闲分区,不够的部分再从 userdata 分区(/data) 下分配文件,然后把这两部分拼接映射出 COW 设备。具体上是如何操作的呢?本文通过跟踪代码为您解开这个答案。

2023-03-13 15:04:50 4190 2

原创 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 3868

原创 Android Update Engine 分析(十八)差分数据到底是如何更新的?

过去一直以来陆续有朋友问,差分数据到底是如何更新的?其实我一开始在这个问题上也犯了错误,没搞清楚整个分区更新流程。本文详细跟踪差分数据接收到以后,manifest 数据时如何被解析和使用,InstallOperation 数据又是如何被用于更新的。

2023-03-11 16:09:24 4146

原创 Android OTA 相关工具(三) A/B 系统之 bootctl 工具

分别介绍了调试动态分区和虚拟 A/B 分区最常用的工具 snapshotctl 和 dmctl,这一篇介绍 bootctl(boot control),一个专门用于设置 BootControl HAL 接口的工具。这个工具最常用的地方就是在 Android 系统命令行下用来检查 A/B 系统的槽位状态以及切换系统。我最早在 《Android A/B System OTA分析(三)主系统和bootloader的通信》介绍过基本用法,本篇则对这个工具进行详细介绍。

2023-03-02 22:01:20 5029

原创 Android OTA 相关工具(二) 动态分区之 dmctl

我在上一篇《Android OTA 相关工具(一) 虚拟 A/B 之 snapshotctl》 中介绍了从虚拟 A/B 系统 (Android R)开始引入的 snapshot 调试工具 snapshotctl。snapshotctl 本身可以做不少事情,比方说 dump 升级信息, map 和 unmap 各种虚拟分区等。这一篇介绍动态分区调试工具 dmctl,配合 snapshotctl 工具,对各种 dm 开头的动态分区和虚拟分区进行调试更加方便。

2023-02-27 00:00:05 4566

原创 Android OTA 相关工具(四) 查看 payload 文件信息

一直以来,很多人都表达过很想去研究一下 Android OTA 的 payload 文件,看看里面到底有什么,想对其进行一番研究操作,但又觉得 payload 文件很复杂,最终望而却步。从 Android 10(Q) 的动态分区开始,update_engine 的代码中新增了一个名为 payload_info.py 的脚本,专门用于解析 payload.bin 文件并显示相关信息。有了这个工具,我觉得你应该不需要再对 payload.bin 文件内容发愁了。

2023-02-26 17:14:45 4673 1

原创 Android OTA 相关工具(一) 虚拟 A/B 之 snapshotctl

Android 虚拟 A/B 分区推出快三年了,不论是 google 还是百度结果,除了源代码之外,竟然没有人提到这个 Android Virtual A/B 的调试工具 ,着实让人感觉意外。对于 snapshotctl,除了 Android 自家的开发者之外,肯定有下游开发者用过,但没有人分享过这个工具,因此本篇算是全网对 snapshotctl 介绍的第一篇,我相信还有不少人连这个工具都没有听说过。所以我相信还有不少人不知道 Android OTA 到底都有哪些调试工具,这些工具又该如何使用?所以决定

2023-02-20 12:48:46 4452

原创 Android 虚拟 A/B 详解(七) 升级中用到了哪些标识文件?

如果你在分析某个问题时,碰巧遇到了这 3 个标识文件(/metadata/ota/snapshot-boot, /metadata/ota/rollback-indicator 和 /metadata/ota/allow-forward-merge),你都知道这些标识(indicator)文件中写了什么内容,是做什么用的吗?你知道这些文件是何时创建,何时更新,何时销毁的吗?

2023-02-18 11:18:34 3311

原创 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 3820 4

原创 一个自动配置 opengrok 多项目的脚本

前段时间在服务器上配置 opengrok 阅读代码,项目有很多个,一个一个手动配置比较繁琐。我从搭建 tomcat 和 opengrok,到配置和索引完 5 个 Android 项目,用了差不多一整天。要是再让我手动配置几个项目,估计真要崩溃了,看到好多人都有配置 opengrok 多项目的需求,于是写了这个自动配置多项目的脚本。

2023-02-12 01:29:15 3558

原创 编译 Android 时如何指定输出目录?

偶尔会有朋友问编译 Android 时如何指定输出目录? 这里有两种情况:一是如何将 Android 默认的输出目录 out 改到其它位置?二是指定某个模块的输出目录。本文说明如何指定 Android 普通编译和 dist 编译时的输出目录。以及如何指定某个模块的输出目录。

2023-02-10 21:00:00 4757

原创 Android 动态分区详解(七) overlayfs 与 adb remount 操作

最近突发奇想,在 OTA 讨论群里搜索一下 remount 相关的聊天记录,这个问题引起的话题实在是太多了,所以是时候觉得有必要详细说明 overlay 和 remount 这个问题了。本文从 overlay 文件系统的基本原理出发,简单介绍了 Linux 和 Android 系统中的 overlay 文件系统及相关内容,重点在 Android 中的 remount 操作会从 super 设备或 data 分区分配空间用于 overlay 文件系统。如果只对结论感兴趣,请直接跳转到第 6 节。

2023-02-04 14:03:20 11570 5

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除