合併儲存空間

Android 一向支援外部儲存空間配件 (例如 SD 卡),但這些配件過去僅限於簡單的檔案儲存空間,因為它們預期會消失,且傳統外部儲存空間提供的資料保護功能有限。Android 6.0 推出了採用外部儲存媒體的功能,讓外部儲存媒體可充當內部儲存空間。

採用外部儲存媒體時,系統會將其格式化並加密,以便一次只與單一 Android 裝置搭配運作。由於媒體與採用媒體的 Android 裝置緊密相連,因此可安全地儲存所有使用者的應用程式和私人資料。

當使用者在可採用的位置插入新的儲存媒體 (例如 SD 卡) 時,Android 會詢問使用者如何使用媒體。他們可以選擇採用媒體,並將其格式化及加密,也可以繼續使用原始格式,用於簡單的檔案儲存。如果他們選擇採用,平台會提供將主要共用儲存空間內容 (通常掛載在 /sdcard) 遷移至新採用的媒體的服務,釋出內部儲存空間的寶貴空間。與傳統儲存空間不同,後者使用 MBR,因此檔案大小上限為 2 TB,而可採用儲存空間使用 GPT,因此檔案儲存空間上限為 ~9ZB。

只有在開發人員透過 android:installLocation 屬性表示支援時,應用程式才能放置在採用的儲存媒體上。系統會自動將支援應用程式的新安裝作業放在儲存空間最多的儲存裝置上,使用者可以在「設定」應用程式中,在儲存裝置之間移動支援的應用程式。系統會記住已移至採用式媒體的應用程式,並在媒體退出時返回。

安全性

平台會隨機為每部採用的裝置產生加密金鑰,並將這些金鑰儲存在 Android 裝置的內部儲存空間中。這樣一來,採用的媒體就能像內部儲存空間一樣安全。系統會根據已採用的分割區 GUID,將金鑰與已採用的裝置建立關聯。

如果裝置已設定在內部儲存空間使用檔案型加密 (FBE),則可採用儲存空間會同時使用 FBE 和中繼資料加密。否則,可採用儲存空間會使用全磁碟加密 (FDE)。

採用裝置的磁碟上版面配置會與內部資料分區 (包括 SELinux 標籤等) 密切對應。如果 Android 裝置支援多使用者,採用儲存裝置也會支援多使用者,並提供與內部儲存空間相同的隔離層級。

由於採用儲存裝置的內容與採用該裝置的 Android 裝置緊密連結,因此不應從父裝置中擷取加密金鑰,因此儲存裝置無法掛載到其他位置。

如果裝置使用 FBE,請參閱 FBE 說明文件中繼資料加密說明文件,瞭解如何在可採用儲存空間中設定 FBE 和中繼資料加密功能。

效能和穩定性

只有位於穩定位置的外部儲存媒體 (例如電池隔間內的插槽或保護蓋後方) 才適合採用,以免意外遺失或損毀資料。特別是連接至手機或平板電腦的 USB 裝置,絕對不應納入考量。一個常見的例外狀況是連接到電視型裝置的外接 USB 隨身碟,因為整部電視通常會安裝在穩定的位置。

使用者採用新的儲存裝置時,平台會執行基準測試,並比較其效能與內部儲存空間。如果採用的裝置速度明顯比內部儲存空間慢,平台會提醒使用者可能會降低使用體驗。這項基準測試是根據熱門 Android 應用程式的實際 I/O 行為所得出。目前,AOSP 實作項目只會在超過單一門檻時警告使用者,但裝置製造商可能會進一步調整這項功能,例如在卡片速度極慢時完全拒絕採用。

採用的裝置必須使用支援 POSIX 權限和擴充屬性的檔案系統進行格式設定,例如 ext4f2fs。為達到最佳效能,建議您將 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