<Android开发> Android vold - 第一篇 vold前言简介

本系列主要介绍 Android vold,分为以下篇章
<Android开发> Android vold - 第一篇 vold前言简介
<Android开发> Android vold - 第二篇 vold 的main()函数简介
<Android开发> Android vold - 第三篇 vold 的NetLinkManager类简介

本次主要讲解存储模块如U盘等设备在android设备中的管理和使用的模块。本次主要基于android 8.1版本进行解析。不同android版本 vold的内容可能会有所差异。读者可对比阅读解析。

1 Vold介绍
Android中Vold是volume Daemon,即Volume守护进程;Android没有使用Linux平台下的udev来处理磁盘,于是Google写了一个类似udev功能的vold,充当了kernel与framework之间的桥梁;作为Android的一个本地服务,负责处理诸如SD、USB等存储类设备的插拔等事件。

  1. 手机usb以MTP或者传输照片方式插拔PC端后磁盘数据的挂卸载;
  2. 设备开关机过程中存储设备各分区的挂卸载;
  3. TF卡插拔识别过程中文件系统挂卸载。
    在各场景做mount过程中,涉及到的磁盘数据的安全加密(FDE/FBE),文件节点与目录的创建,文件系统的垃圾清理等模块,也由Vold进行控制。

2 Vold架构
Vold在系统中以守护进程存在,是一个单独的进程,下一节会介绍Vold的启动流程。处于Kernel和Framework之间,是两个层级连接的桥梁。下图是Vold在Android系统的整体架构。
在这里插入图片描述

Vold主要是接收Kernel的uevent消息,然后NetLinkManager将消息放在NetLinkHandler队列送到VolumeManager,最终将消息传递到Framework的StorageManager。最后StorageManager会将数据存储下来,消息通知到在StorageManager注册的service与应用。

3 vold启动流程
Vold在系统中以守护进程存在,所以在android启动时调用init.rc会去启动。
以下以android 8.1为例对具体源码说明。
android的init.rc启动vold的调用如下:
路径:LINUX/android/system/core/rootdir/init.rc

在这里插入图片描述

在Android 系统启动的时候,init进程会去解析init.rc文件,在init.rc中有start vold的命令会被init解析到,而start对应的函数do_start(constBuiltinArguments& args);即启动对应的service,service再解析vold.rc 文件 对Vold做一些初始化配置。

vold.rc 文件路径内容入下:
路径:LINUX/android/system/vold/vold.rc
在这里插入图片描述

在rc文件调用启动vold进程服务后,最先运行的当然是main()函数了。接下来看看vold 服务的main函数。
现在做个相关涉及的方法类的了解;
首先,kernel监测到U盘等存储设备,会产生一个uevent事件。
而vold 服务内有一个NetlinkManager类,该类会建立一个socket,来监测所有的uevent事件最后会new一个NetlinkHandler对象,并执行start函数。然后调用NetlinkListener父类的startListener函数去监听event。
vold服务还有另外一个VolumeManager类,对Framework或kernel传来的消息处理,kernel的uevent需要通过NetlinkManager类,然后给到VolumeManager类。Framework的数据则是通过CommandListener类,再给到VolumeManager类。
VolumeManager类,主要负责收发与Framework通信的数据。所以整个Vold涉及的大类包括VolumeManager、CommandListener、NetlinkHandler;其中每个类由继承了其它的父类。后续讲解每一个部分都会详细介绍。
知道了涉及的这类方法/类之后,我们就来看看具体的代码内容吧。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于C++的Vold-Kalman滤波器的代码示例: ```c++ #include <iostream> #include <vector> #include <eigen3/Eigen/Dense> using namespace Eigen; int main() { // 初始化变量和参数 int n = 2; // 状态维度 int m = 1; // 观测维度 double dt = 0.1; // 时间间隔 Matrix<double, 2, 2> A; // 系统矩阵 A << 1, dt, 0, 1; Matrix<double, 1, 2> H; // 观测矩阵 H << 1, 0; Matrix<double, 2, 2> Q; // 系统噪声协方差矩阵 Q << 1, 0, 0, 1; Matrix<double, 1, 1> R; // 观测噪声协方差矩阵 R << 1; Matrix<double, 2, 2> P; // 状态协方差矩阵 P << 1, 0, 0, 1; Matrix<double, 2, 1> x; // 状态向量 x << 0, 0; Matrix<double, 1, 1> z; // 观测向量 z << 0; // 模拟数据 int num_samples = 100; std::vector<double> true_pos(num_samples); std::vector<double> measured_pos(num_samples); std::vector<double> filtered_pos(num_samples); double v = 1; true_pos[0] = 0; measured_pos[0] = true_pos[0] + sqrt(R(0, 0)) * randn(); filtered_pos[0] = measured_pos[0]; for (int i = 1; i < num_samples; i++) { true_pos[i] = true_pos[i-1] + v * dt; measured_pos[i] = true_pos[i] + sqrt(R(0, 0)) * randn(); // 预测 x = A * x; P = A * P * A.transpose() + Q; // 更新 z << measured_pos[i]; Matrix<double, 1, 1> y = z - H * x; Matrix<double, 1, 2> S = H * P * H.transpose() + R; Matrix<double, 2, 1> K = P * H.transpose() * S.inverse(); x = x + K * y; P = (Matrix<double, 2, 2>::Identity() - K * H) * P; filtered_pos[i] = x(0, 0); } // 输出结果 for (int i = 0; i < num_samples; i++) { std::cout << "True position: " << true_pos[i] << ", " << "Measured position: " << measured_pos[i] << ", " << "Filtered position: " << filtered_pos[i] << std::endl; } return 0; } ``` 其中,`randn()` 是一个标准正态分布随机数生成函数,可以使用 C++11 中的 `<random>` 库实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

waterfxw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值