android volume挂载流程,Android SDCard UnMounted 流程分析(一)

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 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天玑800处理器支持鸿蒙系统吗,骁龙750g和天玑800u哪个性能好 骁龙750g性能参数介绍...

高通骁龙750G处理器是一款中端入门级的5G处理器&#xff0c;主要使用在一些入门级的5G手机上&#xff0c;这和天玑800U的定位差不多&#xff0c;那么这两款处理器哪一个性能更强呢&#xff0c;我们来看下具体的参数对比介绍。1、骁龙750G参数性能:8nm制造工艺&#xff0c;Corte…

html全屏播放一段视频,显示HTML5视频全屏(Show HTML5 Video Fullscreen)

这对我的作品。我发现在使Web应用程序与VIMEO影片“怪癖解决方案”。 我测试了两种设备。 一个是Android的4.2.x版的版本&#xff0c;另一种是4.4.x到版本。 一个是能够以全屏模式播放视频&#xff0c;另一种是不能够。阅读正式文件“后的Android 4.4系统迁移到的WebView ”&am…

html表情选择器,原生JS写的emoji表情选择器

//生成表情window.onload function() {var face document.getElementById(‘face‘);for(var i 0; i < 38; i) {var a document.createElement("a");a.href "javascript:;";if(i < 10) {a.innerHTML ‘‘;}else{a.innerHTML ‘‘;}face.appendCh…

swf文件在线预览 html,在线浏览swf文件

项目中需要将PPT实现在线浏览的&#xff0c;在网上找了很多资料&#xff0c;大部分都倡导用&#xff0c;格式转为swf&#xff0c;这样的方法来实现在线浏览PPT。所以记录一下这块的代码&#xff1a;pageEncoding"UTF-8"%>html,body{ height:100%; }body { margin:…

layedit html源码编辑,Kz.layedit-layui.layedit富文本编辑器拓展

摘要&#xff1a;本插件基于layui.layedit,增加了html源码模式&#xff0c;片插入功能添加alt属性(layupload)&#xff0c;视频插入功能&#xff0c;全屏功能&#xff0c;段落格式&#xff0c;字体颜色设置&#xff0c;右键菜单操作&#xff0c;插入锚点&#xff0c;水平线功能…

计算机操作基础英语,计算机操作基础word练习题参考答案

《计算机操作基础》word练习题答案班别学号姓名一、判断题&#xff1a;1、( √) 用“插入”菜单中的“符号”命令可以插入符号和其他特殊字符。2、( √) WOR中D的工具栏可由用户根据需要显示或隐藏。3、( √) 对文本及图片都可以进行剪切、复制、粘贴操作。4、( √) 用“格式”…

3dmax里面cr材质转换vr材质_3DMAX零基础入门视频全套教程

3Dmax基础教程全套视频&#xff1a;点链接就行1.3dmax界面介绍2、3dmax主工具栏3、创建面板与修改面板4、时间轴与视口按钮5、3D视口讲解6、3dmax样条线界面7、CAD如何导入3dmax8、3DMAX绘制初步空间9、3DMAX导入图片与车削10、倒角和倒角剖面11、修改器堆栈|12、弯曲命令13、对…

html5 自定义 datepicker,如何使用 React 构建自定义日期选择器(3)

本文作者&#xff1a;IMWeb howenhuo未经同意&#xff0c;禁止转载Datepicker 组件构建 Datepicker 组件要开始构建 Datepicker 组件&#xff0c;请将以下代码片段添加到 src/components/Datepicker/index.js 文件。import React from "react";import PropTypes from…

群签名和环签名的区别_超级签名和TF签名使用个人开发者账号的区别是什么?...

了解过当前ios签名的朋友都知道&#xff0c;目前ios签名共分为企业签名、超级签名和TF签名&#xff0c;其中企业签名作为签名行业的“老大哥”&#xff0c;深受各路开发者和App运营商的喜爱。而我们今天的主角却是其他两种&#xff1a;超级签名和TF签名。这两种签名方式与企业签…

现代计算机网络的6个方面的应用,现代计算机网络技术应用及发展(共4384字).doc...

现代计算机网络技术应用及发展(共4384字)现代计算机网络技术应用及发展(共4384字)摘要&#xff1a;计算机网络技术是一门融合了网络技术学科、计算机技术学科和通信技术学科多方面知识的交叉学科&#xff0c;当下信息技术快速发展&#xff0c;计算机网络技术在社会各个领域都得…

matlab水蒸气焓值计算_从第一性原理计算出发来理解含能配合物宏观行为的趋势...

欢迎关注微信公众平台"计算材料学"&#xff0c;微信ID&#xff1a;jisuancailiao近日&#xff0c;北京理工大学物理学院郭伟课题组&#xff08;博士研究生孙矗丽&#xff09;与北京理工大学爆炸科学与技术国家重点实验室、机电学院张同来课题组在Physical Chemistry …

抖音文字时钟壁纸html,抖音文字时钟app

抖音文字时钟app是一款蛮火蛮有趣的复古罗盘时钟应用&#xff0c;喜欢刷抖音的用户是不是在抖音上看到了这些的时钟&#xff0c;你是不是对这个罗盘产生了兴趣&#xff0c;今天小编为你提供了设置这个时钟的app&#xff0c;当前只有安卓版&#xff0c;苹果版暂未上线&#xff0…

计算机网络十进制转二进制的应用题,【网络-理论】二进制与十进制的转换

由于计算机中运行的数据都是以二进制数的形式存在的&#xff0c;学习二进制数的计算成为计算机专业必备的一门知识。概述正如字面上的意思&#xff1a;二进制数&#xff0c;满二进一&#xff0c;所以说二进制只由 数字0和数字1组成。十进制&#xff0c;满十进一&#xff0c;所以…

最大化_怎样保证油压缓冲器工作效率最大化?

对于油压缓冲器&#xff0c;广大使用者在采购前普遍考虑的是油压缓冲器的价格、质量、品牌。挑选出合适的油压缓冲器仅仅是第一步&#xff0c;提高其工作效率&#xff0c;增加产能&#xff0c;才能为企业创造更多价值。要保证油压缓冲器工作效率最大化&#xff0c;需要做到以下…

采油工计算机试题库,数字化采油工试题库.doc

单项选择题&#xff1a;题目正确答案解析考题难度知识点1数字化就是将复杂多变的信息转变为可以度量的( )&#xff0c;再为这些数据建立起适当的数字化模型&#xff0c;把它们转变为一系列的二进制代码&#xff0c;引入计算机内部&#xff0c;进行统一处理。A、数字、数据 B、知…

aosp 本地版本管理_谈 DevOps 平台实施:我在本地跑明明成功的,为什么在你平台跑就报错?...

我在本地跑明明成功的&#xff0c;为什么在你平台跑就报错&#xff1f;用户在 Jenkins 上跑构建时&#xff0c;失败了&#xff0c;把日志截图给我看&#xff0c;如下图&#xff1a;在过去几个月&#xff0c;每个星期都会有一两个 Jenkins 用户就会给我发送类似的错误日志。这样…

江苏大学2020计算机考研,江苏大学2020年硕士研究生复试时间及主要安排

根据《江苏大学2020年硕士研究生招生复试及录取办法》(江大研〔2020〕3号)&#xff0c;为做好我校2020年硕士研究生复试及录取工作&#xff0c;现将有关工作安排通知如下&#xff1a;一、复试人选符合我校复试分数线要求的一志愿考生、符合各学院(中心、研究院、所&#xff0c;…

尼康d7200拍照_为什么尼康和佳能的全画幅旗舰单反却只有2000多万像素?

华为P20Pro摄像头都做到了4000万像素&#xff0c;为什么尼康和佳能的全画幅顶级单反却只有2000多万像素&#xff1f;下面我们先来看看目前市场上摄影器材的像素情况。单机身售价高达3万多的尼康旗舰全画幅单反D5总像素是2133万&#xff0c;有效像素是2082万&#xff1b;单机身售…

计算机技术员好学吗,电脑技术员,沦落到如此地步...

2001年16岁的我就去了浙江余姚打工&#xff0c;当时的我还没有现在大家那么大的野心&#xff0c;想干出一番大的事业&#xff0c;只能想着学一门技术能够有自己一席之地&#xff0c;当时我学过搓丝机&#xff0c;就是做螺丝&#xff0c;第一个月没有工资&#xff0c;老板给了我…

级差公排php如何_什么是专业级差?专业级差怎么安排专业?

相信很多考生在阅读高校招生简章的时候&#xff0c;在录取规则那里都会看到专业级差这么一个词&#xff0c;很多同学和家长就不明白了&#xff0c;这个专业级差到底是什么意思呢&#xff1f;该怎么去理解这个专业级差呢&#xff1f;下面新亚艺考培训学校就带着大家一起了解什么…