Android-vold源码分析
### Android-vold源码分析:理解U盘挂载机制 在深入探讨Android系统如何通过`vold`(Volume Daemon)管理U盘等外部存储设备的挂载与卸载之前,我们先简要介绍`vold`的角色。`vold`是Android系统中负责管理存储卷的守护进程,它不仅处理内部存储,还处理外部存储设备,如SD卡或U盘的挂载、卸载等操作。其核心功能之一是监听并响应内核发送的块设备事件,从而实现对外部存储设备的有效管理和访问。 #### 核心处理函数:`handleBlockEvent` `handleBlockEvent`函数是`vold`中的关键函数,用于接收并解析内核发出的块设备事件。这些事件可以是设备的添加、删除或状态改变。根据不同的事件类型,`handleBlockEvent`将调用相应的处理函数,包括: 1. **`handleDiskAdded`**:当检测到新磁盘(如U盘)的添加时被调用。 2. **`handleDiskRemoved`**:当磁盘被移除时调用。 3. **`handleDiskChanged`**:当磁盘的状态发生改变时调用。 4. **`handlePartitionAdded`**:当检测到新的分区被添加到已存在的磁盘上时调用。 5. **`handlePartitionRemoved`**:当分区从磁盘上被移除时调用。 6. **`handlePartitionChanged`**:当分区的状态发生变化时调用。 #### `handleDiskAdded`函数详解 当U盘插入时,`handleDiskAdded`函数被调用,负责收集关于新磁盘的基本信息,如主设备号(major)、次设备号(minor)以及分区数量(`NPARTS`)。这些信息对于后续识别和处理磁盘的各个分区至关重要。 - **主设备号和次设备号**:这两个参数用于唯一标识Linux系统中的设备,特别是在`/dev`目录下,每一个设备文件都有一个主次设备号组合,用以区分不同类型的硬件设备。 - **分区数量(`NPARTS`)**:表示磁盘上的分区总数,这在处理多分区磁盘时尤为重要,因为它帮助`vold`预知后续会有多少个`handlePartitionAdded`调用。 #### 存储设备识别顺序 `handleDiskAdded`函数执行后,`vold`将开始处理该磁盘上的各个分区。这个过程遵循一定的顺序:首先调用一次`handleDiskAdded`以获取磁盘级别的信息,然后对每个分区调用`handlePartitionAdded`。如果磁盘上有多个分区,包括可能的一个扩展分区(MBR限制为最多四个主分区),则`handlePartitionAdded`将被调用多次,直到所有分区都被正确识别和处理。 #### `mPendingPartsCount`变量的作用 `mPendingPartsCount`是一个全局变量,用于跟踪待处理的分区数量。在`handleDiskAdded`调用后,该变量被初始化为`mDiskNumParts`(即磁盘的分区数量)。随着每个分区的识别,`mPendingPartsCount`递减,直到所有分区都处理完毕,此时`mPendingPartsCount`应为0,表明该存储设备的所有事件已经完成处理。 #### 结论 通过深入分析`vold`源码中的`handleBlockEvent`及其相关函数,我们能够更好地理解Android系统是如何高效地管理和响应外部存储设备的插入与移除事件的。`vold`通过一系列精心设计的函数调用,确保了设备的快速识别和正确的挂载流程,为用户提供无缝的使用体验。对于希望深入研究Android系统底层存储管理的开发者而言,掌握`vold`的工作原理和其实现细节是至关重要的。
- cj831112013-01-21缺前面几章。
- 粉丝: 7
- 资源: 12
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 阿里云OSS Java版SDK.zip
- 阿里云api网关请求签名示例(java实现).zip
- 通过示例学习 Android 的 RxJava.zip
- 通过多线程编程在 Java 中发现并发模式和特性 线程、锁、原子等等 .zip
- 通过在终端中进行探索来学习 JavaScript .zip
- 通过不仅针对初学者而且针对 JavaScript 爱好者(无论他们的专业水平如何)设计的编码挑战,自然而自信地拥抱 JavaScript .zip
- 适用于 Kotlin 和 Java 的现代 JSON 库 .zip
- yolo5实战-yolo资源
- english-chinese-dictionary-数据结构课程设计
- mp-mysql-injector-spring-boot-starter-sql注入