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 STAT
get-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…...
【蓝桥杯嵌入式】定时器实现按键单击,双击,消抖以及长按的代码实现
🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…...
基于SSM的Javaweb爱心扶贫捐赠系统
文章目录 项目介绍主要功能截图:后台登录首页个人中心用户管理扶贫物资管理扶贫产品管理留言板管理前台前台首页扶贫产品新闻资讯留言板部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,…...
Spring Cloud(微服务)学习篇(三)
Spring Cloud(微服务)学习篇(三) 1 nacos中使用openFeign(调用方式)实现短信发送 1.1 在shop-sms-api中创建com.zlz.shop.sms.api.service/vo/dto/util,目录结构如下所示 1.2 在pom.xml(shop-sms-api)中加入如下依赖 <dependencies><dependency><groupId>…...
一文带你吃透JSP,增删改查实战案例详细解读
文章目录前言JSP 概述JSP快速入门搭建环境导入JSP依赖创建 JSP 页面编写代码测试JSP原理JSP 脚本实战案例JSP缺点发展阶段EL 表达式概述实战案例域对象JSTL 标签用法1用法2前言 不得不说,JSP 现在已经是一门十分老旧的技术了,学习编程时,不仅…...
taobao.item.propimg.upload( 添加或修改属性图片 )
¥开放平台基础API必须用户授权 添加一张商品属性图片到num_iid指定的商品中 传入的num_iid所对应的商品必须属于当前会话的用户 图片的属性必须要是颜色的属性,这个在前台显示的时候需要和sku进行关联的 商品属性图片只有享有服务的卖家(如&a…...
TDEngine集群监控组件安装配置(Telegra+Grafana方案)
Tdengine的监控指标包括以下几个方面: 系统指标:CPU使用率、内存使用率、磁盘空间、网络流量等。数据库指标:连接数、查询数、写入数、读取数等。SQL指标:执行时间、执行计划、索引使用情况等。集群指标:节点状态、数…...
【定位】高德地图wifi定位接口使用效果实践
高德地图wifi定位接口使用效果实践 背景 目的是基于高德地图wifi定位接口实现在高德地图上展示终端设备的位置和轨迹。 原理 为了将原理阐述的稍微直白一点,特意使用UML图表产生下面的一个序列图: #mermaid-svg-iHgWizHiUSRqCWdF {font-family:"trebuchet ms",…...
Nacos注册中心
目录 认识和安装Nacos 启动方式 Nacos快速入门 提示 Nacos服务分级存储模型 服务跨集群调用问题 管理端设置策略 总结 Nacos环境隔离 如何创建 使用方式 编辑 总结 Nacos注册中心分析 临时实例和非临时实例 定义 配置方式 总结 认识和安装Nacos Nacos是Sp…...
Liunx常用命令总结
常用命令arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo …...
MySQL表的增删查改(进阶)
所有操作:主要讲了数据库的约束,表之间的关系,新增,聚合查询,联合查询等内容。是一篇博客所有操作的记录。 844d186 风夏/mysql_learning - Gitee.com数据库约束1.1 约束条件not null -指定某个列不能储存null值。un…...
【RocksDB】Ubuntu20.04下编译rocksdb
前言: 我在刚学rocksdb的时候是在2022年,但是网上的资源很少,查了好久才把rocksdb安装成功,在这里向大家分享一下我的经历,安装过程中也报了很多错误,希望大家不要迷路 首先 在虚拟机里面安装依赖的包以…...
西城网站建设浩森宇特/seo系统培训
本文引用文章如链接: http://www.codinglabs.org/html/theory-of-mysql-index.html#more-100 参考书籍:Mysql技术内幕 本文主要是阐述mysql索引机制,主要是说明存储引擎Innodb 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理…...
网站制作论文总结/网络营销运营
在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel传输到另外一个channel。 transferFrom() FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(这个方法在JDK文档中的解释为将字节从给…...
安全联盟这种网站建设/市场营销七大策略
本篇文章给大家带来的内容是关于mysql中delete from where子查询的限制介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。1、使用mysql进行delete from操作时,若子查询的 FROM 字句和更新/删除对象使用同一张表…...
magazine wordpress主题/网络推广与网络营销的区别
致谢:感谢看雪论坛的MindMac大神提供的资料:http://bbs.pediy.com/thread-194206.htm一、前言 今天又是周六了,闲来无事,只能写文章了呀,今天我们继续来看逆向的相关知识,我们今天来介绍一下Android中的And…...
成都网站建设外包/青岛网站优化公司哪家好
AndroidAnnotations是如何工作的 (2014年2月 By Hiperion) AndroidAnnotations工作在一个非常简单的方式。它会使用标准的Java注解处理工具自动添加一个额外的编译步骤生成的源代码。(译者注:即生成一个原有类名加“_”的类,这个…...
做网站能创业吗/怎样做一个自己的网站
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译《汇编语言基于Linux环境》的书,喜欢看原版书的同学可以看《Assembly Language Step-By-Setp:Programming with Linux 3rd Edition》,非常感谢该…...