A/B 系统之 bootctl 工具

news/2025/1/8 23:29:19/文章来源:https://www.cnblogs.com/linhaostudy/p/18660780

A/B 系统之 bootctl 工具

分别介绍了调试动态分区和虚拟 A/B 分区最常用的工具 snapshotctl 和 dmctl,这一篇介绍 bootctl(boot control),一个专门用于设置 BootControl HAL 接口的工具。

这个工具最常用的地方就是在 Android 系统命令行下用来检查 A/B 系统的槽位状态以及切换系统。

我最早在 《Android A/B System OTA分析(三)主系统和bootloader的通信》 介绍过基本用法,本篇则对这个工具进行详细介绍。

1. bootctl 的编译

默认情况下 bootctl 不会编译进系统,需要在 device 目录下相应的 makefile 中将 bootctl 添加到 PRODUCT_PACKAGES 变量中。

不清楚如何添加就在 device 目录下执行 grep 命令看下 google 的参考设备是如何添加的。

例如,在 Android 11 上的 crosshatch 设备,bootctl 被包含在 PRODUCT_PACKAGES_DEBUG 中,如下:

# 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

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 命令吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/866139.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MarkDown使用方法

Markdown学习 标题 三级标题 四级标题 字体 Hello,World! Hello,World! Hello,World! Hello,World! 引用好好学习,天天向上分割线图片超链接 [点击跳转到csdn](CSDN - 专业开发者社区) 列表A B CA B C表格名字 性别 生日张三 男 1997.1.1代码 public

1.5 电源模块散热的处理

掌握电源模块散热的处理 电源模块的散热设计对于确保电子设备的性能和可靠性至关重要。由于电源模块在转换电能的过程中会产生热量,如果不合理处理散热,可能会导致模块过热,从而影响其工作效率、使用寿命,甚至导致系统故障。以下是电源模块散热处理的一些关键原则和方法: …

1.4 覆铜宽度和电流大小之间的关系,掌握过孔大小与数量与电流大小的关系

覆铜宽度和电流大小之间的关系,掌握过孔大小与数量与电流大小的关系 在 PCB(印刷电路板)设计中,覆铜宽度和过孔的大小与电流处理能力之间的关系是非常重要的。这些因素直接影响到电路的安全性、性能和热管理能力。以下是关于覆铜宽度、电流大小、过孔大小与数量与电流之间关…

1.3 什么是反馈电路, 反馈的摆放方法及布线取样点的设置

什么是反馈电路, 反馈的摆放方法及布线取样点的设置 反馈电路的概念 反馈电路是一种通过输出信号的信息返回到输入端,以调节或控制电路性能的系统。在电子电路中,反馈可以用来增强系统的稳定性、改善线性度、提高增益、降低失真等。反馈电路可以分为两种主要类型:正反馈:输…

解决方案 | aardio 实现界面自动缩放,控件随之变换

只需要把所有控件设置为 自适应大小true,固定边距禁用全部即可。网上说的花里胡哨,没个准信

Vue 组件内守卫

1、顺序 2、位置 组件内部 3、语法 beforeRouteEnter 通过路由规则,进入该组件时被调佣 beforeRouteLeave通过路由规则,离开该组件时被调用 注意:通过组件引入不被调用beforeRouteEnter (to, from, next) {// ...console.log(beforeRoueEnter)next() }, beforeRouteLeave (t…

电源输入输出主干道的分析思路, 如何阅读Datasheet的Layout Guide方法

电源输入输出主干道的分析思路, 如何阅读Datasheet的Layout Guide方法 分析电源输入输出主干道和阅读Datasheet中的Layout Guide是电子设计中非常重要的技能。以下是关于这两个主题的详细介绍和分析思路。 一、电源输入输出主干道的分析思路 电源输入输出主干道是指连接电源输入…

判断推理学习笔记

判断推理四大题型①图形推理(难)8/10 ②类比推理 ③定义判断(10道,不要超过10分钟) ④逻辑推理(难) 图形推理的命题形式 一组图 两组图(前组找规律,后组应用规律) 九宫格(90%横着看,找规律,验证规律,应用规律;10%竖着看;米字看;S) 分组分类(三三一组) 空间…

MemoryAnalyzerTool(mat)分析dump文件

一、常见需要分析dump文件场景 1.1 fullGC频繁1.2 堆空间溢出1.3 元空间溢出二、准备工具 能分析dump文件的工具很多比如Java自带的jvisualvm、商业软件Jprofile、mat(MemoryAnalyzerTool)、IDEA等,其他软件都需要将dump文件下载到本地分析,当dump文件很大的时候不方便,ma…

DCDC_LDO模块

DCDC/LDO模块 DC-DC 模块和 LDO(线性稳压器)模块是两种常用的电源管理解决方案。它们在电源转换和调节中各有特点和适用场景。以下是对这两种模块的详细介绍,包括它们的工作原理、优缺点、应用场景以及设计考虑。 一、DC-DC 模块 1. 工作原理 DC-DC 转换器通过高频开关元件(…

代码精简之路-模板模式

1. 前言 程序员怕重复CRUD,总是做一些简单繁琐的事情。“不要重复造轮子”,“把基础功能提炼出来封装成工具类” 我喜欢把这些话挂在嘴边,写起来常不知从何下手。 下面拆解一个项目中的功能。记录从复制粘贴到对业务抽象、实现功能分层的详细过程。如何着手提升代码重构优化…

覆铜宽度和电流大小之间的关系,掌握过孔大小与数量与电流大小的关系

覆铜宽度和电流大小之间的关系,掌握过孔大小与数量与电流大小的关系 在 PCB(印刷电路板)设计中,覆铜宽度和过孔的大小与电流处理能力之间的关系是非常重要的。这些因素直接影响到电路的安全性、性能和热管理能力。以下是关于覆铜宽度、电流大小、过孔大小与数量与电流之间关…