
Android 支援傳統儲存裝置,這類裝置定義為不區分大小寫的檔案系統,並具有不可變動的 POSIX 權限類別和模式。傳統儲存空間的概念涵蓋模擬和可攜式儲存空間。可攜式儲存空間的定義是指系統未 採用的任何外部儲存空間,因此未經過格式化和加密,或未與特定裝置綁定。由於傳統外部儲存空間無法為儲存的資料提供足夠保護,因此系統程式碼不應將機密資料儲存在外部儲存空間。具體來說,設定和記錄檔應只儲存在可有效保護的內部儲存空間中。
多使用者外部儲存空間
從 Android 4.2 開始,裝置可支援多位使用者,外部儲存空間必須符合下列限制:
- 每位使用者都必須擁有自己的隔離主外部儲存空間,且不得存取其他使用者的主外部儲存空間。
/sdcard
路徑必須根據執行程序的使用者,解析為正確的使用者專屬主要外部儲存空間。Android/obb
目錄中的大型 OBB 檔案儲存空間可供多位使用者共用,以利最佳化。- 應用程式不得寫入次要外部儲存空間,但可寫入由合成權限允許的套件專屬目錄。
這項功能的預設平台實作方式會利用 Linux 核心命名空間,為每個 Zygote 分支程序建立獨立的掛載表,然後使用繫結掛載點,在該私人命名空間中提供正確的使用者專屬主要外部儲存空間。
在啟動時,系統會在 EMULATED_STORAGE_SOURCE
中掛接單一模擬外部儲存空間 FUSE 守護程序,並隱藏在應用程式中。Zygote 分支後,會將 FUSE 守護程式底下的適當使用者專屬子目錄繫結至 EMULATED_STORAGE_TARGET
,以便為應用程式正確解析外部儲存空間路徑。由於應用程式缺少其他使用者儲存空間的可用掛載點,因此只能存取啟動該應用程式的使用者儲存空間。
這個實作方式還會使用共用子樹核心功能,將掛載事件從預設根命名空間傳播至應用程式命名空間,確保 ASEC 容器和 OBB 掛載功能繼續正常運作。方法是將 rootfs 掛載為共用,然後在建立每個 Zygote 命名空間後,將其重新掛載為從屬。
多個外部儲存裝置
自 Android 4.4 起,開發人員可透過 Context.getExternalFilesDirs()
、Context.getExternalCacheDirs()
和 Context.getObbDirs()
取得多個外部儲存裝置。
WRITE_EXTERNAL_STORAGE
權限只能授予裝置上主要外部儲存空間的寫入權限。應用程式不得寫入次要外部儲存空間裝置,但可寫入合成權限允許的套件專屬目錄。以這種方式限制寫入作業,可確保系統在解除安裝應用程式時能清除檔案。
USB 媒體支援
Android 6.0 支援可攜式儲存裝置,也就是僅連接裝置一段時間的裝置,例如 USB 隨身碟。使用者插入新行動裝置時,平台會顯示通知,讓使用者複製或管理該裝置的內容。
在 Android 6.0 中,任何未採用的裝置都會視為可攜式裝置。由於可攜式儲存裝置的連線時間很短,因此平台會避免執行媒體掃描等繁重作業。第三方應用程式必須透過 Storage Access Framework 與可攜式儲存空間中的檔案互動;基於隱私權和安全性考量,直接存取權已明確遭到封鎖。