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

继续看后面的代码:

        /* Process the pending list, since it is owned by the thread,
         * there is no need to lock it */
        while (!pendingList->empty()) {
            /* Pop the first item from the list */
            it = pendingList->begin();
            SocketClient* c = *it;
            pendingList->erase(it);
            /* Process it, if false is returned and our sockets are
             * connection-based, remove and destroy it */
            if (!onDataAvailable(c) && mListen) {
                /* Remove the client from our array */
                SLOGV("going to zap %d for %s", c->getSocket(), mSocketName);
                pthread_mutex_lock(&mClientsLock);
                for (it = mClients->begin(); it != mClients->end(); ++it) {
                    if (*it == c) {
                        mClients->erase(it);
                        break;
                    }
                }
                pthread_mutex_unlock(&mClientsLock);
                /* Remove our reference to the client */
                c->decRef();
            }
        }
    }
    delete pendingList;
pendingList中的成员的socket都是有数据可读的,调用onDataAvailable(c)进行接收数据并处理。onDataAvailable()的代码在NetlinkListener类中:

bool NetlinkListener::onDataAvailable(SocketClient *cli)
{
    int socket = cli->getSocket();
    ssize_t count;
    uid_t uid = -1;
    
    //将接收的数据保存到mBuffer中
    count = TEMP_FAILURE_RETRY(uevent_kernel_multicast_uid_recv(
                                       socket, mBuffer, sizeof(mBuffer), &uid));
    if (count < 0) {
        if (uid > 0)
            LOG_EVENT_INT(65537, uid);
        SLOGE("recvmsg failed (%s)", strerror(errno));
        return false;
    }

    NetlinkEvent *evt = new NetlinkEvent();
    if (!evt->decode(mBuffer, count, mFormat)) { //解析数据
        SLOGE("Error decoding NetlinkEvent");
    } else {
        onEvent(evt);
    }

    delete evt;
    return true;
}

代码将接收的数据保存到mBuffer中,调用evt->decode()解析数据:

bool NetlinkEvent::decode(char *buffer, int size, int format) {
    if (format == NetlinkListener::NETLINK_FORMAT_BINARY) {
        return parseBinaryNetlinkMessage(buffer, size);
    } else {
        return parseAsciiNetlinkMessage(buffer, size);
    }
}

如果decode成功,调用onEvent()。onEvent()的代码在NetlinkHandle类中:

void NetlinkHandler::onEvent(NetlinkEvent *evt) {
    VolumeManager *vm = VolumeManager::Instance();
    const char *subsys = evt->getSubsystem();

    if (!subsys) {
        SLOGW("No subsystem found in netlink event");
        return;
    }

    if (!strcmp(subsys, "block")) {
        vm->handleBlockEvent(evt);
    }
}


这段代码在最后调用了vm->handleBlockEvent(),只处理了subsys=”block”的情况。


<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、付费专栏及课程。

余额充值