自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

洛奇看世界

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

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

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

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

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

原创 一篇了解TrustZone

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

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

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

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

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

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

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

2023-10-22 17:54:23 1517

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

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

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

2023-10-15 23:43:05 1511

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

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

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

2023-09-30 01:43:15 1363

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

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

2023-09-25 20:30:00 1615

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

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

2023-09-23 02:03:36 1669

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

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

2023-09-16 11:29:28 1573 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 1868

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

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

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

2023-08-30 14:37:53 3456

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

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

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

2023-08-17 16:27:07 2041

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

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

2023-08-05 22:30:56 1949

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

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

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

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

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

2023-03-13 15:04:50 4040

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

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

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

2023-03-11 16:09:24 4015

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

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

原创 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 4300 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 4198

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

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

2023-02-18 11:18:34 3242

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

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

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

2023-02-12 01:29:15 3413

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

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

2023-02-10 21:00:00 4543

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

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

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

原创 [已解决]Ubuntu Server 使用 jenkins 运行 selenium webdriver 失败

如果你在 ubuntu server 上运行 selenium webdriver 失败,建议做如下检查:1. server 上是否安装了 Chrome 浏览器应用?2. 运行 selenium webdriver 时是否下载并指定了 Chrome 对应的 webdriver?3. 使用 jenkins 在没有图形界面的环境下运行 selenium,需要将其设置为无头模式(headless)4. 尝试在命令行直接以无头模式运行 Chrome

2023-02-01 22:06:01 3412 3

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

原创 Android 虚拟分区详解(四) 编译开关

这一系列名为虚拟分区详解,到目前为止写了三篇,分别是:参考资料推荐,虚拟分区布局和分区状态变化》,中间也补充了虚拟分区底层 linux snapshot 快照的原理。从这一篇开始,逐步深入代码,从代码层面来讲解虚拟分区的代码实现。本文主要讨论一个问题,虚拟分区 VAB 的编译开关,这些开关最终都干了写什么?下篇分析 Android 虚拟分区空间的计算。

2023-01-05 17:44:58 3269

原创 Android 虚拟分区详解(三) 分区状态变化

到目前为止,虚拟分区前两篇分别推荐了一些参考资料,以及虚拟分区布局分析。实际上,中间为了增加对虚拟分区快照底层的理解,我又写了两篇 linux snapshot 快照的原理和实践作为参考。本文基于 Android 的官方文档关于快照和合并流程一节的内容进行介绍,试图向你解释整个升级过程中分区槽位的状态变化。

2023-01-02 00:57:51 3172

原创 Linux 快照 (snapshot) 原理与实践(二) 快照功能实践

上一篇《Linux 快照 (snapshot) 原理与实践(一)》中简单介绍了快照的基本原理,并着重介绍了 Linux 下 snapshot 快照的实现,这应该是目前全网唯一一篇介绍 Linux 下 snapshot 模型的文章。对一线工程师来说,只有理论是远远不够的,于是我又另外设计了本文这一组实验操作来验证 Linux 下 snapshot 快照模型的各种功能,以此加深对 snapshot 快照的理解。

2022-12-30 15:44:33 6190 2

原创 Linux 快照 (snapshot) 原理与实践(一) 快照基本原理

网上介绍存储快照原理的文章很多,要我说简直是太多了,但大多都只是讲最基础的原理。我还没有找到一篇可以从基础的原理,落实到随处可见的 linux 中的实现,然后再来一些具体操作例子的文章。于是我自己产生了写一篇快照科普的想法,希望把快照的基础原理同 linux 下具体的 snapshot 实现结合起来,再来一些操作实验增加对快照的理解。

2022-12-30 14:24:58 8221 1

原创 Android 动态分区详解(六) 动态分区的底层机制

本文作为《Android 动态分区详解(一) 5 张图让你搞懂动态分区原理》 的补充,进一步解释 device mapper,dm-linear 以及动态分区。并通过 3 个实验来加强对 linear 设备以及 Android 动态分区的理解。

2022-12-13 17:49:54 2206

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

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

2022-12-03 22:02:01 2862

原创 Android 虚拟分区详解(一) 参考资料推荐

离上一系列 Android 动态分区详解有一段时间了,群里有时候有朋友抱怨说 VAB 的资料很少,VAB 学习起来有些困难;再加上一些其它因素,我最终决定继续写一写 Android 的虚拟分区系统。这一篇主要梳理一下我学习 Android 虚拟分区所用到的资料,也顺便推荐给你。主要有 3 类,Android 官方 VAB 文档,Device Mapper 文档以及 Android 代码。

2022-11-27 23:15:57 4302 1

空空如也

空空如也

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

TA关注的人

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