Android5.0 vold-整體架構

Hly_Coder發表於2016-11-30

概述

該篇文章主要講解vold的整體框架和工作流程,不會涉及到具體的實現。
具體的實現(從framework到Native再到協議族)會在如下的後續文章裡提及。
Android5.0 vold-啟動過程
Android5.0 vold-註冊過程(上)
Android5.0 vold-註冊過程(下)

什麼是Vold

Vold是Volume Daemon的簡寫。
直譯過來Volume可以翻譯為卷,是電腦中磁碟的概念,對應到手機上就是相關儲存介質
看到Daemon字樣就知道這是一個守護程式,那它有什麼作用呢?
首先它是一個native程式,用於連線kernel和framework(SystemServer程式),使他們可以通訊。通訊的內容包括:SD插撥、掛載、解除安裝、格式化等。
框架如下圖

Android5.0 vold-整體架構
arch.png

更進一步

既然主要是講vold,那就先來看看vold的內部組成

  1. Vold框架(橙色方塊)
    裡面有3個比較重要的元件,分別是:NetlinkManagerVolumeManagerCommandListener.
    • NetlinkManager:通過netlink協議接收來自Linux核心uevent訊息,並將訊息轉發給VolumeManager處理
    • VolumeManager:把uevent相關資訊通過CommandListener傳送給SystemServer程式,該程式中的MountService根據收到的訊息會傳送相應的處理命令給VolumeManager,VolumeManager接收到命令後直接對外部儲存裝置進行操作。
    • CommandListener:內部封裝的一個Socket用於跨程式通訊,Java層的客戶端MountService就是通過該Socket和服務端Vold進行通訊的.
  2. systemServer中最主要的是MountService.可以接受來自Vold的資訊,也可以傳遞資訊到Vold(比如:setting中掛載, 清除sd卡等)
    綜上所訴,稍微詳細一點的框架圖如下:
    Android5.0 vold-整體架構
    detal_arch.jpeg

總結

vold的整體架構已經主要組成部分的功能就介紹完了,這裡故意沒有涉及到任何程式碼,主要目的就是得首先頭腦裡得有個大致的框架,知道某個元件的作用,從哪裡接受資訊,要把資訊傳遞到哪裡去,這樣才不至於在後續的程式碼講解中lost

More

上文提到了Netlink & Uevent & Socket,那他們是什麼呢?

Netlink是Linux系統中使用者空間程式和Kernel進行通訊的一種機制,使用者空間程式可以接收來自Kernel的訊息,同時也可以向Kernel傳送一些控制命令

uevent

uevent和Linux的裝置檔案系統及裝置模型有關,是sysfs向使用者空間傳送的訊息。
訊息格式實際上是一串字串。當外部裝置發生變化時,會引起Kernel傳送uevent訊息
一般裝置在/sys對應的目錄下有個叫uevent的檔案,往該檔案裡寫入指定資料,也會觸發Kernel傳送和該裝置相關的uevent訊息,核心通過uevent告知外部儲存系統發生的變化。

Socket

這個大家肯定已經耳熟能詳了,在這裡主要是用於vold和systemserver的IPC .
關於socket的使用可以點選 Unix Socket

相關文章