android storage 學習筆記 (1)

Storage 概述

Android 支持包括便攜式存儲和內置存儲; 便攜式存儲是指物理介質(如 SD 卡或 USB 設備),用於進行臨時數據傳輸/文件存儲, 未經格式化、加密或綁定到特定設備; 從 Android 6.0 開始,Android 支持可合併的存儲設備,這種存儲設備是指可以像內部存儲設備那樣進行加密和格式化的物理介質(例如 SD 卡或 USB 設備)。移動存儲設備可存儲各類應用數據。

便攜式存儲設備

從 Android 4.4 開始,多個外部存儲設備通過 Context.getExternalFilesDirs()、Context.getExternalCacheDirs() 和 Context.getObbDirs() 提供給開發者。

在 Android 6.0 中,第三方應用無權訪問 sdcard_r 和 sdcard_rw GID。相反,訪問通過僅爲該應用裝載適當的運行時視圖來控制。系統會使用 everybody GID 來阻止用戶間交互。

Android 6.0 支持只需短時間內連接到設備的便攜式存儲設備,如 U 盤。當用戶插入新的便攜式設備時,該平臺會顯示一條通知,以讓用戶複製或管理相應設備上的內容。

可合併外部存儲媒介

在 Android 6.0 中,任何未合併的設備均被視爲便攜式設備。由於便攜式存儲設備只能短時間連接到設備,因此 Android 平臺會避免執行媒體掃描之類的繁重操作。第三方應用必須通過存儲訪問框架與便攜式存儲設備中的文件進行交互;出於隱私和安全考慮,明確禁止直接訪問。

Android 6.0 推出了合併外部存儲媒介(使其可以像內部存儲設備一樣使用)的功能
當合並外部存儲媒介時,系統將對其進行格式化和加密處理,以便一次只在一臺 Android 設備上使用。由於該媒介與合併它的 Android 設備緊密關聯,因此可以安全地爲所有用戶存儲應用和私密數據。

外部存儲空間由 vold init 服務和 StorageManagerService 系統服務共同管理, 外部實體存儲卷的裝載由 vold 處理:通過執行分階段操作準備好媒體,然後再將其提供給應用。

不同於因使用 MBR 而限制爲 2TB 的傳統存儲設備,可合併的存儲設備使用 GPT,因而文件存儲空間上限約爲 9ZB。

只有當開發者通過 android:installLocation 屬性指示提供支持時,才能將應用放置在合併的存儲媒介上。新安裝的受支持的應用將自動放置在具有最多可用空間的存儲設備上,用戶可以在“設置”應用中在存儲設備之間移動支持的應用。移動到已合併媒介的應用在媒介彈出時被記住,並在重新插入媒介時返回彈出前的狀態。

注意:在運行 Android 7.0-8.1 的設備上,文件級加密 (FBE) 無法用於可合併的存儲設備。
     在使用 FBE 的設備上,必須將新添加的存儲媒介(例如 SD 卡)用作傳統存儲設備。
     運行 Android 9 及更高版本的設備可以使用可合併的存儲設備和 FBE。

安全性

平臺爲每個合併的設備隨機生成加密密鑰,該密鑰存儲在 Android 設備的內部存儲設備上。由於合併的存儲設備的內容與合併該設備的 Android 設備密切相關,加密密鑰不應可以從父設備中進行提取,因此該存儲設備無法裝載到其他位置。

內容模式的默認加密算法是 aes-256-xts,而文件名的默認加密算法是 aes-256-heh。您可以通過分別更改屬性 ro.crypto.volume.contents_mode 和 ro.crypto.volume.filenames_mode 的值(更改方式爲在 device.mk 中設置 PRODUCT_PROPERTY_OVERRIDES)來更改這些設置。

如果您的內核不支持 HEH 文件名加密,您可以通過將以下內容添加到 device.mk 來改用 CTS 模式:

PRODUCT_PROPERTY_OVERRIDES += \
ro.crypto.volume.filenames_mode=aes-256-cts

穩定性

當用戶合併新的存儲設備時,平臺將運行基準測試,並將其性能與內部存儲設備進行比較。如果所合併設備的速度明顯慢於內部存儲設備,則平臺將警告用戶體驗可能會受到影響。此基準根據常用 Android 應用的實際 I/O 行爲得出。

目前,AOSP 實現只會在超出單個閾值時警告用戶,但是設備製造商可以進一步做出調整,例如如果存儲卡運行非常緩慢,則完全拒絕合併。

合併的設備必須使用支持 POSIX 權限和擴展屬性(如 ext4 或 f2fs)的文件系統進行格式化。爲了獲得最佳性能,建議基於閃存的存儲設備使用 f2fs 文件系統。

修正雙重加密

在 Android 8.x 及更低版本中,可合併的存儲設備不支持 FBE;
帶有可合併的存儲設備的所有現有設備都使用全盤加密 (FDE)。在 Android 9 中,可合併的存儲設備支持 FBE。但在默認情況下,文件內容已進行雙重加密,因爲可合併的存儲設備具有 FDE 和 FBE 層。默認情況下,這兩個層都會加密文件內容,這會降低設備性能。要解決雙重加密問題並提高設備性能,請執行以下操作:

將這些補丁程序添加到內核中: https://android-review.googlesource.com/q/REQ_NOENCRYPT
要使用 vold 傳達此項更改,請將以下內容添加到 device.mk 中:

PRODUCT_PROPERTY_OVERRIDES += ro.crypto.allow_encrypt_override=true

如果您設置了此項內容,但內核修補程序不存在,則可合併的存儲設備將無法工作,並且 vold 日誌將包含一條錯誤消息(提示它無法創建 dm 設備)。

注意:請勿使用 OTA 更新更改此標記,因爲這會更改可合併的存儲設備的磁盤格式。

測試

要測試可合併的存儲設備是否正常工作,請運行此 CTS 測試:

run cts  -m CtsAppSecurityHostTestCases  -t android.appsecurity.cts.AdoptableHostTest

要在設備沒有內置插槽或正使用 USB 連接器實現有效的 adb 連接時驗證 U 盤和 SD 卡的行爲,請使用:

adb shell sm set-virtual-disk true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章