Android儲存(3)– 裝置配置

018912251077_發表於2019-03-04

外部儲存由vold init服務和MountService系統服務的組合管理。物理外部儲存卷的安裝由vold處理,vold執行臨時操作以在將媒體暴露給應用程式之前準備媒體。

檔案對映

對於Android 4.2.2及更早版本,裝置特定的vold.fstab配置檔案定義了從sysfs裝置到檔案系統掛接點的對映,每行都遵循以下格式:

dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]複製程式碼
  • label:卷的標籤。
  • mount_point:安裝卷的檔案系統路徑。
  • partition:分割槽編號(基於1),或第一個可用分割槽的“auto”。
  • sysfs_path:可以提供此裝入點的裝置的一個或多個sysfs路徑。用空格分隔,每個都必須以/開頭。
  • flags:可選的逗號分隔的標誌列表,不能包含/。可能的值包括不可刪除和可加密。

對於Android 4.3版本和更高版本,initvoldrecovery使用的各種fstab檔案在/fstab.<device>檔案中統一。對於由vold管理的外部儲存卷,條目應具有以下格式:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>複製程式碼
  • srcsysfs(通常安裝在/sys)下面的路徑到可以提供裝入點的裝置。路徑必須以/開頭。
  • mount_point:安裝卷的檔案系統路徑。
  • type:捲上的檔案系統的型別。對於外部卡,這通常是vfat
  • mnt_flagsVold忽略此欄位,應將其設定為defaults
  • fs_mgr_flagsVold忽略統一fstab中不包括此欄位中的voldmanaged=標誌的任何行。此標誌後面必須跟有描述卡的標籤,分割槽號或單詞auto。這裡是一個例子:voldmanaged = sdcard:auto。其他可能的標誌是nonremovableencryptable = sdcardnoemulatedsdencryptedable = userdata

配置詳細資訊

框架級別及以上的外部儲存互動通過MountService進行處理。由於Android6.0中的配置更改(如刪除storage_list.xml資源覆蓋),配置詳細資訊分為兩類。

Android 5.x and earlier

Android 5.x和更早版本

特定於裝置的storage_list.xml配置檔案通常通過frameworks/base覆蓋來提供,定義了儲存裝置的屬性和約束。<StorageList>元素包含一個或多個<storage>元素,其中一個應標記為主。<storage>屬性包括:

mountPoint:此安裝的檔案系統路徑。
storageDescription:描述此安裝的字串資源。
primary:如果此安裝是主外部儲存,則為true。
removable:如果此安裝程式具有可移動介質(如物理SD卡),則為true。
emulated:true如果此安裝被模擬並由內部儲存器支援,可能使用FUSE守護程式。
mtp-reserve:MTP應為免費儲存預留的儲存的MB數。僅當安裝標記為模擬時使用。
allowMassStorage:如果此安裝可通過USB大容量儲存共享,則為true。
maxFileSize:最大檔案大小(MB)。

裝置可以通過模擬由內部儲存支援的不區分大小寫,無許可權的檔案系統來提供外部儲存。一個可能的實現由system/core/sdcard中的FUSE守護程式提供,可以作為裝置特定的init.rc服務新增:

# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023
    class late_start複製程式碼

其中source_path是後端內部儲存,dest_path是目標安裝點。

在配置特定於裝置的init.rc指令碼時,必須將EXTERNAL_STORAGE環境變數定義為主外部儲存器的路徑。/sdcard路徑還必須解析到相同的位置,可能通過符號連結。 如果裝置在平臺更新之間調整外部儲存的位置,應該建立符號連結,以便舊路徑繼續工作。

Android 6.0

儲存子系統的配置現在集中在特定於裝置的fstab檔案中,並且已刪除多個歷史靜態配置檔案/變數以支援更多動態行為:

storage_list.xml資源覆蓋已被刪除,並且不再由框架使用。儲存裝置現在由vold檢測時動態配置。

已刪除EMULATED_STORAGE_SOURCE/TARGET環境變數,Zygote不再使用它來配置使用者特定的裝入點。相反,使用者分離現在使用使用者特定的GID實施,並且主共享儲存在執行時通過vold安裝到位。

開發人員可以根據其用例繼續動態或靜態地構建路徑。在路徑中包括UUID標識每卡使開發人員的位置更清楚。(例如,/storage/ABCD-1234/report.txt顯然是與/storage/DCBA-4321/report.txt不同的檔案。)

硬編碼的FUSE服務已從裝置特定的init.rc檔案中刪除,並在需要時從vold動態分支。

除了這些配置更改,Android6.0包括可採用的儲存的概念。對於Android6.0裝置,任何未採用的物理介質都被視為可移植。

Adoptable storage

採用儲存

要在fstab中指示可採用的儲存裝置,請在fs_mgr_flags欄位中使用encryptable = userdata屬性。這裡有一個典型的定義:

/devices/platform/mtk-msdc.1/mmc_host*      auto      auto     defaults
voldmanaged=sdcard1:auto,encryptable=userdata複製程式碼

當採用儲存裝置時,平臺擦除內容並寫入定義兩個分割槽的GUID分割槽表:

一個小的空android_meta分割槽,留作將來使用。分割槽型別GUID19A710A2-B3CA-11E4-B026-10604B889DCF。一個大的android_ext分割槽,使用dm-crypt加密,並根據核心功能使用ext4f2fs格式化。分割槽型別GUID193D1EA4-B3CA-11E4-B075-10604B889DCF

Portable storage

行動式儲存

fstab中,預設情況下具有voldmanaged屬性的儲存裝置是可移植的,除非定義了另一個屬性,如encryptedable = userdata。例如,以下是USB OTG裝置的典型定義:

/devices/*/xhci-hcd.0.auto/usb*      auto            auto    defaults
                                     voldmanaged=usb:auto複製程式碼

該平臺使用blkid在裝入之前檢測檔案系統型別,並且當檔案系統不受支援時,使用者可以選擇格式化媒體。

相關文章