IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Fastbootd实现原理分析 -> 正文阅读

[移动开发]Fastbootd实现原理分析

前言

fastboot是一种用于Android设备上的刷机协议,便于系统开发者快速烧录系统。随着AOSP的发展,谷歌在Android Q版本引入了super动态分区功能,实现system、vendor和product等分区大小的灵活配置,避免了系统升级带来频繁修改分区表的问题。同时引入了手机端侧fastboot模式实现super分区的擦写,之前版本的fastboot刷写功能通常实现在bootloader模式(一般由SOC厂家提供原始实现),新引入的fastboot模式实现在recovery系统中集成了fastbootd二进制程序,在recovery系统中可复用系统的usb、网络等驱动,降低了开发难度,具有更好的可移植性(目前各个厂家的bootloader方案各有不同),一定程度降低了厂家的工作量。

一、源码&编译

源码路径

手机端fastbootd源码路径:system/core/fastboot/device

Host端fastboot源码路径:system/core/fastboot

在system/core/fastboot目录下mm即可编译生成fastbootd和Host端使用的fastboot工具。

二、fastboot模式启动过程

启动流程图

adb/bootloader模式下reboot-fastboot。

相关代码

1. 执行adbreboot-fastboot

?adb新增对命令reboot-fastboot的支持。

system/core/adb/daemon/services.cpp

2. 设置属性sys.powerctl=fastboot

调用reboot命令设置属性sys.powerctl=fastboot,触发init进程执行action::powerctl。

system/core/reboot/reboot.c

init.rc1

3. 写入bootloader_message后重启

init进程将reboot-reason写入bootloader_message后重启系统。

system/core/init/reboot.cpp


4. 重启后进入recovery系统

重启进入recovery系统后,recovery程序读取bootloader_message,属性sys.usb.config先后设置为none和fastboot。

recovery_main.cpp


5. 启动fastbootd进程

init进程在属性sys.usb.config=none时清除usb的ffs配置,sys.usb.config=fastboot时配置usb的ffs为fastboot模式,生成fastboot对应的读写endpoint设备,用于和PC端的fastboot协议数据读写。

init.rc

  • ?fastboot模式下fastbootreboot recovery可切换到recovery模式(启动adb,关闭fastbootd)而不需要重启。

  • ?PC端fastboot从r28.0.1之后开始支持reboot-fastboot命令,adb从r28.0.2之后开始支持reboot-fastboot命令。

  • fastbootd与recovery进程的关系和update_binary与recovery进程的关系类似,前者负责flash擦写逻辑的实现,后者负责UI的实现。



三、fastboot通信过程


fastboot协议

cmd:arg1......

例如reboot、flash:boot、erase:boot、oem:unlock、getvar:product、download:size等。

如上图所示,fastboot协议不仅可以通过usb实现,也可以通过网络的方式实现。


flash命令执行过程

动态分区

在super分区头部存在metadata数据结构记录system、vendor、product等分区的位置和大小,结构如下图所示。

通常将boot、userdata、cache等称为物理分区,super分区中的system、vendor、product等称为逻辑分区。

fastbootd中支持create-logical-partition/delete-logical-partition/resize-logical-partition三个命令主动创建super分区上的逻辑分区。

fastboot delete-logical-partitionsystemfastboot create-logical-partitionsystem 1073741824

fastboot resize-logical-partition system 4294967296
fastboot flash system system.img

按照上述方式刷机成功后,重启进入Android系统,在init的first_stage阶段生成对应的dm设备并挂载:

main()->FirstStageMain() -->DoFirstStageMount()-->InitDevices()-->MountPartitions()-->CreateLogicalPartitions()-->CreateDevice()

init在first_stage阶段读取fstab配置

依据fstab配置创建super的逻辑分区

主要通过控制/dev/device-mapper,创建dm设备,加载super分区的metadata的table数据(分区的名字、偏移和大小等)传递给DeviceMapper驱动生产对应的/dev/dmX设备。具体的LinuxDeviceMapper实现机制,这里不详细介绍,请参见《DeviceMapper架构及在android上的应用》。


四、小结

目前用户空间的fastbootd作为fastboot协议中的服务端覆盖了所有fastboot原生命令,fastboot和recovery共享内核和库,基于usbgadget、block等linux驱动实现了协议通信和flash设备的读写等功能。对于OEM命令,Google也设计了对应OEMHAL(android.hardware.fastboot@1.0-service)兼容各自的私有命令,同时方便开发者在各个版本之间快速移植。基于用户空间下fastbootd的高可移植性、linux运行环境等特点,用户空间下的fastbootd可能会逐渐替代引导程序实现fastboot的方式,而引导程序只保留各自SOC的线刷功能。

长按关注

内核工匠微信

Linux 内核黑科技 | 技术文章 | 精选教程

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 11:48:06  更:2021-07-25 11:49:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/19 4:23:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码