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()函数里面初始化的。

其中 VolumeManager,NetlinkManager 内部采用单例模式。

(1) Class NetlinkManager 主要是创建于内核通信的 socket,接收来自底层的信息,然后传交给VolumeManager 处理。

(2) class CommandListener 主要收到上层 MountService 通过 doMountVolume 发来的命令,分析后,转交给 VolumeManager 处理;VolumeManager 处理信息后,或报告给上层 MountService,

或交给 volume 执行具体操作。CommandListener在main()初始化后,之后开始监听,会开一个线程不停的监听来自内核的消息。

深入main文件

在Vold 的main.cpp里面,启动一个线程用来监听kernel 发出unMounted 的uevent事件,代码:

NetlinkManager *nm;

//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方法,如下代码:

mHandler = new NetlinkHandler(mSock);

if (mHandler->start()) {

SLOGE("Unable to start NetlinkHandler: %s", strerror(errno));

return -1;

}

深入NetlinkHandler 的start函数,见代码:

int NetlinkHandler::start() {

return this->startListener();

}

上面有说过NetlinkHandler其实是SocketLinstener的子类,NetlinkHandler直接调用父类的startListener 方法,startListener开启了一个线程用来执行threadStart函数,代码太多,贴出主心代码:

if (pthread_create(&mThread, NULL, SocketListener::threadStart, this)) {

SLOGE("pthread_create (%s)", strerror(errno));

return -1;

}

而threadStart函数则调用了runListener方法,代码如下:

void *SocketListener::threadStart(void *obj) {

SocketListener *me = reinterpret_cast(obj);

me->runListener();

pthread_exit(NULL);

return NULL;

}

runListener会判断socket 有无信息可读,不会阻滞UI,最后调用onDataAvailable函数,代码:

void SocketListener::runListener() {

SocketClientCollection *pendingList = new SocketClientCollection();

//代码有所省略

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 */

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();

}

}

}

}

onDataAvailable会处理来自uEvent 的命令,并最终调用onEvent函数,onDataAvailable 位于System/core/libsysutils/src/NetlinkListener.cpp 这个主要处理一些socket方法的知识,一般不用修改。

最后由Netlinklinstener 来解析 ,代码:

bool NetlinkListener::onDataAvailable(SocketClient *cli)

{

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 。

android volume挂载流程,Android SDCard UnMounted 流程分析(一)相关推荐

  1. Android SDCard UnMounted 流程分析(三)

    前篇地址 Android SDCard UnMounted 流程分析(一) Android SDCard UnMounted 流程分析(二) 前一篇讲到SDCard unmout onEvent 发送 ...

  2. android vold 挂载读写,Android——Vold磁盘挂载_主体构建(一)

    这段时间为了把mmc的一个block当成sdcard内置,学习了下android的vold磁盘挂载模块,记录一下(android 4.2.2). 一:Vold的编译及启动 vold的源码位置在andr ...

  3. Android SDCard Mount 流程分析(一)

    点击打开链接 前段时间对Android 的SDCard unmount 流程进行了几篇简短的分析,由于当时只是纸上谈兵,没有实际上的跟进,可能会有一些误导人或者小错误.今天重新梳理了头绪,针对moun ...

  4. android otg 挂载流程,android USB OTG功能如何打开及实现

    1.检查HW原理图,确认是否支持OTG功能(vbus是否供上电,IDDIG pin链接是否正确) 2.若HW确认支持OTG功能,则按照如下方法分别打开USB OTG功能及实现挂载: 如何打开USB O ...

  5. 高通Android智能平台环境搭建_编译流程分析

    高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...

  6. 【Android 系统开发】 Android 系统启动流程简介

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...

  7. Android图形显示系统——一张图片的显示流程

    Android设备上一张图片的显示过程 应用示例 假如我们现在有一张这样的风景照 想在Android设备(比如一个小米pad)上显示出来.首先想到的是写一个应用,用一个ImageView,把这张照片附 ...

  8. Android 7.1.2(Android N) Android系统启动流程

    Android 7.1.2(Android N) Android系统启动流程 源码: system/core/rootdir/ init.rc init.zygote64.rc system/core ...

  9. Android 4.0按键事件以及系统流程分析

    Android 4.0中按键的处理流程 按键在Android系统中,有着不同的代表意义.以前的全键盘的手机代码没有阅读过,所以也不是很了解.本人介绍的是在触摸屏的手机上的按键消息的处理流程. 在现在触 ...

最新文章

  1. glutSolidSphere 用例
  2. permission denied和linux赋值权限chmod命令
  3. 获取html滚动条位置,pc和移动端获取滚动条的位置
  4. 计算机电源稳压,一种用于计算机的电源稳压电路
  5. Java面向对象-抽象类
  6. mysql hash分区 创建_如何建mysql hash数据库分区
  7. 实例--[QSerialPort]串口通信
  8. android开发酷欧天气,酷欧天气的开发
  9. 考前必背的50个知识点——系统集成项目管理工程师考试
  10. Atitit 知识聚合的方法大总结 目录 1. 什么是聚合 汇聚 1 2. 聚合化应用场景 2 2.1. 一站式 2 3. 知识聚合的历史与趋势
  11. 【优化算法】差分蜂群优化算法(DEABC)【含Matlab源码 1230期】
  12. 服务器上传图片不显示,网站后台上传图片失败或不显示的原因
  13. mysql插件的初始化
  14. PROE 齿轮设计视频教程+直齿 斜齿 人字齿 内外啮齿 行星齿
  15. 京东JDK在大数据平台的探索与研究
  16. 南大计算机学院有几个院士,中国大学两院院士数量排名,看看谁的科研实力最强...
  17. linux命令行python_干货:4 个绝佳的命令行终端程序
  18. 安卓股票悬浮窗_Android 实现悬浮窗功能
  19. 一个实验了解多层内网渗透
  20. QEMU零知识学习2 —— QEMU源码下载

热门文章

  1. vscode更换主题的插件_VScode 插件开发(三)主题
  2. RT-Thread设备框架学习感悟
  3. AddStaticMeshComponent
  4. 磁盘的磁道(Track)
  5. “无法解析外部符号 __security_cookie”问题解决
  6. 使用 rapidxml 做配置文件
  7. 坦克大战代码_坦克大战系列文章-坦克大战简介
  8. 黑马程序员顺义校区php_黑马程序员:从PHP零基础到月薪11K为何送锦旗给班主任?...
  9. 河流水质指标预测与不确定性分析:机器学习模型的比较研究--文献阅读
  10. 38备忘录模式(Memento Pattern)