自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

洛奇看世界

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

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

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

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

2023-02-13 23:56:35 9052 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 2135 1

原创 一篇了解TrustZone

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

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

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

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

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

原创 Android AVB 分析(二)AVB 2.0 自述文档(注释提问版)

我一开始并没有打算要翻译这个 Android 自带的 AVB 2.0 自述文档,因为网上已经有很多篇这个文档了,简直不计其数。但是 AVB 自述文档又实在是太重要了,所以如果只推荐一篇文档的话,那肯定就是官方这篇。所以,我这里也不免俗,将 Android Verified Boot 2.0 最新的文档(2025/01/18) 通过 AI 翻译在这里,并附上我的部分解读,以及提出的一些问题

2025-04-04 14:04:43 533

原创 Android AVB 分析(一)AVB 到底该如何学习?

关于程序,从宏观上看,程序由数据和围绕数据的一系列操作构成,所谓的操作主要是数据的增删改查,在类似 Android 这样的系统中,还包括配置和编译。对于 Android AVB 机制也不例外,AVB 的目的是验证启动中的每一个环节,包括:1. 芯片 ROM 验证 bootloader (芯片厂家和 OEM 完成);2. bootloader 验证 Android boot 和 vbmeta 等分区 (通过集成 libavb 完成);3. bootloader 将 verity 相关参数传递给

2025-03-23 16:17:45 723

原创 Android AVB 挑战,100 个问题你能回答几个?

我使用 AI 整理了 100 条关于 Android Verified Boot (AVB) 的问题,涵盖原理、源码、镜像布局、工具、签名验证、dm-verity、FEC、开关、回滚保护及数据存储等方面,这些问题可以用于测试你对 AVB 的理解和掌握程度。有些问题有标准答案,另一些则没有,所以不要纠结于具体的答案,我也不会提供所谓的标准答案,欢迎加入我的 AVB 讨论群和大家一起交流学习。我创建了一个 Android AVB 讨论群,主要讨论 Android 设备的 AVB 验证问题。

2025-03-23 10:13:47 537

原创 Android AVB 分析(十九)Android 镜像中的 FEC 到底能纠正多少错误?

我在 《Android AVB 分析(十三)dm-verity 设备是如何映射和纠错的?》中做过一个 system 分区镜像 system.img 进行 dm-verity 映射,加载和 FEC 纠错的例子。本文提供更多源于 Android 镜像数据破坏和使用 FEC 纠错的例子。

2025-03-23 00:53:47 23

原创 Android AVB 分析(二十)Android 官方 FEC 文档解读

在前两篇中详细介绍了 Android 镜像中的 FEC 数据是如何生成的。以及 Android 镜像中使用 FEC 对多达 6.63M 连续破坏数据的修复。但你可能还会觉得不过瘾,为啥采用 RS(255, 253) 编码,为啥不采用具有更强纠错的其它编码?采用 FEC 纠错的代价有多大?采用 FEC 对 Android 性能的影响有多大?为此,Android 在官方的 AVB 文档中补充了一篇文章链接:《严格强制执行的启动时验证与纠错》,这篇文章详细介绍了为什么采用 FEC 纠错,以及相应的评估和需要为此特

2025-03-03 00:01:38 80

原创 Android AVB 分析(十八)Android 镜像中的 FEC 数据是如何计算出来的?

在《Android AVB 分析(六)FEC 数据到底是如何生成的?》中,我分析 Android 如何调用 avbtool 生成 FEC 数据的过程。实际上,avbtool 自己并不直接生成 FEC,而是进一步调用 fec 工具处理带有 HashTree 的镜像得到 FEC 数据。在本篇,我们将彻底解决关于 Android 镜像中 FEC 数据是如何生成的所有疑问。 1. Android 中用于生成 FEC(Reed-Solomen) 编码的 fec 工具介绍;2. Android 中 FEC 的参数;..

2025-03-02 13:59:06 67

原创 Android AVB 分析(十七)程序员的FEC(Reed-Solomon)编码实战

上一篇《Android AVB 分析(十六)5个例子理解 FEC(Reed-Solomon) 的工作原理》中解释了 FEC 以及 RS(里德所罗门编码)的原理,并基于 Python 的 reedsolo 库提供了 5 个 RS 编码和解码的例子。通过对原始数据进行编码生成 FEC,以及对错误数据进行纠正还原数据。我相信如果您阅读了这篇文章,并亲自去做了这几个实验,那一定会对 RS 编码有一个比较切身的了解。也可能你还希望有一些补充,所以我个人觉得以程序员实践的角度为出发点的本篇同样可以让你有些收获。总体上,

2025-02-25 23:16:52 58

原创 Android AVB 分析(十六)5 个例子彻底理解 FEC(Reed-Solomon) 的工作原理

关于 FEC 是如何工作的,一直是我 Android OTA 讨论群中的未解话题,大家基本上都不清楚 Android 上面的 FEC 是如何工作的,为什么在 OTA 升级的最后阶段,FEC 的编码计算会消耗大量的 IO 资源,并持续很长时间。接下来的几篇,我会从一个程序员的角度,演示基于里德所罗门编码的 FEC 到底是如何工作的。

2025-02-25 23:08:12 71

原创 fiemap_query,一个查询文件 FIEMAP 信息的工具

fiemap是FileExtentMap的简称,是Linux文件系统中用于获取文件物理存储布局信息的机制。它能够告诉你一个文件在磁盘上是如何存储的,具体包括文件的数据块在磁盘上的物理位置和分布情况。`fiemap_query`是guyognqiangx写的一个用来查询文件布局的工具。

2025-01-18 20:22:32 632

原创 Android AVB 分析(十三)dm-verity 设备是如何映射的?

在上一篇《Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介》介绍 dm-verity 原理的时候,作者提供了一个 dm-verity 演示的例子。本篇我们基于 AOSP 源码 `android-13.0.0_r41` 实际编译生成的 Google Pixel 7 (“panther”) 设备的 system 分区镜像进行 dm-verity 设备验证实战。

2025-01-17 21:30:00 1747

原创 Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介

上一篇 《Android AVB 分析(十一)bootloader 是如何进行 verify boot 检查的?》 分析了 bootloader 中是如何调用 libavb 函数库验证 vbmeta 和 boot 等分区的。接下来就打算写一篇介绍 dm-verity 原理的文章,然后再写一篇徒手 dm-verity 实践的文章,结果偶然发现了本篇的英文原版。写得太好,我觉得自己完全没有必要再写原理了。由于原文是英文,有些英语不太好的朋友不一定能完全理解。我花了点时间,结合 AI 将英语原文翻译成中文。

2025-01-09 20:40:06 1606

原创 Android AVB 分析(十一)bootloader 是如何进行 verify boot 检查的?

上一篇《Android AVB 分析(十)AVB 有哪些相关的源码?》中分析了 AVB 源码结构,本篇正式深入 AVB 源码,看看在 bootloader 中是如何使用 libavb 进行 verify boot 检查验证的。

2025-01-07 23:38:58 1101

原创 Android AVB 分析(十)AVB 有哪些相关的源码?

前面的几篇内容主要分析 avbtool 工具源码,通过分析,我们看到了 avbtool 如何处理各种镜像 image,包括各种分区镜像的 AVB 数据是如何生成的,例如 hash, hashtree, FEC 和 VBMeta 等。因此,前面几篇的核心是 AVB 相关数据的生成~从本篇开始,逐步介绍 AVB 数据的使用,包括基于 boot 这类小分区镜像生成的 hash,以及基于 system 这类大分区镜像生成的 FEC 和 hashtree,这就必须涉及到大量的代码。

2025-01-04 23:16:41 784

原创 Android AVB 分析(九)Auxiliary Data 包含了哪些描述符和公钥?

在上一篇《Android AVB 分析(八)VBMeta 数据解析和签名验证实战》中,对一个典型的 boot.img 的 VBMeta 进行了注释。对每一个 VBMeta 数据,分成 3 个部分: VBMeta 头部的 meta 数据 AvbVBMetaImageHeader,用于描述整个 VBMeta;VBMeta 的验证数据块 Authentication Data Block,主要用来检查 VBMeta 数据的哈希和签名;VBMeta 的辅助数据块 Auxiliary Data Block,包含了各种

2024-12-26 21:46:06 765

原创 Android AVB 分析(八)VBMeta 数据解析和签名验证实战

在上一篇《AVB 的 VBMeta 数据是如何生成的?》中,我们分析了 VBMeta 数据时如何生成的,以及 VBMeta 的主要布局,但并没有进一步深入检查 VBMeta 的数据。本篇我们继续深入 VBMeta 数据,实战手动验证签名,解析各种描述符。

2024-12-23 00:17:02 1948

原创 Android AVB 分析(七)VBMeta 数据是如何生成的?

前面几篇分析了 boot.img 和 system.img 的布局,以及 system.img 中的 hashtree 和 FEC 数据,对于最重要的 VBMeta 数据还没有涉及。本篇重点分析下 VBMeta 数据的生成以及结构。

2024-12-23 00:13:23 1187

原创 Android AVB 分析(六)FEC 数据到底是如何生成的?

Android 编译时会调用 avbtool 对 system, vendor, product 等镜像生成 hashtree,但对于大的镜像,还会在 hashtree 之后生成用于纠错的 FEC 数据。那这个 FEC 到底是如何生成的呢?本篇以 android-13.0.0_r41 中编译 aosp_panther 目标的 system 镜像为例。探究下 system.img 的 FEC 数据到底是如何生成的。

2024-12-15 15:33:48 1122

原创 Android AVB 分析(四)system.img 到底包含了哪些数据?

在上一篇《AVB 数据实战之 boot.img》中分析了使用 add_hash_footer 操作的 boot.img 镜像的格式。本篇进一步分析 add_hashtree_footer 操作的 system.img 镜像的格式。因此,system.img 都包含哪些数据,你有尝试亲自去分析 system.img 吗?一个 system 分区的镜像,为了满足 AVB 需要,需要进行如何处理?本文以实际操作的形式,带你查看 system.img 镜像,包括 avbtool 的多个操作,以及如何如何手动解析 A

2024-12-15 13:28:28 899

原创 Android AVB 分析(三)boot.img 到底包含了哪些数据?

在学习 Android Verify Boot 时,boot.img 都包含哪些数据,你有尝试亲自去分析 boot.img 吗?一个 boot 分区的镜像,为了满足 AVB 需要,需要进行如何处理?本文以实际操作的形式,带你查看 boot.img 镜像,包括 avbtool 的多个操作,以及如何如何手动解析 AVB Footer,如何使用 shell 命令验证带有 salt 的镜像 hash 值。

2024-12-15 02:01:04 1245

原创 Android AVB 分析(五)哈希树到底是如何生成的?

Android 编译时会调用 avbtool 对 system, vendor, product 等镜像生成 hashtree,但这里的 hashtree 到底是如何生成的呢?本篇以 android-13.0.0_r41 中编译 aosp_panther 目标的 system 镜像为例。探究下 system.img 的 hashtree 到底是如何生成的。

2024-12-15 01:49:38 486

原创 Android Update Engine 分析(三四)OTA 签名都支持哪些算法?

写了几十篇还没涉及到 OTA 签名算法细节,OTA 讨论群也很少问这个,毕竟签名算法纯理论的问题,一旦实现好就极少需要改动,只需要进行一些配置,准备好签名的秘钥和证书就可以了。限于签名的算法理论太过于抽象,本篇不讨论签名算法细节,但会总结一些签名操作。以及 Android OTA 包支持的签名算法。本文主要分析 Update Engine 中支持的签名算法,以及这些算法的操作实现(不涉及原理部分),并总结签名和验签使用的 key。

2024-12-09 10:11:28 231

原创 Android Update Engine 分析(三三)Android 设备上到底有哪些可以运行的系统?

Android slot 槽位的切换是 Android OTA 一个比较基础的知识点,也是 Android OTA 讨论群里问得比较多的问题,刚接触 Android OTA 的同学往往不清楚槽位 slot 到底是如何切换的。我在《Android A/B System OTA分析(三)主系统和bootloader的通信》有中,有做过相关内容的分析。但没有明确指出槽位是如何切换的。这里单独将 slot 槽位的切换拿出来说一说。

2024-12-08 17:19:56 123

原创 Android 设备分区大总结

Android 为了解耦 AOSP 和芯片厂家(vendor),以及设备厂家(odm) 的关系,真是操碎了心。就一个分区隔离都看得我云里雾里,更不用还有跟分区变更紧密相关的 ramdisk 变更,不论是分区变更,还是 ramdisk 变更,都可以单独起一个单独的专题。不知道你晕了没有,反正我感觉很晕。本文专门探讨一些我知道的 Android 分区。

2024-12-01 22:21:07 2112

原创 Android Update Engine 分析(三二)Android 的槽位切换是如何实现的?

Android slot 槽位的切换是 Android OTA 一个比较基础的知识点,刚接触 Android OTA 的同学往往不清楚槽位 slot 到底是如何切换的,所以这也是 Android OTA 讨论群里问得比较多的问题我在[《Android A/B System OTA分析(三)主系统和bootloader的通信》](https://blog.youkuaiyun.com/guyongqiangx/article/details/72480154)有中,有做过相关内容的分析。但没有明确指出槽位是如何切换的。

2024-07-29 01:17:33 749 1

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

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

2024-07-17 23:32:26 472

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

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

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

2024-05-14 12:46:28 516

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

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

原创 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 902 5

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

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

2024-04-20 23:13:46 592

原创 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 990 1

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

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

2024-04-20 00:15:06 1010

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

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

2023-10-22 17:54:23 1944

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

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

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

2023-10-15 23:43:05 1965

空空如也

空空如也

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

TA关注的人

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