首页 文章 精选 留言 我的

精选列表

搜索[子流程],共10000篇文章
优秀的个人博客,低调大师

Android SDCard UnMounted 流程分析(二)

上一篇讲到通过NetlinkManager发送uevent 命令到NetlinkHandler 的onEvent,代码如下: voidNetlinkHandler::onEvent(NetlinkEvent*evt){ VolumeManager*vm=VolumeManager::Instance(); const char*subsys=evt->getSubsystem(); if(!subsys){ SLOGW( " Nosubsystemfoundinnetlinkevent "); return; } SLOGD( " NetlinkHandler:OnEventsubsysvaluesis%s ",subsys); if(!strcmp(subsys, " block ")){ SLOGD( " NetlinkHandler:onEvent "); vm->handleBlockEvent(evt); } } 在NetlinkHandler 里面得一个VolumeManager,当收到的命令为block时调用VolumnManager的handleBlockEvent,如上加红加粗的代码。 handleBlockEvent实则是通过一个循环将事先将main事先读取的配置文件:etc/vold.fstab存进VolumeCollection,得到VolumeCollection的对象,然后调用Volume 的handleBlockEvent,如代码: voidVolumeManager::handleBlockEvent(NetlinkEvent*evt){ const char*devpath=evt->findParam( " DEVPATH "); /* Lookupavolumetohandlethisdevice */ VolumeCollection::iteratorit; boolhit= false; for(it=mVolumes->begin();it!=mVolumes->end();++it){ if(! (*it)->handleBlockEvent(evt)){ #ifdefNETLINK_DEBUG SLOGD( " Device'%s'eventhandledbyvolume%s\n ",devpath,(*it)->getLabel()); #endif hit= true; break; } } if(!hit){ #ifdefNETLINK_DEBUG SLOGW( " Novolumeshandledblockeventfor'%s' ",devpath); #endif } 看一下Volume 的handleblockEvent代码: intVolume::handleBlockEvent(NetlinkEvent*evt){ errno=ENOSYS; return- 1; 看起来好像没做什么事,其实真的实现在于Volume 的子类,DirectVolume,DirectVolme 中重写了handleBlockEvent,看代码: intDirectVolume::handleBlockEvent(NetlinkEvent*evt){ const char*dp=evt->findParam( " DEVPATH "); PathCollection::iteratorit; for(it=mPaths->begin();it!=mPaths->end();++it){ if(!strncmp(dp,*it,strlen(*it))){ /* Wecanhandlethisdisk */ intaction=evt->getAction(); const char*devtype=evt->findParam( " DEVTYPE "); if(action==NetlinkEvent::NlActionAdd){ intmajor=atoi(evt->findParam( " MAJOR ")); intminor=atoi(evt->findParam( " MINOR ")); charnodepath[ 255]; snprintf(nodepath, sizeof(nodepath), " /dev/block/vold/%d:%d ", major,minor); if(createDeviceNode(nodepath,major,minor)){ SLOGE( " Errormakingdevicenode'%s'(%s) ",nodepath, strerror(errno)); } if(!strcmp(devtype, " disk ")){ handleDiskAdded(dp,evt); } else{ handlePartitionAdded(dp,evt); } } else if(action==NetlinkEvent::NlActionRemove){ if(!strcmp(devtype, " disk ")){ handleDiskRemoved(dp,evt); } else{ SLOGD( " DirectVolume:handleBlockEvent--->handlePartitionRemoved "); handlePartitionRemoved(dp,evt); } } else if(action==NetlinkEvent::NlActionChange){ if(!strcmp(devtype, " disk ")){ handleDiskChanged(dp,evt); } else{ handlePartitionChanged(dp,evt); } } else{ SLOGW( " Ignoringnonadd/remove/changeevent "); } return 0; } } errno=ENODEV; return- 1; } 因为我的板子还未完善,所以这里它认为我的sdcard是一个分区,但无关紧要,原理一样,就根据分区的代码跟踪。:handlePartitionRemoved,由于代码过多,只贴出核心代码: voidDirectVolume::handlePartitionRemoved( const char*devpath,NetlinkEvent*evt){ if((dev_t)MKDEV(major,minor)==mCurrentlyMountedKdev){ /* *Yikes,ourmountedpartitionisgoingaway! */ snprintf(msg, sizeof(msg), " Volume%s%sbadremoval(%d:%d) ", getLabel(),getMountpoint(),major,minor); SLOGD( " DirectVolume:(dev_t)MKDEV(major,minor)==mCurrentlyMountedKdev:%d,msgis:%s. ",mCurrentlyMountedKdev,msg); mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeBadRemoval,msg,false); if(mVm->cleanupAsec( this, true)){ SLOGE( " FailedtocleanupASEC-unmountwillprobablyfail! "); } if( Volume::unmountVol(true,false)){ SLOGE( " Failedtounmountvolumeonbadremoval(%s) ", strerror(errno)); // XXX:Atthispointwe'rescrewedfornow } else{ SLOGD( " Crisisaverted "); } } } 到此,直接调用父类的unmountVol方法,unmountVol会通过setState通知框架状态改变。代码太多,只推荐核心代码: intVolume::unmountVol( boolforce, boolrevert){ setState(Volume::State_Unmounting); } 而setState会通过socket将msg消息传给框架 mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeStateChange, msg, false); 接下去的步骤是关于socket的操作,就不深入了。 小结 到了这一步,Vold 向上层反馈的动作基本己经完成,下一篇文章将会讲解Framework 如何取得Vold 反馈过来的数据。 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/814963 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android M应用启动流程分析

更新:2016-10-29:更新handleBindApplication部分。 我这个版本的原则是,有话则长,无话则短. 以下分析基于6.0.1_r10版本。先看一张大图: 1. 桌面的onClick事件(进程:桌面应用的进程) 我们暂时忽略Input处理的过程,以桌面的onClick事件被触发为起点。这部分根据Launcher的不同而大同小异。 2. ActivityManagerService之startActivity(进程AmS) 路径:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java桌面调用framework,最后会调到AmS的startActivity方法.现在是多用户时代了,startActivity现在唯一

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册