![Android23SD卡掛載流程淺析_第1頁](http://file4.renrendoc.com/view/0e9ec2f64dae44991c4651c317b4c541/0e9ec2f64dae44991c4651c317b4c5411.gif)
![Android23SD卡掛載流程淺析_第2頁](http://file4.renrendoc.com/view/0e9ec2f64dae44991c4651c317b4c541/0e9ec2f64dae44991c4651c317b4c5412.gif)
![Android23SD卡掛載流程淺析_第3頁](http://file4.renrendoc.com/view/0e9ec2f64dae44991c4651c317b4c541/0e9ec2f64dae44991c4651c317b4c5413.gif)
![Android23SD卡掛載流程淺析_第4頁](http://file4.renrendoc.com/view/0e9ec2f64dae44991c4651c317b4c541/0e9ec2f64dae44991c4651c317b4c5414.gif)
![Android23SD卡掛載流程淺析_第5頁](http://file4.renrendoc.com/view/0e9ec2f64dae44991c4651c317b4c541/0e9ec2f64dae44991c4651c317b4c5415.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、Android 2.3中關(guān)于SD卡掛載簡介 在Android 2.3中,當(dāng)SD卡插入系統(tǒng)之后,系統(tǒng)會自動掛載。Vold 就是負(fù)責(zé)掛載SD卡的,vold 的全稱是volume daemon。實際上是負(fù)責(zé)完成系統(tǒng)的CDROM,USB 大容量存儲,MMC 卡(后文有簡介,具體請百度)等擴展存儲的掛載任務(wù)自動完成的守護進程。它提供的主要特點是支持這些存儲外設(shè)的熱插拔。在Android上的這個vold 系統(tǒng)和GNU/Linux的之間存在很大的差異。自Android 2.2開始,vold又做了大改動,升級為vold 2.0,之前的配置文件是system/etc/vold.conf,vold 2.0變?yōu)閟y
2、stem/etc/vold.fstab。vold.fstab中的內(nèi)容顯示如下:# 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卡卡的第一一個分區(qū)區(qū),后面面是voold監(jiān)監(jiān)測的路路徑,當(dāng)當(dāng)插入ssd時,/deevicces/plaatfoorm/msmm_sddcc.2/mmm
6、c_hosst/mmmc11 路徑徑下會多多出一個個文件夾夾,在該該文件夾夾中包含含了SDD卡的各各種IDD信息,以及生生產(chǎn)日期期等。如果把ssd卡插插入設(shè)備備,在 /deev/bblocck/ 目錄下下面也會會多出幾幾個設(shè)備備節(jié)點,證明ssd卡的的驅(qū)動已已經(jīng)成功功加載。 我自自己測試試的目錄錄下面會會形成 mmccblkk0 和 mmmcbblk00p1 節(jié)點,注意:這兩個個節(jié)點的的意思,mmccblkk0代表表第一個個SD卡卡設(shè)備,mmccblkk0p11代表第第一個SSD卡設(shè)設(shè)備的第第一個分分區(qū)。真真正掛載載到系統(tǒng)統(tǒng)中的是是 mmmcbllk0pp1而不不是mmmcbllk0,這一點點很
7、重要要。PS:MMC(MulltiMMediia CCardd)卡由由西門子子公司和和首推CCF的SSanDDiskk于19997年年推出。19998年11月十四四家公司司聯(lián)合成成立了MMMC協(xié)協(xié)會(MMulttiMeediaa Caard Asssociiatiion簡簡稱MMMCA),現(xiàn)在在已經(jīng)有有超過884個成成員。MMMC的的發(fā)展目目標(biāo)主要要是針對對數(shù)碼影影像、音音樂、手手機、PPDA、電子書書、玩具具等產(chǎn)品品,號稱稱 是目目前世界界上最小小的Fllashh Meemorry存貯貯卡,尺尺寸只有有32mmm xx 244mm x 11.4mmm。雖雖然比SSmarrtMeediaa厚,
8、但但整體體體積卻比比SmaartMMediia小,而且也也比SmmarttMeddia輕輕,只有有1.55克。MMMC也也是把存存貯單 元和控控制器一一同做到到了卡上上,智能能的控制制器使得得MMCC保證兼兼容性和和靈活性性。 HYPERLINK /view/50957.htm MMC_百度百百科SD/MMMC 卡的設(shè)設(shè)備構(gòu)造造差不多多,不過過 MMMC 當(dāng)當(dāng)時的設(shè)設(shè)計比 SD 小一半半。所以以,SDD/MMMC 的的驅(qū)動通通用,進進一步的的,Liinuxx 的設(shè)設(shè)備節(jié)點點就延續(xù)續(xù)了 MMMC 的這個個名字,后面的的 bllk 是是塊設(shè)備備這個英英文的簡簡寫, mmccblkk 也就就是“ m
9、mcc/sdd 塊設(shè)設(shè)備”,0 就就是這個個 mmmc/ssd 設(shè)設(shè)備的順順序編號號,p11 就是是第一個個分區(qū)。掛載流程程簡析內(nèi)內(nèi)核層(kerrnell):當(dāng)當(dāng)有新的的SD/USBB設(shè)備插插入時,kerrnell將自動動檢測并并加載對對應(yīng)的驅(qū)驅(qū)動,同同時keerneel中的的syssfs機機制會在在有新的的驅(qū)動加加載時給給用戶層層發(fā)送相相應(yīng)的eevennt,然然后將kkernnel產(chǎn)產(chǎn)生的這這些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指令,大家會會發(fā)現(xiàn)路路徑并不不是我們們之前進進入的路路徑/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,最后我我們可以以在系統(tǒng)統(tǒng)設(shè)置界界面看到到SD卡卡掛 載載成功的的信息,這包括括了SDD卡的總總?cè)萘恳砸约翱捎糜每臻g如如下圖:SD卡的的掛載流流程大致致如此,MouuntSServvie實實際上還還會通知知PacckaggeMaanaggerSServvicee,因為為這里分分析的是是SD卡卡掛載從從底層到到上層的的表現(xiàn),因此這這里暫不不分析。簡約流流程圖如如下: 在上上一篇博博文 HYPERLINK /yihongyuelan/
13、article/details/6926034 AAndrroidd 2.3 SSD卡掛掛載流程程淺析(一)主要簡簡單的介介紹了SSD卡的的掛載流流程。包包 括了了從內(nèi)核核層到用用戶層事事件消息息的傳遞遞,以及及Volld的簡簡介。本本文將繼繼續(xù)介紹紹SD卡卡的掛載載,但文文中并不不會涉及及代碼的的詳細(xì)分分析,因因為這部部分網(wǎng)上上已有資資料,我我會 在在文章結(jié)結(jié)尾貼出出來供大大家參考考。本文文主要目目的是一一方面對對自己學(xué)學(xué)習(xí)這一一部分的的總結(jié),另一方方面希望望大家能能夠指出出文中理理解錯誤誤的地方方。 11.SDD卡掛載載流程圖圖 SDD卡的掛掛載流程程圖如下下: 綠色色箭頭:表示插插入SD
14、D卡后事事件傳遞遞以及SSD卡掛掛載 紅色色箭頭:表示掛掛載成功功后的消消息傳遞遞流程 黃色色箭頭:表示MMounntSeerviice發(fā)發(fā)出掛載載/卸載載SD卡卡的命令令 大家家可能對對圖中突突然出現(xiàn)現(xiàn)的這么么多的名名稱感到到奇怪,這些都都是在AAndrroidd 2.3 源源碼中可可以找到到的,接接下來我我會為大大家一一一解釋這這些類的的作用。 2.各各個文件件的主要要作用(1)Kerrnell:這個個是系統(tǒng)統(tǒng)內(nèi)核啦啦。不是是我要分分析的文文件,本本文涉及及內(nèi)容不不是內(nèi)核核級的哦哦!(努努力學(xué)習(xí)習(xí)中.) (2)NettlinnkMaanagger:全稱是是NettlinnkMaanagge
15、r.cppp位于AAndrroidd 2.3源碼碼位置/sysstemm/voold/NettlinnkMaanagger.cppp。該類類的主要要通過引引用NeetliinkHHanddlerr類中的的 onnEveent()方法法來接收收來自內(nèi)內(nèi)核的事事件消息息,NeetliinkHHanddlerr位于/sysstemm/voold/NettlinnkHaandller.cppp。(3)VollumeeMannageer:全全稱是VVoluumeMManaagerr.cppp位于于Anddroiid 22.3源源碼位置置/syysteem/vvoldd/VoolummeMaanagger
16、.cppp。 該該類的主主要作用用是接收收經(jīng)過NNetllinkkMannageer處理理過后的的事件消消息。因因為我們們這里是是SD卡卡的掛載載,因此此經(jīng)過NNetllinkkMannageer處理理過后 的消息息會分為為五種,分別是是:bllockk,swwitcch,uusb_commpossitee,baatteery,powwer_suppplyy。這里里SD卡卡掛載的的事件是是 bllockk。 (4)DirrecttVollumee:位于于/syysteem/vvoldd/DiirecctVoolumme.ccpp。該類的的是一個個工具類類,主要要負(fù)責(zé)對對傳入的的事件進進行進一一
17、步的處處理,bblocck事件件又可以以分為:Addd,Reemovved,Chaangee,Nooacttionn這四種種。后文文通過介介紹Addd事件件展開。 (5)Vollumee:Voolumme.ccpp位位于/ssysttem/volld/VVoluume.cppp,該類類是負(fù)責(zé)責(zé)SD卡卡掛載的的主要類類。Voolumme.ccpp主主 要負(fù)負(fù)責(zé)檢查查SD卡卡格式,以及對對復(fù)合要要求的SSD卡進進行掛載載,并通通過Soockeet將消消息SDD卡掛載載的消息息傳遞給給NattiveeDaeemonnConnnecctorr。 (6)NattiveeDaeemonnConnnecct
18、orr:該類類位于fframmewoorkss/baase/serrvicces/javva /comm.anndrooid.serrverr/NaativveDaaemoonCoonneectoor.jjavaa。該類類用于接接收來自自Vollumee.cppp 發(fā)發(fā)來的SSD卡掛掛載消息息并向上上傳遞。 (7)MouuntSServvicee:位于于fraamewworkks/bbasee/seerviicess/jaava/comm.anndrooid.serrverr/MoounttSerrvicce.jjavaa。MoounttSerrvicce是一一個服務(wù)務(wù)類,該該服務(wù)是是系統(tǒng)服服
19、務(wù),提提供對外外部存儲儲設(shè)備的的管理、查詢等等。在外外部存儲儲設(shè)備狀狀態(tài)發(fā)生生變化的的時候,該類會會發(fā)出相相應(yīng)的通通知給上上層應(yīng)用用。在AAndrroidd系統(tǒng)中中這是一一個非常常重要的的類。 (8)StooraggeMaanaeer:位位于frrameeworrks/basse/ccoree/jaava/anddriood/oos/sstorragee /SStorrageeMannageer.jjavaa。在該該類的說說明中有有提到,該類是是系統(tǒng)存存儲服務(wù)務(wù)的接口口。在系系統(tǒng)設(shè)置置中,有有Stooragge相關(guān)關(guān)項,同同時 SSetttingg也注冊冊了該類類的監(jiān)聽聽器。而而Stoorag
20、geMaanagger又又將自己己的監(jiān)聽聽器注冊冊到了MMounntSeerviice中中,因此此該類主主要用于于上層應(yīng)應(yīng)用獲 取SDD卡狀態(tài)態(tài)。通過上上文對各各個文件件的作用用簡介,以及整整個SDD卡的掛掛載流程程圖可以以知道,Anddroiid 系系統(tǒng)是如如何從底底層獲取取SD卡卡掛載信信息的。 后文將將繼續(xù)分分析程序序調(diào)用流流程圖。在前面兩兩篇博文文 HYPERLINK /yihongyuelan/article/details/6926034 Anndrooid 2.33 SDD卡掛載載流程淺淺析(一一) HYPERLINK /yihongyuelan/article/details/
21、6930112 Anddroiid 22.3 SD卡卡掛載流流程淺析析(二)中,主要簡簡單介紹紹了SDD卡的掛掛載流程程以及所所涉及的的關(guān)鍵文文件。在在 HYPERLINK /yihongyuelan/article/details/6963485 Anndrooid 2.33 SDD卡掛載載流程淺淺析(三三)中中,將簡簡要介紹紹Anddroiid 22.3中中Volld的運運行機制制,并從從接收內(nèi)內(nèi)核ueevennt開始始介紹程程序調(diào)用用流程。11. VVolddVoold的的全稱是是vollumee daaemoon。主主要負(fù)責(zé)責(zé)系統(tǒng)對對大容量量存儲設(shè)設(shè)備(UUSB/SD)的掛載載/卸載載
22、任務(wù),它是一一個守護護進程,該進程程支持這這些存儲儲外設(shè)的的熱插拔拔。自AAndrroidd 2.2開始始,Voold升升級為vvoldd 2.0,之之前的配配置文件件路徑在在sysstemm/ettc/vvoldd.coonf,Anddroiid 22.3之之后變?yōu)闉閟ysstemm/ettc/vvoldd.fsstabb。2.Volld工作作流程Volld的工工作流程程大致可可以分為為三個部部分:創(chuàng)創(chuàng)建監(jiān)聽聽、引導(dǎo)導(dǎo)、事件件處理。(11)創(chuàng)建建監(jiān)聽創(chuàng) 建監(jiān)聽聽指的是是創(chuàng)建監(jiān)監(jiān)聽鏈接接,一方方面用于于監(jiān)聽來來自內(nèi)核核的ueevennt,另另一方面面用于監(jiān)監(jiān)聽來自自上層的的控制命命令,這這些命
23、令令包括控控制SDD卡的掛掛載與卸卸載,這這里所說說 的鏈鏈接也就就是Soockeet。在在Anddroiid 系系統(tǒng)啟動動的時候候,innit進進程會去去解析iinitt.rcc文件,在該文文件中,有如下下代碼:Servvicee voold /syysteem/bbin/volld SSockket volld sstreeam 06660 rroott moountt Ipprioo bee 2這樣樣系統(tǒng)會會在啟動動的時候候創(chuàng)建與與上層通通信的SSockket。 在在Anddroiid 22.3源源碼/ssysttem/volld路徑徑下的mmainn.cppp中創(chuàng)創(chuàng)建了與與內(nèi)核通通信的
24、SSockket。在maain.cppp中通過過實例化化VollumeeMannageer和NNetllinkkMannageer時創(chuàng)創(chuàng)建。(22)引導(dǎo)導(dǎo)Voold進進程啟動動時候會會對現(xiàn)有有的外部部存儲設(shè)設(shè)備進行行檢查。首先加加載并解解析voold.fsttab,并檢查查掛載點點是否已已被掛載載。然后后執(zhí)行SSD卡的的掛載,最后處處理USSB大容容量存儲儲。因為為系統(tǒng)是是按行解解析的,通過查查看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 掛掛載命令令 標(biāo)簽 掛載點點 子子分區(qū)個個數(shù) 掛掛載路徑徑注: 子子分區(qū)個個數(shù)如果果為auuto則則表示只只有1個個子分區(qū)區(qū),也可可以為任任何不為為0的整整數(shù)。 參數(shù)之之間不能能有空格格,只能能以taab為間間隔(注注意:這這里為了了對齊因因此采用用空格隔隔開,如如果自行行修改vvoldd.fsstabb之后加加以空格格的話系系統(tǒng)會識識別不到到的)。 如果果volld.ffstaab解析析無誤,Vo
26、llueMManaagerr將創(chuàng)建建DirrecttVollumee,若vvoldd.fsstabb解析不不存在或或者打開開失敗,Volld 將將會讀取取Linnux內(nèi)內(nèi)核中的的參數(shù),此時如如果參數(shù)數(shù)中存在在SDCCARDD(也就就是SDD的默認(rèn)認(rèn)路徑),VoolummeMaanagger則則會創(chuàng)建建AuttoVoolumme, 如果不不存在這這個默認(rèn)認(rèn)路徑那那么就不不會創(chuàng)建建。(33)事件件處理通過過對兩個個socckett的監(jiān)聽聽,完成成對事件件的處理理以及對對上層應(yīng)應(yīng)用的響響應(yīng)。 a. Keerneel發(fā)出出uevventt NeetliinkMManaagerr檢測到到kerrnell
27、發(fā)出的的uevventt,解析析后調(diào)用用NettlinnkHaandller:onnEveent()方法法。該方方法會分分別處理理不同的的事件,這里重重要的事事件有: “bblocck”事事件主要要指Voolumme的mmounnt、uunmoountt、crreatteAssec等等。由VVoluumeMManaagerr的 hhanddleBBlocckEvventt(evvt)來來處理,根據(jù)多多態(tài)性最最終將會會調(diào)用AAutooVollumee或者DDireectVVoluume的的 haandlleBllockkEveent方方法來處處理。 “swwitcch”事事件主要要指Voolum
28、me的cconnnet、dissconnnett等。根根據(jù)相關(guān)關(guān)操作,改變設(shè)設(shè)備參數(shù)數(shù)(設(shè)備備類型、掛載點點等)通通過CoommaandLListteneer告知知FraameWWorkk層。 b. FraameWWorkk發(fā)出控控制命令令 與aa相反,CommmanndLiisteenerr檢測到到FraameWWorkk層的命命令(MMounntSeerviice發(fā)發(fā)出的命命令)調(diào)調(diào)用VoolummeMaanagger的的函 數(shù)數(shù),VoolummeMaanagger找找出對應(yīng)應(yīng)的Voolumme,調(diào)調(diào)用Voolumme函數(shù)數(shù)去掛載載/卸載載操作。而Voolumme類中中的相關(guān)關(guān)操作最最終通
29、過過調(diào)用LLinuux函 數(shù)完成成。這里再再次貼上上這張流流程圖:33.SDD卡掛載載流程代代碼淺析析這這里只是是簡要的的分析SSD卡掛掛載過程程中重要要的代碼碼調(diào)用,并沒有有深入分分析代碼碼,因為為這一部部分網(wǎng)上上已有牛牛人比較較詳盡的的分析了了,后面面我會貼貼出這些些參考文文章。 整個過過程從KKernnel檢檢測到SSD卡插插入事件件開始,之前的的一些硬硬件中斷斷的觸發(fā)發(fā)以及ddrivver的的加載這這里并不不敘述,一直到到SD卡卡掛載消消息更新新到“AAndrroidd系系統(tǒng)設(shè)置置存存儲”一一項中。 1. Keerneel發(fā)出出SD卡卡插入uueveent。 2. NeetliinkH
30、Handdlerr:oonEvventt()接接收內(nèi)核核發(fā)出的的uevventt并進行行解析。 3. VoolummeMaanagger:haandllBloockEEvennt()處理經(jīng)經(jīng)過第二二步處理理后的事事件。 4. 接下來來調(diào)用DDireectVVoluume: hhanddleBBlocckEvventt()。 在在該方法法中主要要有兩點點需要注注意: 第一一,程序序首先會會遍歷mmPatth容器器,尋找找與evventt對應(yīng)的的syssfs_patth是否否存在與與mPaath容容器中。 第第二,針針對evventt中的aactiion有有4種處處理方式式:Addd,RRemoo
31、vedd,Chhangge,NNoacctioon 。 例例如:在在Addd acctioon中會會有如下下操作(因為我我們這里里所講的的是SDD卡的掛掛載流程程,因此此以Addd來說說明),首先創(chuàng)創(chuàng)建設(shè)備備節(jié)點,其次對對dissk和pparttitiion兩兩種格式式的設(shè)備備分別進進行處理理。SDD卡屬于于dissk類型型。 55. 經(jīng)經(jīng)過上一一步之后后會調(diào)用用DirrecttVollumee:hhanddleDDiskkAddded()方法法,在該該方法中中會廣播播dissk iinseert消消息。 6. SocckettLisstenner:ruunLiisteenerr會接收收Dir
32、recttVollumee:hhanddleDDiskkAddded()廣播播的消息息。該方方法主 要完成成對evventt中數(shù)據(jù)據(jù)的獲取取,通過過Socckett。(PPS:這這里的SSockketLListteneer.ccpp位位于Anndrooid源源碼/ssysttem /coore/libbsyssutiils/srcc/中,后文的的FraamwoorkLListteneer.ccpp也也是,之之前自己己找了很很久 TT_T) 7. 調(diào)用用FraamewworkkLisstenner:onnDattaAvvaillablle()方法處處理接收收到的消消息內(nèi)容容。 88. FFram
33、mewoorkLListteneer:disspattchCCommmandd()該該方法用用于分發(fā)發(fā)指令。 9.在FFrammewoorkLListteneer:disspattchCCommmandd()方方法中,通過rrunCCommmandd()方方法去調(diào)調(diào)用相應(yīng)應(yīng)的指令令。 100. 在/sysstemm/voold/CommmanndLiisteenerr.cppp中有有runnCommmannd()的具體體實現(xiàn)。在該類類中可以以找到這這個方 法:CCommmanddLisstenner:VoolummeCmmd:runnCommmannd(),從字字面意思思上來看看這個方方法就是
34、是對Voolumme分發(fā)發(fā)指令的的解析。 該方方法中會會執(zhí)行“mouunt”函數(shù):vm-moounttVollumee(arrg22)。 111. mouuntVVoluume(argg2)在VVoluumeMManaagerr:mmounntVoolumme()中實現(xiàn)現(xiàn),在該該方法中中調(diào)用vv-mmounntVool()。 12. moounttVoll()方方法在VVoluume:moounttVoll()中中實現(xiàn),該函數(shù)數(shù)是真正正的掛載載函數(shù)。(在該該方法中中,后續(xù)續(xù)的處理理都在該該方法中中,在MMounnt過程程中會廣廣播相應(yīng)應(yīng)的消息息給上層層,通過過settStaate()函數(shù)數(shù)。)
35、 133. ssetSStatte(VVoluume:Chheckkingg);廣廣播給上上層,正正在檢查查SD卡卡,為掛掛載做準(zhǔn)準(zhǔn)備。 144. FFat:chheckk();SD卡卡檢查方方法,檢檢查SDD卡是否否是FAAT格式式。 15. Faat:doMMounnt()掛載SSD卡。 至至此,SSD的掛掛載已算算初步完完成,接接下來應(yīng)應(yīng)該將SSD卡掛掛載后的的消息發(fā)發(fā)送給上上層,在在13中中也提到到過,在在掛載以以及檢查查的過程程中其實實也有發(fā)發(fā)送消息息給上層層的。 166. MMounntSeerviice的的構(gòu)造函函數(shù)中會會開啟監(jiān)監(jiān)聽線程程,用于于監(jiān)聽來來自voold的的socck
36、ett信息。 TThreead thrreadd = neww Thhreaad(mmConnnecctorr,VOOLD_TAGG); thrreadd.sttartt(); 117. mCoonneectoor是NNatiiveDDaemmonCConnnecttor的的對象,NattiveeDaeemonnConnnecctorr繼承了了Runnnabble并并 Ovverrridee了ruun方法法。在rrun方方法中通通過一個個whiile(truue)調(diào)調(diào)用LiisteenTooSocckett()方方法來實實現(xiàn)實時時監(jiān)聽。 118. 在LiisteenTooSocckett()中
37、中,首先先建立與與Volld通信信的Soockeet SServver端端,然后后調(diào)用MMounntSeerviice中中的onnDaeemonnConnnecctedd()方方法。(PS:Javva與NNatiive通通信可以以通過 JNII,那么么Nattivee與Jaava通通信就需需要通過過Socckett來實現(xiàn)現(xiàn)了。 HYPERLINK /leoispace/blog/item/8aa5f41cc8609d04304e15bf.html AAndrroidd中Naativve與FFrammewoorkss通信 這篇篇文章中中有簡介介,感興興趣的朋朋友可以以參考一一下) 199. oo
38、nDaaemoonCoonneecteed()方法是是在接口口INaativveDaaemoonCoonneectoorCaallbbackks中定定義 的的,MoounttSerrvicce實現(xiàn)現(xiàn)了該接接口并OOverrridde了oonDaaemoonCoonneecteed()方法。該方法法開啟一一個線程程用于更更新外置置存儲設(shè)設(shè)備的 狀態(tài),主要更更新狀態(tài)態(tài)的方法法也在其其中實現(xiàn)現(xiàn)。 20. 然后后回到LListtenTToSoockeet中,通過iinpuutSttreaam來獲獲取Voold傳傳遞來的的eveent,并存放放在隊列列中。 211. 然然后這些些eveent會會在onn
39、DaeemonnConnnecctedd()通通過隊列列的”隊隊列.ttakee()”方法取取出。并并根據(jù)不不同的eevennt調(diào)用用 uppdattePuubliicVoolummeSttatee()方方法,在在該方法法中調(diào)用用pacckaggeMaanaggerSServvicee中的 upddateeExtteraalSttatee()方方法來更更新存儲儲設(shè)備的的狀態(tài)。(注:這里不不太理解解pacckaggeMaanaggerSServvicee中的 unlloaddAlllConntaiinerrs(aargss)方法法) 22. 更新新是通過過pacckaggeHeelpeer.gg
40、etMMounntSeerviice().ffiniishMMediiaUppdatte()方法來來實現(xiàn)的的。 23. 在uupdaatePPubllicVVoluumeSStatte()方法中中,更新新后會執(zhí)執(zhí)行如下下代碼: bbl.mmLisstenner.onSStorrageeStaateCChanngedd(); 在在Anddroiid源碼碼/paackaagess/appps/Setttinngs/srcc/coom.aandrroidd.seettiingss.deevicceinnfo /Meemorry.jjavaa代碼中中,實現(xiàn)現(xiàn)了SttoraageEEvenntLiist
41、eenerr 的匿匿名內(nèi)部部類,并并Oveerriide了了onSStorrageeStaateCChanngedd();方法。因此在在upddateePubbliccVollumeeStaate() 中中調(diào)用oonSttoraageSStatteChhangged();方方法后,Memmoryy.jaava中中也會收收到。在在Memmoryy.jaava中中收到以以后會在在 Seettiing界界面進行行更新,系統(tǒng)設(shè)設(shè)置存儲中中會更新新SD卡卡的狀態(tài)態(tài)。從而而SD卡卡的掛載載從底層層到達了了上層。 在經(jīng)過過了上面面步驟之之后,SSD卡的的掛載的的消息已已經(jīng)從底底層到達達了上層層。這是是自己在
42、在網(wǎng)上查查找資料料同時一一邊跟蹤蹤代碼后后得出的的結(jié)論,其中可可能還有有很多不不正確的的地方,也有很很多自己己沒有理理解的地地方,希希望大家家能夠幫幫忙指正正,感激激不盡。 后續(xù)將將繼續(xù)分分析SDD掛載廣廣播的發(fā)發(fā)出流程程,以及及SD卡卡掛載程程序調(diào)用用流程圖圖。前面的三三篇博文文 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卡掛掛載流程程淺析(三)中,我我們已經(jīng)經(jīng)知道了了最后是是在uppdattePuubliicVoolummeSttatee()中中調(diào)用oonSttoraageSStatteChhangged(),從從而達到到更新SSD卡掛掛載信
44、息息的。在在本文 HYPERLINK /yihongyuelan/article/details/6965165 Anddroiid 22.3 SD卡卡掛載流流程淺析析(四)中,我會將將前文提提到的程程序調(diào)用用流程圖圖畫出來來,并對對代碼進進行簡單單的分析析。 首首先,還還是掛出出這張老老圖(因因為每次次都用這這張圖00_0.)。 就權(quán)當(dāng)當(dāng)復(fù)習(xí)吧吧,這是是SD卡卡的整個個掛載流流程,而而程序的的調(diào)用也也是根據(jù)據(jù)這個流流程圖來來的。 1.接接收并處處理ueevennt 首先是是接收因因為插入入SD卡卡被內(nèi)核核檢測到到而發(fā)出出的Evventt; NettlinnkHaandller:onnEvee
45、nt(NettlinnkEvventt *eevt)/代碼碼路徑:AnddroiidSoourccecoode22.3/sysstemm/voold/NettlinnkHaandller.cppp/該方方法主要要通過eevt-geetSuubsyysteem();方法法來獲取取系統(tǒng)的的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對對應(yīng)的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中首先先會創(chuàng)建建設(shè)備節(jié)節(jié)點,然然后對ddiskk和paartiion兩兩種格式式的設(shè)備備分別進進行處理理。這里里是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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年河北省唐山市高一上學(xué)期期中考試歷史試卷
- 2025年債務(wù)糾紛導(dǎo)致離婚協(xié)議書策劃模板
- 2025年企業(yè)暫時性停止勞動合同樣本
- 2025年策劃復(fù)婚關(guān)系解除協(xié)議書樣本
- 2025年滌綸短纖項目申請報告模稿
- 2025年農(nóng)產(chǎn)品加工與合作協(xié)議書
- 2025年水蘇糖項目立項申請報告模板
- 建筑工地外部協(xié)作單位安全合作協(xié)議書
- 2025年信息技術(shù)服務(wù)合同續(xù)簽
- 2025年住宅區(qū)物品存放室租賃合同范文
- 元宇宙視域下非遺保護與傳播途徑探究
- 2025年買賣個人房屋合同(4篇)
- 2025代運營合同范本
- 武漢2025年湖北武漢理工大學(xué)管理人員招聘筆試歷年參考題庫附帶答案詳解
- 第十一章《功和機械能》達標(biāo)測試卷(含答案)2024-2025學(xué)年度人教版物理八年級下冊
- 使用錯誤評估報告(可用性工程)模版
- 高中英語新課程標(biāo)準(zhǔn)解讀課件
- TZSA 158-2023 雙引擎分布式視頻處理器技術(shù)規(guī)范
- 客服人員績效考核評分表
- 習(xí)慣性違章的特點危害及預(yù)防對策
評論
0/150
提交評論