android /system/vold源码分析(1)

本文详细介绍了Void程序,它是类似于Linux中udev的功能实现,主要负责管理可热插拔设备的热插拔工作。Void通过VolumeManager、CommandListener及NetlinkManager三个核心组件进行初始化并执行相应任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    void是类似linux中udev功能的程序,它管理着可热插拔设备的热插拔工作。

main函数完成的VolumeManager, CommandListerer, NetlinkManager的初始化工作,并执行:
vm->start()
nm->start()
cl->startListener()

int main() {
//下面定义了VOLD中三个重要的类
    VolumeManager *vm;
    CommandListener *cl;
    NetlinkManager *nm;

    SLOGI("Vold 2.1 (the revenge) firing up");

    mkdir("/dev/block/vold", 0755);

    /* For when cryptfs checks and mounts an encrypted filesystem */
    klog_set_level(6);

    /* Create our singleton managers */
    if (!(vm = VolumeManager::Instance())) {
        SLOGE("Unable to create VolumeManager");
        exit(1);
    };

    if (!(nm = NetlinkManager::Instance())) {
        SLOGE("Unable to create NetlinkManager");
        exit(1);
    };


    cl = new CommandListener();
    vm->setBroadcaster((SocketListener *) cl); 
    nm->setBroadcaster((SocketListener *) cl);

    if (vm->start()) {
        SLOGE("Unable to start VolumeManager (%s)", strerror(errno));
        exit(1);
    }

    if (process_config(vm)) {
        SLOGE("Error reading configuration (%s)... continuing anyways", strerror(errno));
    }

    if (nm->start()) {
        SLOGE("Unable to start NetlinkManager (%s)", strerror(errno));
        exit(1);
    }

    coldboot("/sys/block");
//    coldboot("/sys/class/switch");

    /*
     * Now that we're up, we can respond to commands
     */
    if (cl->startListener()) {
        SLOGE("Unable to start CommandListener (%s)", strerror(errno));
        exit(1);
    }

    // Eventually we'll become the monitoring thread
    while(1) {
        sleep(1000);
    }

    SLOGI("Vold exiting");
    exit(0);
}
在NetlinkManager.h和VolumeManager.h中均定义了
SocketListener       *mBroadcaster;

void setBroadcaster(SocketListener *sl) { mBroadcaster = sl; }
SocketListener *getBroadcaster() { return mBroadcaster; }
CommandListener类是FrameworkListener子类,而FrameworkListener是SocketListener子类。



<think>好的,用户之前问过关于Android设备插入U盘到挂载完成的流程,现在他接着问vold的源代码在Android framework中的位置。我需要详细回答这个问题。 首先,用户可能对Android系统开发感兴趣,或者正在学习相关的知识,想要深入了解vold的实现。他们的真实需求可能是想要查看源码,了解vold的工作原理,或者进行定制开发、调试问题。比如,他们可能在开发需要处理外部存储的应用,或者在进行系统定制时遇到问题,需要参考源码。 接下来,我需要回忆voldAndroid代码中的位置。根据之前的了解,vold是Volume Daemon,属于系统底层服务,负责存储设备的管理。Android的源代码结构里,系统服务通常位于不同的目录。比如,frameworks/base/包含很多系统服务,但vold是否在那里呢? 可能需要确认一下。记得vold的代码并不在frameworks/base下,因为vold是一个独立的守护进程,属于系统核心服务,但可能放在system目录下。比如,在AOSP中,许多核心服务和守护进程位于system/core或system/vold。搜索一下,确认vold的代码路径应该是system/vold。例如,在AOSP源码中,vold的代码确实位于system/vold目录下。 用户可能需要具体的路径,以便在源码中查找。另外,他们可能想知道如何下载或浏览这部分代码。需要给出具体的仓库链接,比如Android官方的源码仓库中的路径。比如,在线查看的话,可以在https://android.googlesource.com/platform/system/vold/ 找到。 此外,用户可能对vold的模块结构感兴趣,比如主要代码文件,如main.cpp、VolumeManager.cpp等,可以简要介绍一下目录结构中的关键文件,帮助他们定位。 还需要考虑用户可能的后续问题,比如如何编译vold,或者如何修改代码,但当前问题只涉及位置,所以不需要展开。不过可以提到相关的mk文件,比如Android.mk或Android.bp,说明构建配置的位置。 最后,确保回答清晰,结构正确,分点说明,让用户容易理解。同时检查是否有其他相关信息需要补充,比如vold与其他组件的交互,但当前问题重点在源码位置,所以保持专注。</think>### vold 源码Android 系统框架中的位置 在 AOSP(Android Open Source Project)中,**vold(Volume Daemon)** 的源代码位于以下目录: ``` /platform/system/vold/ ``` --- #### **关键代码路径解析** | 路径 | 功能说明 | |-------------------------------|--------------------------------------------------------------------------| | `/platform/system/vold/` | **核心代码根目录**,包含守护进程主逻辑、存储设备管理、文件系统操作等代码 | | `/vold/main.cpp` | vold 的入口函数,初始化服务并启动事件循环 | | `/vold/VolumeManager.cpp` | 管理存储卷的生命周期(挂载/卸载/格式化) | | `/vold/Disk.cpp` | 处理物理磁盘的分区检测与状态管理 | | `/vold/Ext4.cpp`/`Ntfs.cpp` | 文件系统操作实现(如挂载 NTFS/FAT32/exFAT) | | `/vold/NetlinkHandler.cpp` | 监听内核通过 Netlink 发送的 uevent 设备事件 | | `/vold/Utils.cpp` | 封装底层系统调用(如 fork/exec 执行`mount`命令) | --- #### **相关配置文件与构建脚本** | 路径 | 作用 | |-----------------------------------|----------------------------------------------------------------------| | `/platform/system/vold/Android.bp` | Blueprint 构建脚本,定义 vold 的编译规则和依赖项 | | `/platform/system/core/libcutils/` | 依赖库:提供 Android 特有的工具函数(如`android_get_control_socket`)| | `/platform/system/core/libsysutils/` | 依赖库:处理 socket 通信和事件循环 | --- ### **如何查看源码** 1. **官方 AOSP 仓库** 在线浏览地址: https://android.googlesource.com/platform/system/vold/ 2. **本地代码库** 若已下载完整 AOSP 代码,可通过以下命令定位: ```bash cd /path/to/aosp find . -name "vold" # 确认 system/vold 目录位置 ``` --- ### **代码结构示例** ``` system/vold/ ├── Android.bp # 构建配置 ├── main.cpp # 主入口 ├── VolumeManager.cpp # 卷管理 ├── Disk.cpp # 磁盘设备处理 ├── NetlinkHandler.cpp # 内核事件监听 ├── model/ # 数据模型(卷、磁盘等对象) │ ├── Volume.cpp │ └── Disk.h ├── fs/ # 文件系统支持 │ ├── Ext4.cpp │ └── Ntfs.cpp └── tests/ # 单元测试 ``` --- ### **调试与修改建议** 1. **修改 vold 代码** 需重新编译系统镜像: ```bash mmm system/vold/ # 仅编译 vold 模块 adb root && adb remount adb push out/target/product/.../system/bin/vold /system/bin/ ``` 2. **查看 vold 日志** 通过`logcat`过滤 vold 的调试信息: ```bash adb logcat -s vold ``` --- ### **与其他组件的关联** vold 通过以下接口与 Android 系统交互: - **Binder IPC**:与`StorageManagerService`通信(代码位于`frameworks/base/services/core/java/com/android/server/storage/`) - **Socket**:接收来自内核的 uevent 事件 - **FUSE/sdcardfs**:实现存储隔离(代码位于`kernel/.../fs/fuse/`或`system/core/sdcard/`) 通过分析这些代码,可以深入理解 Android 存储管理的底层机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值