Android SDCard UnMounted 流程分析(一)
2012-03-22 14:53 Terry_龙 阅读(6303) 评论(1) 编辑 收藏 举报Android SDCard框架
Android SDCard框架,我们修改一般涉及到四大模块
- Linux Kernel 用于检测热拔插,作为框架开发者来说,这者不用涉及
- Vold 作为Kernel 与 Framework 之间的桥梁
- Framework 操作Vold ,给Vold 下发操作命令
- UI 与Framework 交互,用于挂载/卸载SD卡
框架涉及的源码位置
Vold :System/vold
为vold 提供接口:System/Netd
其他涉及的部分:System/core/libsysutils/src
System/core/include/sysutils
Framework:frameworks/base/services/java/com/android/server
访问和提供接口类:framework/base/core/java/android/os/storage/
可能还要参考的库:framework/base/libs/storage
framework/base/native
UI:Settings/src/com/android/setting/deviceinfo
SDCard UnMounted流程分析
VolumeManager, CommandListener, NetlinkManager 都是在 main()函数里面初始化的。
深入main文件
在Vold 的main.cpp里面,启动一个线程用来监听kernel 发出unMounted 的uevent事件,代码:
//NetlinkManager内部使用的单例模式
if (!(nm = NetlinkManager::Instance())) {
SLOGE("Unable to create NetlinkManager");
exit(1);
};
//开始监听,从服务启动就一直监听
if (nm->start()) {
SLOGE("Unable to start NetlinkManager (%s)", strerror(errno));
exit(1);
}
NetlinkManager的start 函数是实例化了一个NetlinkHandler(继承关系:NetlinkHandler->NetlinkListener->SocketLinstener),并调用handler 的start方法,如下代码:
if (mHandler->start()) {
SLOGE("Unable to start NetlinkHandler: %s", strerror(errno));
return -1;
}
深入NetlinkHandler 的start函数,见代码:
return this->startListener();
}
上面有说过NetlinkHandler其实是SocketLinstener的子类,NetlinkHandler直接调用父类的startListener 方法,startListener开启了一个线程用来执行threadStart函数,代码太多,贴出主心代码:
SLOGE("pthread_create (%s)", strerror(errno));
return -1;
}
而threadStart函数则调用了runListener方法,代码如下:
SocketListener *me = reinterpret_cast<SocketListener *>(obj);
me->runListener();
pthread_exit(NULL);
return NULL;
}
runListener会判断socket 有无信息可读,不会阻滞UI,最后调用onDataAvailable函数,代码:
SocketClientCollection *pendingList = new SocketClientCollection();
//代码有所省略
}
}
onDataAvailable会处理来自uEvent 的命令,并最终调用onEvent函数,onDataAvailable 位于System/core/libsysutils/src/NetlinkListener.cpp 这个主要处理一些socket方法的知识,一般不用修改。
最后由Netlinklinstener 来解析 ,代码:
{
int socket = cli->getSocket();
ssize_t count;
count = TEMP_FAILURE_RETRY(uevent_kernel_multicast_recv(socket, mBuffer, sizeof(mBuffer)));
if (count < 0) {
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;
}
小结
NetlinkManager其实就是用来处理uEvent 命令,并最终发送到vold/NetlinkHandler 的onEvent 。