在上一篇博文《Android 2.3 SD卡掛載流程淺析(一)》主要簡單的介紹了SD卡的掛載流程。包括了從核心層到使用者層事件訊息的傳遞,以及Vold的簡介。本文將繼續介紹SD卡的掛載,但文中並不會涉及代碼的詳細分析,因為這部分網上已有資料,我會在文章結尾貼出來供大家參考。本文主要目的是一方面對自己學習這一部分的總結,另一方面希望大家能夠指出文中理解錯誤的地方。
1.SD卡掛載流程圖
SD卡的掛載流程圖如下:
綠色箭頭:表示插入SD卡後事件傳遞以及SD卡掛載
紅色箭頭:表示掛載成功後的訊息傳遞流程
黃色箭頭:表示MountService發出掛載/卸載SD卡的命令
大家可能對圖中突然出現的這麼多的名稱感到奇怪,這些都是在Android 2.3 源碼中可以找到的,接下來我會為大家一一解釋這些類的作用。
2.各個檔案的主要作用
(1)Kernel:這個是系統核心啦。不是我要分析的檔案,本文涉及內容不是核心級的哦!(努力學習中...)
(2)NetlinkManager:全稱是NetlinkManager.cpp位於Android 2.3源碼位置/system/vold/NetlinkManager.cpp。該類的主要通過引用NetlinkHandler類中的onEvent()方法來接收來自核心的事件訊息,NetlinkHandler位於/system/vold/NetlinkHandler.cpp。
(3)VolumeManager:全稱是VolumeManager.cpp位於Android 2.3源碼位置/system/vold/VolumeManager.cpp。該類的主要作用是接收經過NetlinkManager處理過後的事件訊息。因為我們這裡是SD卡的掛載,因此經過NetlinkManager處理過後的訊息會分為五種,分別是:block,switch,usb_composite,battery,power_supply。這裡SD卡掛載的事件是block。
(4)DirectVolume:位於/system/vold/DirectVolume.cpp。該類的是一個工具類,主要負責對傳入的事件進行進一步的處理,block事件又可以分為:Add,Removed,Change,Noaction這四種。後文通過介紹Add事件展開。
(5)Volume:Volume.cpp位於/system/vold/Volume.cpp,該類是負責SD卡掛載的主要類。Volume.cpp主要負責檢查SD卡格式,以及對複合要求的SD卡進行掛載,並通過Socket將訊息SD卡掛載的訊息傳遞給NativeDaemonConnector。
(6)NativeDaemonConnector:該類位於frameworks/base/services/java/com.android.server/NativeDaemonConnector.java。該類用於接收來自Volume.cpp 發來的SD卡掛載訊息並向上傳遞。
(7)MountService:位於frameworks/base/services/java/com.android.server/MountService.java。MountService是一個服務類,該服務是系統服務,提供對外部存放裝置的管理、查詢等。在外部存放裝置狀態發生變化的時候,該類會發出相應的通知給上層應用。在Android系統中這是一個非常重要的類。
(8)StorageManaer:位於frameworks/base/core/java/andriod/os/storage/StorageManager.java。在該類的說明中有提到,該類是系統儲存服務的介面。在系統設定中,有Storage相關項目,同時Setting也註冊了該類的監聽器。而StorageManager又將自己的監聽器註冊到了MountService中,因此該類主要用於上層應用擷取SD卡狀態。
通過上文對各個檔案的作用簡介,以及整個SD卡的掛載流程圖可以知道,Android 系統是如何從底層擷取SD卡掛載資訊的。
後文將繼續剖析器調用流程圖。