傳統存儲

Android 外部儲存 HAL 圖標

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()向開發人員展示多個外部儲存裝置。

透過這些 API 出現的外部儲存裝置必須是裝置的半永久性部分(例如電池盒中的 SD 卡插槽)。開發人員希望儲存在這些位置的資料能夠長期可用。因此,不應透過這些 API 顯示臨時儲存裝置(例如 USB 大容量儲存裝置)。

WRITE_EXTERNAL_STORAGE權限必須僅授予對裝置上的主外部儲存的寫入存取權限。不得允許應用程式寫入輔助外部儲存設備,除非合成權限允許在其特定於套件的目錄中。以這種方式限制寫入可確保系統可以在卸載應用程式時清理檔案。

USB 媒體支援

Android 6.0 支援僅短時間連接到設備的便攜式儲存設備,例如 USB 隨身碟。當使用者插入新的可攜式裝置時,平台會顯示一則通知,讓他們複製或管理該裝置的內容。

在Android 6.0中,任何未採用的設備都被認為是便攜式的。由於便攜式儲存的連接時間很短,因此該平台避免了媒體掃描等繁重的操作。第三方應用程式必須透過儲存存取框架才能與可攜式儲存上的檔案互動;出於隱私和安全原因,直接存取被明確阻止。