從android2.2(froyo) , Android 改寫了vold code. 將code從c語言,變為了C++,並且充分繼承了framework,NetlinkListener等通用類,雖然較大了提交的vold的結構性,可繼承性和擴充性,但同時也增加了代碼的複雜度。
介紹一篇很不錯的文檔 ANDROID中的VOLD分析
但這篇文章更加側重在結構上,實用性有所欠缺,有些高雅,而缺乏簡單
本文首先詳細介紹各個檔案和類的主要作用,然後再詳細的介紹vold的操作流程,希望有所協助。如有任何問題,可以直接留言提問.
1, 各個檔案與類的主要作用:
main.cpp
: 看到main()函數,一切都不用了。重要提一點,vold換了一個新的 設定檔。換到了/etc/vold.fstab。你的vold沒有正常工作,第一件事情先去check一下配置沒有有沒有改。
volume.h/cpp ,volume
類:一個非常重要的類,但是沒有直接的執行個體,提供了sd卡的主要操作功能,包括mount,unmout,format,另一個重要結構android::List<Volume *> VolumeCollection; 在下一小部分解釋
DirectVolume.h/cpp,DirectVolume
類,繼承於volume,絕對是vold中最重要的類,在main.cpp檔案中,vold(main 函數裡)在初始化時,通過調用process_config解析config檔案中的每一行資訊建立一個DirectVolume執行個體,並且把該執行個體存貯在VolumeCollection中,DirectVolume主要實現了volume中間的4個虛函數,handleBlockEvent(處理從各種的block的事件),getDiskDevice(返回裝置編號),handleVolumeShared和handleVolumeUnshared(更改了狀態)。主要的實現是handleBlockEvent,通過解析事件的資訊,調用了相應的處理細節:handleDisk*** 和handlePartition***。
VolumeManager.h/cpp,VolumeManager
類:volume的管理函數,主要類成員mVolumes儲存著directvolume的指標,主要是負責調用volume和directvolume的各個實現函數,只是一個封裝的類。基本上是用handleBlockEvent 和handleSwitchEvent還處理接受到的不同NetlinkEvent。 其它則是通過const char *label尋找到對應的volume,然後調用這個volume的實現函數。單體類。
Fat.h/cpp, fat 類
,sd基於與普通pc相相容的考慮,採用的都是fat檔案系統,vold採用的是一個與fat16,fat32相容的vfat檔案系統,fat實現了check,mount,format三個最重要的函數實現,check,調用FSCK_MSDOS_PATH(/system/bin/fsck_msdos)check sd資訊;mount,主要是設定一些mount的參數;format,調用MKDOSFS_PATH (/system/bin/newfs_msdos),format sd成vfat檔案模式,fat類中的三個函數,均在volume類的函數中調用。
VoldCommand.h/cpp,VoldCommand類
:繼承自FrameworkCommand,沒有具體實現
CommandListener.h/cpp, CommandListener類:
繼承自FrameworkListener,實現著一個類似socket 監聽介面一樣的功能。是vold中對上層,也就是framework的介面。主要是實現了DumpCmd,VolumeCmd,ShareCmd,AsecCmd,StorageCmd,XwarpCmd,六個內部類,均繼承自VoldCommand,CommandListener類在建構函式裡面將上面的內部類作為command註冊進來,每個內部類主要的實現函數runCommand,處理接收到資料包以後的具體處理方法。
1,DumpCmd,可以dump出Loop,Devmapper,可以mount的檔案系統的資訊。
2,VolumeCmd,處理sd的各種操作,一般是通過調用VolumeManager的各種函數,實現mount,unmount,share,unshare, format,等資訊。
3,ShareCmd,調用VolumeManager的shareAvailable函數實現share的相關內容。
4,StorageCmd,切換到儲存模式的一些相關操作,主要調用了process類的一些操作。
5,AsecCmd,asec相關的
6,XwarpCmd,xwarp相關的
NetlinkHandler.h/cpp,NetlinkHandler類
,繼承自NetlinkListener,實現開始,結束,資訊處理的功能。
NetlinkManager.h/cpp,NetlinkManager類
,同上,在main函數裡面建立,功能同上,實際上只是對上面類的一個封裝。