Android vold 2.0 源碼詳解 (1)

來源:互聯網
上載者:User

從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函數裡面建立,功能同上,實際上只是對上面類的一個封裝。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.