Android23SD卡挂载流程浅析_第1页
Android23SD卡挂载流程浅析_第2页
Android23SD卡挂载流程浅析_第3页
Android23SD卡挂载流程浅析_第4页
Android23SD卡挂载流程浅析_第5页
已阅读5页,还剩136页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android 2.3中关于SD卡挂载简介 在Android 2.3中,当SD卡插入系统之后,系统会自动挂载。Vold 就是负责挂载SD卡的,vold 的全称是volume daemon。实际上是负责完成系统的CDROM,USB 大容量存储,MMC 卡(后文有简介,具体请百度)等扩展存储的挂载任务自动完成的守护进程。它提供的主要特点是支持这些存储外设的热插拔。在Android上的这个vold 系统和GNU/Linux的之间存在很大的差异。自Android 2.2开始,vold又做了大改动,升级为vold 2.0,之前的配置文件是system/etc/vold.conf,vold 2.0变为sy

2、stem/etc/vold.fstab。vold.fstab中的内容显示如下:# Vold 2.0 Generic fstab# - San Mehat (san)# # Regular device mount# Format: dev_mount # label - Label for the volume# mount_point - Where the volume will be mounted# part - Partition # (1 based), or auto for first usable partition.# - List of sysfs paths to so

3、urce devices# Example of a standard sdcard mount for the emulator / Dream# Mounts the first usable partition of the specified devicedev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1# Example of a dual card setup# dev_mount left_sdcard /sdca

4、rd1 auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1# dev_mount right_sdcard /sdcard2 auto /devices/platform/goldfish_mmc.1 /devices/platform/msm_sdcc.3/mmc_host/mmc1# Example of specifying a specific partition for mounts# dev_mount sdcard /sdcard 2 /devices/platform/

5、goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1可以看到大部分是注释,最重要的为以下这句:dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.0 /devices/platform/msm_sdcc.2/mmc_host/mmc1这句代码码意思是是:外置置SD卡卡的挂载载路径,autto 代代表挂载载SD卡卡的第一一个分区区,后面面是voold监监测的路路径,当当插入ssd时,/deevicces/plaatfoorm/msmm_sddcc.2/mmm

6、c_hosst/mmmc11 路径径下会多多出一个个文件夹夹,在该该文件夹夹中包含含了SDD卡的各各种IDD信息,以及生生产日期期等。如果把ssd卡插插入设备备,在 /deev/bblocck/ 目录下下面也会会多出几几个设备备节点,证明ssd卡的的驱动已已经成功功加载。 我自自己测试试的目录录下面会会形成 mmccblkk0 和 mmmcbblk00p1 节点,注意:这两个个节点的的意思,mmccblkk0代表表第一个个SD卡卡设备,mmccblkk0p11代表第第一个SSD卡设设备的第第一个分分区。真真正挂载载到系统统中的是是 mmmcbllk0pp1而不不是mmmcbllk0,这一点点很

7、重要要。PS:MMC(MulltiMMediia CCardd)卡由由西门子子公司和和首推CCF的SSanDDiskk于19997年年推出。19998年11月十四四家公司司联合成成立了MMMC协协会(MMulttiMeediaa Caard Asssociiatiion简简称MMMCA),现在在已经有有超过884个成成员。MMMC的的发展目目标主要要是针对对数码影影像、音音乐、手手机、PPDA、电子书书、玩具具等产品品,号称称 是目目前世界界上最小小的Fllashh Meemorry存贮贮卡,尺尺寸只有有32mmm xx 244mm x 11.4mmm。虽虽然比SSmarrtMeediaa厚,

8、但但整体体体积却比比SmaartMMediia小,而且也也比SmmarttMeddia轻轻,只有有1.55克。MMMC也也是把存存贮单 元和控控制器一一同做到到了卡上上,智能能的控制制器使得得MMCC保证兼兼容性和和灵活性性。 HYPERLINK /view/50957.htm MMC_百度百百科SD/MMMC 卡的设设备构造造差不多多,不过过 MMMC 当当时的设设计比 SD 小一半半。所以以,SDD/MMMC 的的驱动通通用,进进一步的的,Liinuxx 的设设备节点点就延续续了 MMMC 的这个个名字,后面的的 bllk 是是块设备备这个英英文的简简写, mmccblkk 也就就是“ m

9、mcc/sdd 块设设备”,0 就就是这个个 mmmc/ssd 设设备的顺顺序编号号,p11 就是是第一个个分区。挂载流程程简析内内核层(kerrnell):当当有新的的SD/USBB设备插插入时,kerrnell将自动动检测并并加载对对应的驱驱动,同同时keerneel中的的syssfs机机制会在在有新的的驱动加加载时给给用户层层发送相相应的eevennt,然然后将kkernnel产产生的这这些evventt传递给给volld。用用户层(useer):用户层层通过ssysffs可以以接收来来自keerneel的uueveent,这些收收到的信信息可以以在/ssys/bloock/mmccbl

10、kk0下用用命令ccat *来查查看,如如:# caat *bdii: iinvaalidd leengtth1001799:0ddeviice: innvallid lenngthh8hollderrs: invvaliid llenggthppoweer: invvaliid llenggthqqueuue: invvaliid llenggth880052442888slaavess: iinvaalidd leengtth 2788 8133 886866 110500 00 00 00 00 00 2400 110400subbsysstemm: iinvaalidd leengtt

11、hMAAJORR=1779MIINORR=0DDEVTTYPEE=diiskNNPARRTS=0# 如果这这时候在在终端输输入ppwd指令,大家会会发现路路径并不不是我们们之前进进入的路路径/ssys/bloock/mmccblkk0,而而是/ssys/devvicees /plaatfoorm/golldfiish_mmcc.0/mmcc_hoost/mmcc0/mmmc00:e1118/bloock/mmccblkk0。其其中mmmc0:e1118这 个文件件是插入入SD卡卡之后生生成的文文件。SSysffs传递递来的是是一个多多行的文文档,vvoldd需要解解析这个个文档。Volld将处

12、处理之后后的事件件传递给给 MoounttSerrvicce,然然后MooutSServvicee会将信信息进一一步处理理传递给给StooraggeMaanagger,最后我我们可以以在系统统设置界界面看到到SD卡卡挂 载载成功的的信息,这包括括了SDD卡的总总容量以以及可用用空间如如下图:SD卡的的挂载流流程大致致如此,MouuntSServvie实实际上还还会通知知PacckaggeMaanaggerSServvicee,因为为这里分分析的是是SD卡卡挂载从从底层到到上层的的表现,因此这这里暂不不分析。简约流流程图如如下: 在上上一篇博博文 HYPERLINK /yihongyuelan/

13、article/details/6926034 AAndrroidd 2.3 SSD卡挂挂载流程程浅析(一)主要简简单的介介绍了SSD卡的的挂载流流程。包包 括了了从内核核层到用用户层事事件消息息的传递递,以及及Volld的简简介。本本文将继继续介绍绍SD卡卡的挂载载,但文文中并不不会涉及及代码的的详细分分析,因因为这部部分网上上已有资资料,我我会 在在文章结结尾贴出出来供大大家参考考。本文文主要目目的是一一方面对对自己学学习这一一部分的的总结,另一方方面希望望大家能能够指出出文中理理解错误误的地方方。 11.SDD卡挂载载流程图图 SDD卡的挂挂载流程程图如下下: 绿色色箭头:表示插插入SD

14、D卡后事事件传递递以及SSD卡挂挂载 红色色箭头:表示挂挂载成功功后的消消息传递递流程 黄色色箭头:表示MMounntSeerviice发发出挂载载/卸载载SD卡卡的命令令 大家家可能对对图中突突然出现现的这么么多的名名称感到到奇怪,这些都都是在AAndrroidd 2.3 源源码中可可以找到到的,接接下来我我会为大大家一一一解释这这些类的的作用。 2.各各个文件件的主要要作用(1)Kerrnell:这个个是系统统内核啦啦。不是是我要分分析的文文件,本本文涉及及内容不不是内核核级的哦哦!(努努力学习习中.) (2)NettlinnkMaanagger:全称是是NettlinnkMaanagge

15、r.cppp位于AAndrroidd 2.3源码码位置/sysstemm/voold/NettlinnkMaanagger.cppp。该类类的主要要通过引引用NeetliinkHHanddlerr类中的的 onnEveent()方法法来接收收来自内内核的事事件消息息,NeetliinkHHanddlerr位于/sysstemm/voold/NettlinnkHaandller.cppp。(3)VollumeeMannageer:全全称是VVoluumeMManaagerr.cppp位于于Anddroiid 22.3源源码位置置/syysteem/vvoldd/VoolummeMaanagger

16、.cppp。 该该类的主主要作用用是接收收经过NNetllinkkMannageer处理理过后的的事件消消息。因因为我们们这里是是SD卡卡的挂载载,因此此经过NNetllinkkMannageer处理理过后 的消息息会分为为五种,分别是是:bllockk,swwitcch,uusb_commpossitee,baatteery,powwer_suppplyy。这里里SD卡卡挂载的的事件是是 bllockk。 (4)DirrecttVollumee:位于于/syysteem/vvoldd/DiirecctVoolumme.ccpp。该类的的是一个个工具类类,主要要负责对对传入的的事件进进行进一一

17、步的处处理,bblocck事件件又可以以分为:Addd,Reemovved,Chaangee,Nooacttionn这四种种。后文文通过介介绍Addd事件件展开。 (5)Vollumee:Voolumme.ccpp位位于/ssysttem/volld/VVoluume.cppp,该类类是负责责SD卡卡挂载的的主要类类。Voolumme.ccpp主主 要负负责检查查SD卡卡格式,以及对对复合要要求的SSD卡进进行挂载载,并通通过Soockeet将消消息SDD卡挂载载的消息息传递给给NattiveeDaeemonnConnnecctorr。 (6)NattiveeDaeemonnConnnecct

18、orr:该类类位于fframmewoorkss/baase/serrvicces/javva /comm.anndrooid.serrverr/NaativveDaaemoonCoonneectoor.jjavaa。该类类用于接接收来自自Vollumee.cppp 发发来的SSD卡挂挂载消息息并向上上传递。 (7)MouuntSServvicee:位于于fraamewworkks/bbasee/seerviicess/jaava/comm.anndrooid.serrverr/MoounttSerrvicce.jjavaa。MoounttSerrvicce是一一个服务务类,该该服务是是系统服服

19、务,提提供对外外部存储储设备的的管理、查询等等。在外外部存储储设备状状态发生生变化的的时候,该类会会发出相相应的通通知给上上层应用用。在AAndrroidd系统中中这是一一个非常常重要的的类。 (8)StooraggeMaanaeer:位位于frrameeworrks/basse/ccoree/jaava/anddriood/oos/sstorragee /SStorrageeMannageer.jjavaa。在该该类的说说明中有有提到,该类是是系统存存储服务务的接口口。在系系统设置置中,有有Stooragge相关关项,同同时 SSetttingg也注册册了该类类的监听听器。而而Stoorag

20、geMaanagger又又将自己己的监听听器注册册到了MMounntSeerviice中中,因此此该类主主要用于于上层应应用获 取SDD卡状态态。通过上上文对各各个文件件的作用用简介,以及整整个SDD卡的挂挂载流程程图可以以知道,Anddroiid 系系统是如如何从底底层获取取SD卡卡挂载信信息的。 后文将将继续分分析程序序调用流流程图。在前面两两篇博文文 HYPERLINK /yihongyuelan/article/details/6926034 Anndrooid 2.33 SDD卡挂载载流程浅浅析(一一) HYPERLINK /yihongyuelan/article/details/

21、6930112 Anddroiid 22.3 SD卡卡挂载流流程浅析析(二)中,主要简简单介绍绍了SDD卡的挂挂载流程程以及所所涉及的的关键文文件。在在 HYPERLINK /yihongyuelan/article/details/6963485 Anndrooid 2.33 SDD卡挂载载流程浅浅析(三三)中中,将简简要介绍绍Anddroiid 22.3中中Volld的运运行机制制,并从从接收内内核ueevennt开始始介绍程程序调用用流程。11. VVolddVoold的的全称是是vollumee daaemoon。主主要负责责系统对对大容量量存储设设备(UUSB/SD)的挂载载/卸载载

22、任务,它是一一个守护护进程,该进程程支持这这些存储储外设的的热插拔拔。自AAndrroidd 2.2开始始,Voold升升级为vvoldd 2.0,之之前的配配置文件件路径在在sysstemm/ettc/vvoldd.coonf,Anddroiid 22.3之之后变为为sysstemm/ettc/vvoldd.fsstabb。2.Volld工作作流程Volld的工工作流程程大致可可以分为为三个部部分:创创建监听听、引导导、事件件处理。(11)创建建监听创 建监听听指的是是创建监监听链接接,一方方面用于于监听来来自内核核的ueevennt,另另一方面面用于监监听来自自上层的的控制命命令,这这些命

23、令令包括控控制SDD卡的挂挂载与卸卸载,这这里所说说 的链链接也就就是Soockeet。在在Anddroiid 系系统启动动的时候候,innit进进程会去去解析iinitt.rcc文件,在该文文件中,有如下下代码:Servvicee voold /syysteem/bbin/volld SSockket volld sstreeam 06660 rroott moountt Ipprioo bee 2这样样系统会会在启动动的时候候创建与与上层通通信的SSockket。 在在Anddroiid 22.3源源码/ssysttem/volld路径径下的mmainn.cppp中创创建了与与内核通通信的

24、SSockket。在maain.cppp中通过过实例化化VollumeeMannageer和NNetllinkkMannageer时创创建。(22)引导导Voold进进程启动动时候会会对现有有的外部部存储设设备进行行检查。首先加加载并解解析voold.fsttab,并检查查挂载点点是否已已被挂载载。然后后执行SSD卡的的挂载,最后处处理USSB大容容量存储储。因为为系统是是按行解解析的,通过查查看voold.fsttab可可以很清清楚的知知道这一一点。vvoldd.faatabb中最重重要的语语句:dev_mouunt sddcarrd /mmnt/sdccardd aautoo /devvi

25、cees/pplattforrm/ggolddfissh_mmmc.0 /deevicces/plaatfoorm/msmm_sddcc.2/mmmc_hosst/mmmc11dev_mouunt 挂挂载命令令 标签 挂载点点 子子分区个个数 挂挂载路径径注: 子子分区个个数如果果为auuto则则表示只只有1个个子分区区,也可可以为任任何不为为0的整整数。 参数之之间不能能有空格格,只能能以taab为间间隔(注注意:这这里为了了对齐因因此采用用空格隔隔开,如如果自行行修改vvoldd.fsstabb之后加加以空格格的话系系统会识识别不到到的)。 如果果volld.ffstaab解析析无误,Vo

26、llueMManaagerr将创建建DirrecttVollumee,若vvoldd.fsstabb解析不不存在或或者打开开失败,Volld 将将会读取取Linnux内内核中的的参数,此时如如果参数数中存在在SDCCARDD(也就就是SDD的默认认路径),VoolummeMaanagger则则会创建建AuttoVoolumme, 如果不不存在这这个默认认路径那那么就不不会创建建。(33)事件件处理通过过对两个个socckett的监听听,完成成对事件件的处理理以及对对上层应应用的响响应。 a. Keerneel发出出uevventt NeetliinkMManaagerr检测到到kerrnell

27、发出的的uevventt,解析析后调用用NettlinnkHaandller:onnEveent()方法法。该方方法会分分别处理理不同的的事件,这里重重要的事事件有: “bblocck”事事件主要要指Voolumme的mmounnt、uunmoountt、crreatteAssec等等。由VVoluumeMManaagerr的 hhanddleBBlocckEvventt(evvt)来来处理,根据多多态性最最终将会会调用AAutooVollumee或者DDireectVVoluume的的 haandlleBllockkEveent方方法来处处理。 “swwitcch”事事件主要要指Voolum

28、me的cconnnet、dissconnnett等。根根据相关关操作,改变设设备参数数(设备备类型、挂载点点等)通通过CoommaandLListteneer告知知FraameWWorkk层。 b. FraameWWorkk发出控控制命令令 与aa相反,CommmanndLiisteenerr检测到到FraameWWorkk层的命命令(MMounntSeerviice发发出的命命令)调调用VoolummeMaanagger的的函 数数,VoolummeMaanagger找找出对应应的Voolumme,调调用Voolumme函数数去挂载载/卸载载操作。而Voolumme类中中的相关关操作最最终通

29、过过调用LLinuux函 数完成成。这里再再次贴上上这张流流程图:33.SDD卡挂载载流程代代码浅析析这这里只是是简要的的分析SSD卡挂挂载过程程中重要要的代码码调用,并没有有深入分分析代码码,因为为这一部部分网上上已有牛牛人比较较详尽的的分析了了,后面面我会贴贴出这些些参考文文章。 整个过过程从KKernnel检检测到SSD卡插插入事件件开始,之前的的一些硬硬件中断断的触发发以及ddrivver的的加载这这里并不不叙述,一直到到SD卡卡挂载消消息更新新到“AAndrroidd系系统设置置存存储”一一项中。 1. Keerneel发出出SD卡卡插入uueveent。 2. NeetliinkH

30、Handdlerr:oonEvventt()接接收内核核发出的的uevventt并进行行解析。 3. VoolummeMaanagger:haandllBloockEEvennt()处理经经过第二二步处理理后的事事件。 4. 接下来来调用DDireectVVoluume: hhanddleBBlocckEvventt()。 在在该方法法中主要要有两点点需要注注意: 第一一,程序序首先会会遍历mmPatth容器器,寻找找与evventt对应的的syssfs_patth是否否存在与与mPaath容容器中。 第第二,针针对evventt中的aactiion有有4种处处理方式式:Addd,RRemoo

31、vedd,Chhangge,NNoacctioon 。 例例如:在在Addd acctioon中会会有如下下操作(因为我我们这里里所讲的的是SDD卡的挂挂载流程程,因此此以Addd来说说明),首先创创建设备备节点,其次对对dissk和pparttitiion两两种格式式的设备备分别进进行处理理。SDD卡属于于dissk类型型。 55. 经经过上一一步之后后会调用用DirrecttVollumee:hhanddleDDiskkAddded()方法法,在该该方法中中会广播播dissk iinseert消消息。 6. SocckettLisstenner:ruunLiisteenerr会接收收Dir

32、recttVollumee:hhanddleDDiskkAddded()广播播的消息息。该方方法主 要完成成对evventt中数据据的获取取,通过过Socckett。(PPS:这这里的SSockketLListteneer.ccpp位位于Anndrooid源源码/ssysttem /coore/libbsyssutiils/srcc/中,后文的的FraamwoorkLListteneer.ccpp也也是,之之前自己己找了很很久 TT_T) 7. 调用用FraamewworkkLisstenner:onnDattaAvvaillablle()方法处处理接收收到的消消息内容容。 88. FFram

33、mewoorkLListteneer:disspattchCCommmandd()该该方法用用于分发发指令。 9.在FFrammewoorkLListteneer:disspattchCCommmandd()方方法中,通过rrunCCommmandd()方方法去调调用相应应的指令令。 100. 在/sysstemm/voold/CommmanndLiisteenerr.cppp中有有runnCommmannd()的具体体实现。在该类类中可以以找到这这个方 法:CCommmanddLisstenner:VoolummeCmmd:runnCommmannd(),从字字面意思思上来看看这个方方法就是

34、是对Voolumme分发发指令的的解析。 该方方法中会会执行“mouunt”函数:vm-moounttVollumee(arrg22)。 111. mouuntVVoluume(argg2)在VVoluumeMManaagerr:mmounntVoolumme()中实现现,在该该方法中中调用vv-mmounntVool()。 12. moounttVoll()方方法在VVoluume:moounttVoll()中中实现,该函数数是真正正的挂载载函数。(在该该方法中中,后续续的处理理都在该该方法中中,在MMounnt过程程中会广广播相应应的消息息给上层层,通过过settStaate()函数数。)

35、 133. ssetSStatte(VVoluume:Chheckkingg);广广播给上上层,正正在检查查SD卡卡,为挂挂载做准准备。 144. FFat:chheckk();SD卡卡检查方方法,检检查SDD卡是否否是FAAT格式式。 15. Faat:doMMounnt()挂载SSD卡。 至至此,SSD的挂挂载已算算初步完完成,接接下来应应该将SSD卡挂挂载后的的消息发发送给上上层,在在13中中也提到到过,在在挂载以以及检查查的过程程中其实实也有发发送消息息给上层层的。 166. MMounntSeerviice的的构造函函数中会会开启监监听线程程,用于于监听来来自voold的的socck

36、ett信息。 TThreead thrreadd = neww Thhreaad(mmConnnecctorr,VOOLD_TAGG); thrreadd.sttartt(); 117. mCoonneectoor是NNatiiveDDaemmonCConnnecttor的的对象,NattiveeDaeemonnConnnecctorr继承了了Runnnabble并并 Ovverrridee了ruun方法法。在rrun方方法中通通过一个个whiile(truue)调调用LiisteenTooSocckett()方方法来实实现实时时监听。 118. 在LiisteenTooSocckett()中

37、中,首先先建立与与Volld通信信的Soockeet SServver端端,然后后调用MMounntSeerviice中中的onnDaeemonnConnnecctedd()方方法。(PS:Javva与NNatiive通通信可以以通过 JNII,那么么Nattivee与Jaava通通信就需需要通过过Socckett来实现现了。 HYPERLINK /leoispace/blog/item/8aa5f41cc8609d04304e15bf.html AAndrroidd中Naativve与FFrammewoorkss通信 这篇篇文章中中有简介介,感兴兴趣的朋朋友可以以参考一一下) 199. oo

38、nDaaemoonCoonneecteed()方法是是在接口口INaativveDaaemoonCoonneectoorCaallbbackks中定定义 的的,MoounttSerrvicce实现现了该接接口并OOverrridde了oonDaaemoonCoonneecteed()方法。该方法法开启一一个线程程用于更更新外置置存储设设备的 状态,主要更更新状态态的方法法也在其其中实现现。 20. 然后后回到LListtenTToSoockeet中,通过iinpuutSttreaam来获获取Voold传传递来的的eveent,并存放放在队列列中。 211. 然然后这些些eveent会会在onn

39、DaeemonnConnnecctedd()通通过队列列的”队队列.ttakee()”方法取取出。并并根据不不同的eevennt调用用 uppdattePuubliicVoolummeSttatee()方方法,在在该方法法中调用用pacckaggeMaanaggerSServvicee中的 upddateeExtteraalSttatee()方方法来更更新存储储设备的的状态。(注:这里不不太理解解pacckaggeMaanaggerSServvicee中的 unlloaddAlllConntaiinerrs(aargss)方法法) 22. 更新新是通过过pacckaggeHeelpeer.gg

40、etMMounntSeerviice().ffiniishMMediiaUppdatte()方法来来实现的的。 23. 在uupdaatePPubllicVVoluumeSStatte()方法中中,更新新后会执执行如下下代码: bbl.mmLisstenner.onSStorrageeStaateCChanngedd(); 在在Anddroiid源码码/paackaagess/appps/Setttinngs/srcc/coom.aandrroidd.seettiingss.deevicceinnfo /Meemorry.jjavaa代码中中,实现现了SttoraageEEvenntLiist

41、eenerr 的匿匿名内部部类,并并Oveerriide了了onSStorrageeStaateCChanngedd();方法。因此在在upddateePubbliccVollumeeStaate() 中中调用oonSttoraageSStatteChhangged();方方法后,Memmoryy.jaava中中也会收收到。在在Memmoryy.jaava中中收到以以后会在在 Seettiing界界面进行行更新,系统设设置存储中中会更新新SD卡卡的状态态。从而而SD卡卡的挂载载从底层层到达了了上层。 在经过过了上面面步骤之之后,SSD卡的的挂载的的消息已已经从底底层到达达了上层层。这是是自己在

42、在网上查查找资料料同时一一边跟踪踪代码后后得出的的结论,其中可可能还有有很多不不正确的的地方,也有很很多自己己没有理理解的地地方,希希望大家家能够帮帮忙指正正,感激激不尽。 后续将将继续分分析SDD挂载广广播的发发出流程程,以及及SD卡卡挂载程程序调用用流程图图。前面的三三篇博文文 HYPERLINK /yihongyuelan/article/details/6926034 Anndrooid 2.33 SDD卡挂载载流程浅浅析(一一)、 HYPERLINK /yihongyuelan/article/details/6930112 Anndrooid 2.33 SDD卡挂载载流程浅浅析(二

43、二)、 HYPERLINK /yihongyuelan/article/details/6963485 Anndrooid 2.33 SDD卡挂载载流程浅浅析(三三)的的分析,知道了了SD卡卡挂载的的消息是是如何从从底层传传递到上上层的,在 HYPERLINK /yihongyuelan/article/details/6963485 AAndrroidd 2.3 SSD卡挂挂载流程程浅析(三)中,我我们已经经知道了了最后是是在uppdattePuubliicVoolummeSttatee()中中调用oonSttoraageSStatteChhangged(),从从而达到到更新SSD卡挂挂载信

44、息息的。在在本文 HYPERLINK /yihongyuelan/article/details/6965165 Anddroiid 22.3 SD卡卡挂载流流程浅析析(四)中,我会将将前文提提到的程程序调用用流程图图画出来来,并对对代码进进行简单单的分析析。 首首先,还还是挂出出这张老老图(因因为每次次都用这这张图00_0.)。 就权当当复习吧吧,这是是SD卡卡的整个个挂载流流程,而而程序的的调用也也是根据据这个流流程图来来的。 1.接接收并处处理ueevennt 首先是是接收因因为插入入SD卡卡被内核核检测到到而发出出的Evventt; NettlinnkHaandller:onnEvee

45、nt(NettlinnkEvventt *eevt)/代码码路径:AnddroiidSoourccecoode22.3/sysstemm/voold/NettlinnkHaandller.cppp/该方方法主要要通过eevt-geetSuubsyysteem();方法法来获取取系统的的eveent HYPERLINK /yihongyuelan/article/details/6944979 o view plain vieww pllainnvoiddNeetliinkHHanddlerr:oonEvventt(NeetliinkEEvennt*evtt)VollumeeMannageer*

46、vm=VVoluumeMManaagerr:IInsttancce();connstchaar*subbsyss=evtt-ggetSSubssysttem();if(!ssubssys)SLLOGWW(NNossubssysttemfouundinnettlinnkeevennt);reeturrn;if(!sstrccmp(subbsyss,bloock)vmm-hhanddleBBlocckEvventt(evvt);eelseeiff(!strrcmpp(suubsyys,swwitcch)vmm-hhanddleSSwittchEEvennt(eevt);eelseeiff(!str

47、rcmpp(suubsyys,ussb_ccompposiite)vmm-hhanddleUUsbCCompposiiteEEvennt(eevt);eelseeiff(!strrcmpp(suubsyys,baatteery)eelseeiff(!strrcmpp(suubsyys,poowerr_suupplly)cppp HYPERLINK /yihongyuelan/article/details/6965165 o view plain viiew plaain HYPERLINK /yihongyuelan/article/details/6965165 o copy ccopyy

48、voiddNeetliinkHHanddlerr:oonEvventt(NeetliinkEEvennt*evtt)VollumeeMannageer*vm=VVoluumeMManaagerr:IInsttancce();connstchaar*subbsyss=evtt-ggetSSubssysttem();if(!ssubssys)SLLOGWW(NNossubssysttemfouundinnettlinnkeevennt);reeturrn;if(!sstrccmp(subbsyss,bloock)vmm-hhanddleBBlocckEvventt(evvt);eelseeiff(

49、!strrcmpp(suubsyys,swwitcch)vmm-hhanddleSSwittchEEvennt(eevt);eelseeiff(!strrcmpp(suubsyys,ussb_ccompposiite)vmm-hhanddleUUsbCCompposiiteEEvennt(eevt);eelseeiff(!strrcmpp(suubsyys,baatteery)eelseeiff(!strrcmpp(suubsyys,poowerr_suupplly) 22.对SSD卡挂挂载事件件开始处处理 vvoidd VoolummeMaanagger:haandlleBllockkEve

50、ent(NettlinnkEvventt *eevt)/代码码路径:AnddroiidSoourccecoode22.3/sysstemm/voold/VollumeeMannageer.ccpp/该方方法的主主要作用用是:/第一一, 遍遍历mPPathh容器,寻找与与eveent对对应的ssysffs_ppathh是否存存在与mmPatth容器器中。/第二二, 针针对Evventt中的aactiion有有4种处处理方式式:Addd,RRemoovedd,Chhangge,NNoacctioon。 HYPERLINK /yihongyuelan/article/details/6944979

51、o view plain vieww pllainnvoiddVoolummeMaanagger:haandlleBllockkEveent(NettlinnkEvventt*eevt)connstchaar*devvpatth=evvt-finndPaaramm(DDEVPPATHH);/*Loookuppavollumeetoohaandlletthissdeevicce*/VollumeeColllecctioon:iteerattorit;booolhhit=ffalsse;forr(iit=mVVoluumess-bbegiin();iit!=mmVollumees-endd();+

52、it)iff(!(*iit)-haandlleBllockkEveent(evtt)#ifddefNETTLINNK_DDEBUUGSSLOGGD(Devvicee%seveenthanndleedbbyvvoluume%sn,deevpaath,(*it)-ggetLLabeel();#enddifhhit=ttruee;bbreaak;if(!hhit)#ifddefNETTLINNK_DDEBUUGSLLOGWW(NNovvoluumesshaandlledbloockeveentforr%s,ddevppathh);#enddifcppp HYPERLINK /yihongyuelan

53、/article/details/6965165 o view plain viiew plaain HYPERLINK /yihongyuelan/article/details/6965165 o copy ccopyyvoiddVoolummeMaanagger:haandlleBllockkEveent(NettlinnkEvventt*eevt)connstchaar*devvpatth=evvt-finndPaaramm(DDEVPPATHH);/*Loookuppavollumeetoohaandlletthissdeevicce*/VollumeeColllecctioon:i

54、teerattorit;booolhhit=ffalsse;forr(iit=mVVoluumess-bbegiin();iit!=mmVollumees-endd();+it)iff(!(*iit)-haandlleBllockkEveent(evtt)#ifddefNETTLINNK_DDEBUUGSSLOGGD(Devvicee%seveenthanndleedbbyvvoluume%sn,deevpaath,(*it)-ggetLLabeel();#enddifhhit=ttruee;bbreaak;if(!hhit)#ifddefNETTLINNK_DDEBUUGSLLOGWW(NN

55、ovvoluumesshaandlledbloockeveentforr%s,ddevppathh);#enddif 3.对Bllockk挂载事事件进行行处理 DiirecctVoolumme:hanndleeBloockEEvennt(NNetllinkkEveent *evvt)/代码码路径:AnddroiidSoourccecoode22.3/sysstemm/voold/DirrecttVollumee.cppp/在AAdd acttionn中首先先会创建建设备节节点,然然后对ddiskk和paartiion两两种格式式的设备备分别进进行处理理。这里里是diisk格格式。 HYPERL

56、INK /yihongyuelan/article/details/6944979 o view plain vieww pllainnintDirrecttVollumee:hhanddleBBlocckEvventt(NeetliinkEEvennt*evtt)connstchaar*dp=eevt-fiindPParaam(DEVVPATTH);PatthCoolleectiion:itteraatorriit;forr(iit=mPPathhs-beggin();it!=mPaathss-eend();+iit)iff(!strrncmmp(ddp,*itt,sstrllen(*itt

57、)/*WWeccanhanndleethhisdissk*/iintacttionn=evtt-ggetAActiion();cconsstccharr*ddevttypee=evtt-ffinddParram(DEEVTYYPE);iif(acttionn=NeetliinkEEvennt:NlAActiionAAdd)inttmaajorr=atooi(eevt-fiindPParaam(MAJJOR);inttmiinorr=atooi(eevt-fiindPParaam(MINNOR);chaarnnodeepatth2255;snpprinntf(noddepaath,sizzeof

58、f(noodeppathh),/ddev/bloock/volld/%d:%d,majjor,miinorr);if(crreatteDeevicceNoode(noddepaath,maajorr,mminoor)SLLOGEE(EErroormmakiingdevviceenoode%ss(%s),noddepaath,sstreerroor(eerrnno);if(!sstrccmp(devvtyppe,diisk)hanndleeDisskAdddedd(dpp,eevt);/SSD卡插插入是AAdd事事件eelseehaandllePaartiitioonAdddedd(dpp,ee

59、vt);ellseif(acctioon=NNetllinkkEveent:NllActtionnRemmovee)if(!sstrccmp(devvtyppe,diisk)haandlleDiiskRRemoovedd(dpp,eevt);eelseehaandllePaartiitioonReemovved(dp,evvt);ellseif(acctioon=NNetllinkkEveent:NllActtionnChaangee)if(!sstrccmp(devvtyppe,diisk)haandlleDiiskCChanngedd(dpp,eevt);eelseehaandllePaa

60、rtiitioonChhangged(dp,evvt);ellseSLLOGWW(IIgnoorinngnnonaddd/reemovve/cchanngeeveent);rretuurn0;errrno=EENODDEV;retturnn-11;cppp HYPERLINK /yihongyuelan/article/details/6965165 o view plain viiew plaain HYPERLINK /yihongyuelan/article/details/6965165 o copy ccopyyintDirrecttVollumee:hhanddleBBlocckE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论