Android OTA 相关工具(三) A/B 系统之 bootctl 工具
文章目录
- 1. bootctl 的编译
- 2. bootctl 的帮助信息
- 3. bootctl 的用法
- 1. hal-info
- 2. get-number-slots
- 3. get-current-slot
- 4. mark-boot-successful
- 5. set-active-boot-slot
- 6. set-slot-as-unbootable
- 7. is-slot-bootable
- 8. is-slot-marked-successful
- 9. get-suffix
- 10. set-snapshot-merge-status
- 11. get-snapshot-merge-status
- 4. 思考题
- 5. 其它
前面两篇:
- 《Android OTA 相关工具(一) 虚拟 A/B 之 snapshotctl》
- 《Android OTA 相关工具(二) 动态分区之 dmctl》
分别介绍了调试动态分区和虚拟 A/B 分区最常用的工具 snapshotctl 和 dmctl,这一篇介绍 bootctl(boot control),一个专门用于设置 BootControl HAL 接口的工具。
这个工具最常用的地方就是在 Android 系统命令行下用来检查 A/B 系统的槽位状态以及切换系统。
我最早在 《Android A/B System OTA分析(三)主系统和bootloader的通信》 介绍过基本用法,本篇则对这个工具进行详细介绍。
本文为洛奇看世界(guyongqiangx)原创,转载请注明出处。
文章链接:https://guyongqiangx.blog.csdn.net/article/details/129310109
本文基于 Android 版本: android-11.0.0_r21,但后续版本也大同小异
在线代码:http://aospxref.com/android-11.0.0_r21/
1. bootctl 的编译
默认情况下 bootctl 不会编译进系统,需要在 device 目录下相应的 makefile 中将 bootctl 添加到 PRODUCT_PACKAGES 变量中。
不清楚如何添加就在 device 目录下执行 grep 命令看下 google 的参考设备是如何添加的。
例如,在 Android 11 上的 crosshatch 设备,bootctl 被包含在 PRODUCT_PACKAGES_DEBUG 中,如下:
http://aospxref.com/android-11.0.0_r21/raw/device/google/crosshatch/device.mk
# The following modules are included in debuggable builds only.
PRODUCT_PACKAGES_DEBUG += \bootctl \update_engine_client
由于这里是 PRODUCT_PACKAGES_DEBUG,所以只有在 userdebug 版本才会包含 bootctl。
如果希望在其他版本都包含 bootctl,则建议把 bootctl 添加到 PRODUCT_PACKAGES 中。
2. bootctl 的帮助信息
bootctl 的命令比较直观,基本都可以见名知意:
console:/ # bootctl -h
bootctl - command-line wrapper for the boot HAL.Usage:bootctl COMMANDCommands:hal-info - Show info about boot_control HAL used.get-number-slots - Prints number of slots.get-current-slot - Prints currently running SLOT.mark-boot-successful - Mark current slot as GOOD.set-active-boot-slot SLOT - On next boot, load and execute SLOT.set-slot-as-unbootable SLOT - Mark SLOT as invalid.is-slot-bootable SLOT - Returns 0 only if SLOT is bootable.is-slot-marked-successful SLOT - Returns 0 only if SLOT is marked GOOD.get-suffix SLOT - Prints suffix for SLOT.set-snapshot-merge-status STAT - Sets whether a snapshot-merge of any dynamicpartition is in progress. Valid STAT valuesare: none, unknown, snapshotted, merging,or cancelled.get-snapshot-merge-status - Prints the current snapshot-merge status.SLOT parameter is the zero-based slot-number.
在 Android 11 上新增了两个命令:
set-snapshot-merge-status STATget-snapshot-merge-status
这两个命令专门用来设置和查看虚拟 A/B 分区的 snapshot 状态。
关于 BootControl HAL 接口的具体信息,请参考下面两篇:
- 《Android A/B System OTA分析(三)主系统和bootloader的通信》
- 《Android 虚拟分区详解(五) BootControl 接口的变化》
前一篇分析了 BootControl 的代码实现,后一篇分析了为了支持虚拟 A/B 分区,系统在 BootControl 接口上的变化。
3. bootctl 的用法
下面是设备上执行 bootctl 命令的一些典型用法。
1. hal-info
Hal-info 命令查看当前的 IBootControl 接口的 HAL 信息:
- 在 Android 7.1 系统上执行 hal-info 命令
console:/ # bootctl hal-info
HAL name: boot control hal for bcm platform
HAL author: Broadcom
HAL module version: 0.1
- 在 Android 11 上执行 hal-info 命令
console:/ # bootctl hal-info
HAL Version: android.hardware.boot@1.1::IBootControl
2. get-number-slots
get-number-slots 用于打印当前系统的槽位 (slot) 数量,A/B 系统一般都是两个。
console:/ # bootctl get-number-slots
2
3. get-current-slot
get-current-slot 用于打印当前系统运行的槽位 (slot):
console:/ # bootctl get-current-slot
1
A/B 系统一般由两个槽位 (slot),分别是 0 和 1,这里的系统运行在槽位 1 上。
4. mark-boot-successful
mark-boot-successful 将当前运行的系统标记为成功启动
console:/ # bootctl mark-boot-successful
5. set-active-boot-slot
set-active-boot-slot 设置系统下次启动的 slot,
console:/ # bootctl get-current-slot
1
这里显示当前系统运行在 slot 1 (B 槽位)上,运行:
console:/ # bootctl set-active-boot-slot 0
将把另外一个 slot 0 (A 槽位)设置为下次启动。
相当于通过 fastboot 执行命令:
fastboot set_active a
6. set-slot-as-unbootable
set-slot-as-unbootable 将相应的 slot 标记为无效。
下面的命令将 slot 0(A 槽位) 标记为无效,不可启动:
console:/ # bootctl set-slot-as-unbootable 0
7. is-slot-bootable
is-slot-bootable 命令查看指定的 slot 是否可以启动
当指定的 slot 可以启动时返回 0,在 console 上显示为命令正常退出。
当指定的 slot 不可启动时,在 console 上显示为命令异常退出。
console:/ # bootctl is-slot-bootable 1
console:/ # bootctl is-slot-bootable 0
70|console:/ #
在上面的命令中,slot 1 可以正常启动(命令正常结束),但 slot 0 不能启动(命令异常退出)
8. is-slot-marked-successful
is-slot-marked-successful 返回相应的 slot 是否被标记为成功启动
当指定的 slot 被标记为成功启动时返回 0,在 console 上显示为命令正常退出。
当指定的 slot 没有被标记为成功启动时,在 console 上显示为命令异常退出。
console:/ # bootctl is-slot-marked-successful 1
console:/ #
console:/ # bootctl is-slot-marked-successful 0
70|console:/ #
这里的执行结果显示,slot 1 已经被标记为成功启动,slot 0 没有被标记为成功启动。
9. get-suffix
get-suffix 返回指定 slot 的后缀
console:/ # bootctl get-suffix 0
_a
console:/ # bootctl get-suffix 1
_b
这里显示系统两个 slot (槽位)的后缀分别为 _a 和 _b。
10. set-snapshot-merge-status
set-snapshot-merge-status 设置系统当前的 merge status,Android 11 以后适用。
操作的有效值包括: none, unknown, snapshotted, merging 和 cancelled。
console:/ # bootctl get-snapshot-merge-status
none
console:/ # bootctl set-snapshot-merge-status unknown
console:/ # bootctl get-snapshot-merge-status
unknown
console:/ # bootctl set-snapshot-merge-status cancelled
console:/ # bootctl get-snapshot-merge-status
cancelled
console:/ # bootctl set-snapshot-merge-status active
bootctl - command-line wrapper for the boot HAL.Usage:bootctl COMMANDCommands:hal-info - Show info about boot_control HAL used.get-number-slots - Prints number of slots.get-current-slot - Prints currently running SLOT.mark-boot-successful - Mark current slot as GOOD.set-active-boot-slot SLOT - On next boot, load and execute SLOT.set-slot-as-unbootable SLOT - Mark SLOT as invalid.is-slot-bootable SLOT - Returns 0 only if SLOT is bootable.is-slot-marked-successful SLOT - Returns 0 only if SLOT is marked GOOD.get-suffix SLOT - Prints suffix for SLOT.set-snapshot-merge-status STAT - Sets whether a snapshot-merge of any dynamicpartition is in progress. Valid STAT valuesare: none, unknown, snapshotted, merging,or cancelled.get-snapshot-merge-status - Prints the current snapshot-merge status.SLOT parameter is the zero-based slot-number.
64|console:/ #
上面的最后一个操作中,试图将 merge status 设置为无效值 active 失败。
11. get-snapshot-merge-status
get-snapshot-merge-status 获取当前系统的 merge status,Android 11 以后适用。
console:/ # bootctl get-snapshot-merge-status
none
4. 思考题
IBootContol 定义的 HAL 接口在几个地方实现并被使用。
-
Android 主系统中实现 IBootControl 接口,通过 BootControl Service 向上层提供服务,包括 Update Engine 和这里的 bootctl 工具。
-
bootloader 中实现 IBootControl 相应的结构,用于在 bootloader 中操作 IBootControl 在外部设备(flash, eMMC) 上存放的数据(通常是 misc 分区)
fastboot 工具的一些 slot 相关操作也是通过 bootloader 实现的 IBootControl 接口来工作的。
现在问题来了,你知道于 bootctl 工具命令对应的 fastboot 命令吗?
5. 其它
到目前为止,我写过 Android OTA 升级相关的话题包括:
- 基础入门:《Android A/B 系统》系列
- 核心模块:《Android Update Engine 分析》 系列
- 动态分区:《Android 动态分区》 系列
- 虚拟 A/B:《Android 虚拟 A/B 分区》系列
- 升级工具:《Android OTA 相关工具》系列
更多这些关于 Android OTA 升级相关文章的内容,请参考《Android OTA 升级系列专栏文章导读》。
如果您已经订阅了动态分区和虚拟分区付费专栏,请务必加我微信,备注订阅账号,拉您进“动态分区 & 虚拟分区专栏 VIP 答疑群”。我会在方便的时候,回答大家关于 A/B 系统、动态分区、虚拟分区、各种 OTA 升级和签名的问题。
除此之外,我有一个 Android OTA 升级讨论群,里面现在有 400+ 朋友,主要讨论手机,车机,电视,机顶盒,平板等各种设备的 OTA 升级话题,如果您从事 OTA 升级工作,欢迎加群一起交流,请在加我微信时注明“Android OTA 讨论组”。此群仅限 Android OTA 开发者参与~
公众号“洛奇看世界”后台回复“wx”获取个人微信。
相关文章:
Android OTA 相关工具(三) A/B 系统之 bootctl 工具
文章目录1. bootctl 的编译2. bootctl 的帮助信息3. bootctl 的用法1. hal-info2. get-number-slots3. get-current-slot4. mark-boot-successful5. set-active-boot-slot6. set-slot-as-unbootable7. is-slot-bootable8. is-slot-marked-successful9. get-suffix10. set-snaps…...
【Flink】org.apache.flink.table.api.ValidationException: SQL validation failed
遇到问题如下 Exception in thread "main" org.apache.flink.table.api.ValidationException: SQL validation failed. From line 1, column 15 to line 1, column 17: Object aaa not found at org.apache.flink.table.planner.calcite.FlinkPlannerImpl.orgat org.…...
宏基因组鉴定病毒流程中需要的生物信息工具
谷禾健康 许多流行病的爆发都是病毒引起的,面对新的传染性基因组出现的最佳策略是及时识别,以便于在感染开始时立即实施相应措施。 目前可用的诊断测试仅限于检测新的病理因子。适用于同时检测存在的任何病原体的高通量方法可能比使用基于当前方法的大量…...
Doris入门篇-分区分桶实验
简介 测试分区分桶效果。 分区的基本操作 添加分区 ALTER TABLE v2x_olap_database.government_car ADD PARTITION p20221203 VALUES LESS THAN ("2022-12-04");动态分区表不能添加分区,需要转为手动分区表。 查看分区 show partitions from <表…...
Spring-Xml配置
一、Spring 简介 1.简介 文档下载地址:Index of /spring-framework/docs 1.简介 Spring framework 是 Spring 基础框架 学习Spring 家族产品 Spring framework SpringBoot SpringCloud Spring 能用来做什么 开发 WEB 项目 微服务 分布式系统 Spring framew…...
设计模式-工作线程 创建多少线程池合适
1、定义 让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现就是线程池,也体现了经典设计模式中的享元模式(重用对象)。 例如,海底捞的服务员(线程),轮流…...
【算法基础】深度优先搜索(DFS) 广度优先搜索(BFS)
一、DFS & BFS 1. 深度优先搜索DFS 深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。 2. 广度优先搜索BFS 广度优先搜索较之深度优先搜索之不同在于,深度…...
【分布式】ProtocolBuffer平滑升级原则
原文链接:https://blog.csdn.net/nash_cyk/article/details/99549719 关于Protocol Buffer优势这里就不详细介绍了,如便于不同开发语言的交互通信,便于服务器上线的平滑升级等。 但Protocol Buffer的Message协议升级是需要注意一些细节&…...
第四阶段17-关于Redis中的list类型,缓存预热,关于Mybatis中的`#{}`和`${}`这2种格式的占位符
关于Redis中的list类型 Redis中的list是一种先进后出、后进先出的栈结构的数据。 在使用Redis时,应该将list想像为以上图例中翻转了90度的样子,例如: 在Redis中的list数据,不仅可以从左侧压入,也可以选择从右侧压入…...
stringstream用法
stringstream是 C++ 提供的另一个字串型的串流(stream)物件,和之前学过的iostream、fstream有类似的操作方式。包含在头文件sstream中(#include <sstream>)。 实例: 1、C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类…...
2022年下半年系统集成项目管理工程师综合知识真题及答案解析
2022年下半年系统集成项目管理工程师综合知识真题及答案解析 1、()不属于“提升云计算自主创新能力”的工作内容。A.加强云计算相关基础研究、应用研究、技术研发、市场培育和产业政策密衔接与统筹协调B.引导大型云计算中心优先在能源充足、气候适宜、自然灾害较少的地区部…...
【洛谷 P2089】烤鸡(搜索)
烤鸡 题目背景 猪猪 Hanke 得到了一只鸡。 题目描述 猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 101010 种配料(芥末、孜然等)…...
Mac item2 配置免密登录开发机
1、配置 vi ~/.ssh/config 内容如下: Host * ControlMaster auto ControlPath ~/.ssh/master-%r%h:%p ControlPersist yes ServerAliveInterval 60 学习: ControlMaster #连接共享 ControlPath #与ControlMaster一起使用,指定连接共享的路径…...
vue 解决问题:Webpack安装不成功,webpack -v无法正常显示版本号
目录 一、解决问题:Webpack安装不成功,webpack -v无法正常显示版本号 二、解决问题: ERROR Error: Cannot find module webpack-log 三、 解决报错:error:03000086:digital envelope routines::initialization error 四、解决…...
07-1【openEuler】系统及进程管理(网络管理的补充实验及说明)
文章目录说在前面关于nmcli命令的使用使用nmcli命令修改主机IP地址1、运行ip addr列出openEuler20.03上的以太网卡2、列出当前活动的以太网卡3、开始分配静态IP地址(1)命令语法(2)将 IPv4 地址192.168.74.175分配给 ens33 网卡上&…...
【Linux】磁盘结构、文件系统、软硬链接、动静态库链接
文章目录1、磁盘结构1.1 磁盘的物理结构1.2 磁盘的存储结构1.3 磁盘的逻辑结构2、文件系统2.1 4KB加载到内存2.2 文件系统结构3、软硬链接3.1 软链接3.2 硬链接4、动静态库4.1 什么是库?4.2 静态库和静态库链接4.3 动态库和动态库链接4.4 动静态库的加载下面了解到&…...
交换机电口、光口、网络速率的基本概念总结
电口和光口千兆网 & 万兆网:POE:包转发率:背板带宽/交换容量:)电口和光口 电口: 电口也即RJ45口,插双绞线的端口(网线),一般速率为10M或100M,即为百兆工…...
【面试题 05.02. 二进制数转字符串】
来源:力扣(LeetCode) 描述: 二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示࿰…...
webpack - webpack的基本使用和总结
文章目录1,webpack概念2,为什么学webpack3,webpack特点4,相对于其他工具优点5,准备工作6,webpack的核心介绍7,webpack使用 - 打包js代码8,打包css代码9,生成html文件10&a…...
【蓝桥杯嵌入式】定时器实现按键单击,双击,消抖以及长按的代码实现
🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…...
微型环境传感器技术:PM2.5与VOC检测的突破与应用
1. 个人空气质量监测的技术革命在深圳的一个典型工作日早晨,张工程师像往常一样准备出门上班。他习惯性地查看手机上的空气质量指数,发现室外PM2.5数值高达85μg/m(超过WHO安全标准3倍以上)。犹豫片刻后,他戴上了N95口…...
手把手教你搞定Sx1262射频前端:从天线匹配到LPF滤波的完整电路设计(附PCB布局建议)
手把手教你搞定Sx1262射频前端:从天线匹配到LPF滤波的完整电路设计(附PCB布局建议) 在物联网设备开发中,射频前端设计往往是硬件工程师最头疼的环节之一。特别是使用Semtech的Sx1262这类LoRa芯片时,一个设计不当的射频…...
为什么92%的团队用错Gemini做Slides?——基于17家SaaS公司实测数据的生成效率断层分析
更多请点击: https://intelliparadigm.com 第一章:Gemini生成Slides的底层机制与能力边界 Gemini 生成幻灯片(Slides)并非简单地将文本转为 PPT 页面,而是依托多模态大模型对语义结构、视觉层级与演示逻辑的联合建模。…...
好用的AI软件开发选哪家
在当今数字化飞速发展的时代,AI软件已经成为众多企业和个人提升效率、创新业务的重要工具。然而,面对市场上众多的AI软件开发公司,如何选择一家靠谱且好用的公司成为了许多人的困扰。今天,我就为大家推荐广州飞进信息科技有限公司…...
SoC早期流片策略:风险控制与工程实践深度解析
1. 早期流片的风险与回报:一次深度权衡在系统级芯片开发这个行当里干了十几年,验证始终是悬在每个项目团队头顶的达摩克利斯之剑。面对动辄数亿门级、集成数十个异构核心的复杂SoC,想要在流片前达到“万无一失”的验证覆盖率,所需…...
如何高效解密华为光猫配置文件:终极操作指南
如何高效解密华为光猫配置文件:终极操作指南 【免费下载链接】HuaWei-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/hu/HuaWei-Optical-Network-Terminal-Decoder 还在为无法读取华为光猫加密配置文件而烦恼吗?网…...
硬件工程师必读:九大核心算法如何重塑芯片与系统设计
1. 项目概述:一次关于算法之美的深度阅读作为一名在电子工程和数字设计领域摸爬滚打了十几年的工程师,我的日常工作就是和FPGA、ASIC、各种EDA工具以及层出不穷的硬件描述语言打交道。我们这行,天天谈的是时序收敛、功耗优化、面积利用&#…...
算法创新驱动AI效率革命:算力增强型进步如何超越摩尔定律
1. 项目概述:算法进步如何重塑计算机视觉的效率版图如果你在2012年告诉一个计算机视觉研究员,十年后我们能在ImageNet上训练出准确率超过90%的模型,他可能会觉得这需要天文数字般的计算资源。但现实是,我们不仅做到了,…...
SAR ADC性能优化:电压基准设计与THD改善方案
1. 电压基准对SAR ADC性能的影响机制在精密数据采集系统设计中,工程师们常常花费大量精力选择高性能的模数转换器(ADC)和优化输入驱动电路,却容易忽视一个关键因素——电压基准的质量及其驱动能力。对于逐次逼近型(SAR)ADC而言,基准电压的稳定…...
基于Claude的智能代码脚手架:提升AI编程协作效率的工程实践
1. 项目概述:一个为Claude设计的代码脚手架如果你和我一样,经常与Anthropic的Claude模型打交道,尤其是在代码生成、项目初始化这类场景,那你一定体会过那种“重复造轮子”的疲惫感。每次开启一个新项目,无论是简单的脚…...
