Android 一直支持外部存儲配件(例如 SD 卡),但這些配件在歷史上僅限於簡單的文件存儲,因為它們預期的無常性以及為傳統外部存儲提供的最小數據保護。 Android 6.0 引入了採用外部存儲媒體作為內部存儲的能力。
當採用外部存儲媒體時,它會被格式化和加密,一次只能用於一台 Android 設備。由於媒體與採用它的 Android 設備緊密相關,因此它可以為所有用戶安全地存儲應用程序和私人數據。
當用戶在合適的位置插入新的存儲介質(例如 SD 卡)時,Android 會詢問他們想如何使用該介質。他們可以選擇採用對其進行格式化和加密的媒體,也可以繼續按原樣使用它來進行簡單的文件存儲。如果他們選擇採用,該平台會提供將主要共享存儲內容(通常安裝在/sdcard
)遷移到新採用的媒體,從而釋放內部存儲上的寶貴空間。與傳統存儲由於使用MBR而限制為 2TB 不同,可採用的存儲使用GPT ,因此文件存儲限制約為 9ZB。
只有當開發者通過android:installLocation
屬性表示支持時,應用程序才能放置在採用的存儲介質上。新安裝的受支持應用程序會自動放置在可用空間最多的存儲設備上,用戶可以在“設置”應用程序中在存儲設備之間移動受支持的應用程序。移動到採用的媒體的應用程序在彈出媒體時會被記住,並在重新插入媒體時返回。
安全
該平台為每個採用的設備隨機生成加密密鑰,並將其存儲在 Android 設備的內部存儲中。這有效地使採用的媒體與內部存儲一樣安全。密鑰根據採用的分區 GUID 與採用的設備相關聯。
如果設備配置為在其內部存儲上使用基於文件的加密(FBE),則可採用的存儲同時使用 FBE 和元數據加密。否則,可採用的存儲使用全盤加密(FDE)。
採用設備的磁盤佈局與內部數據分區緊密鏡像,包括SELinux標籤等。當Android設備支持多用戶時,採用的存儲設備也支持與內部隔離級別相同的多用戶貯存。
由於採用的存儲設備的內容與採用它的 Android 設備密切相關,因此加密密鑰不應從父設備中提取,因此無法將存儲設備掛載到其他位置。
如果您的設備使用 FBE,請參閱FBE 文檔和元數據加密文檔,了解如何在可採用的存儲上配置 FBE 和元數據加密。
性能和穩定性
僅應考慮採用穩定位置的外部存儲介質,例如電池艙內的插槽或保護蓋後面的插槽,以幫助避免意外的數據丟失或損壞。特別是,連接到手機或平板電腦的 USB 設備絕不應考慮採用。一個常見的例外是連接到電視式設備的外部 USB 驅動器,因為整個電視通常安裝在一個穩定的位置。
當用戶採用新的存儲設備時,平台會運行基準測試並將其性能與內部存儲進行比較。如果採用的設備比內部存儲慢得多,則平台會警告用戶可能會降低體驗。該基準源自流行 Android 應用程序的實際 I/O 行為。目前,AOSP 實施只會警告用戶超過一個閾值,但設備製造商可能會進一步調整這一點,例如如果卡速度極慢,則完全拒絕採用。
採用的設備必須使用支持 POSIX 權限和擴展屬性的文件系統進行格式化,例如ext4
或f2fs
。為獲得最佳性能,建議將f2fs
文件系統用於基於閃存的存儲設備。
在執行定期空閒維護時,平台向採用的媒體發出FI_TRIM
,就像它對內部存儲所做的那樣。目前的 SD 卡規範不支持DISCARD
命令;但內核轉而使用ERASE
命令,SD 卡固件可能會選擇使用該命令進行優化。
測試
要測試可採用的存儲是否正常工作,請運行此 CTS 測試:
cts-tradefed run commandAndExit cts-dev \ -m CtsAppSecurityHostTestCases \ -t android.appsecurity.cts.AdoptableHostTest
要在設備沒有內置插槽或 USB 連接器用於活動 adb 連接時驗證 USB 驅動器和 SD 卡的行為,請使用:
adb shell sm set-virtual-disk true