Storage

Android 外部儲存空間 HAL 圖示

Android 不斷演進,支援多種儲存裝置類型和功能。所有 Android 版本都支援傳統儲存空間的裝置,包括可攜式和模擬儲存空間。可攜式儲存空間可由 SD 卡或 USB 等實體媒體提供,用於臨時資料傳輸/檔案儲存。實體媒體可能會在裝置中長時間保留,但不會與裝置繫結,因此可能會遭到移除。自 Android 1.0 版起,SD 卡做為可攜式儲存空間;Android 6.0 新增了 USB 支援。模擬儲存空間是透過模擬層公開部分內部儲存空間而提供,自 Android 3.0 起便已可使用。

從 Android 6.0 開始,Android 支援 可採用儲存空間,這是由 SD 卡或 USB 等實體媒體提供,並經過加密和格式化處理,以便像內部儲存空間一樣運作。可採用的儲存空間可儲存所有類型的應用程式資料。

權限

外部儲存空間存取權受到多種 Android 權限保護。自 Android 1.0 起,寫入存取權會受到 WRITE_EXTERNAL_STORAGE 權限保護。自 Android 4.1 起,讀取存取權會受到 READ_EXTERNAL_STORAGE 權限的保護。

自 Android 4.4 起,外部儲存裝置上的檔案擁有者、群組和模式,現在會根據目錄結構合成。這可讓應用程式管理外部儲存空間中的套件專屬目錄,而不必擁有廣泛的 WRITE_EXTERNAL_STORAGE 權限。舉例來說,套件名稱為 com.example.foo 的應用程式現在可以在沒有權限的情況下,自由存取外部儲存裝置上的 Android/data/com.example.foo/。這些合成權限是透過在 FUSE 守護程序中包裝原始儲存裝置而達成。

從 Android 10 開始,指定 Android 9 以下版本的應用程式預設為舊版儲存空間,並可選擇啟用隔離儲存空間。以 Android 10 為目標版本的應用程式,預設為使用隔離儲存空間,但可以暫時選擇停用。使用可控制儲存空間模式的資訊清單屬性 requestLegacyExternalStorage 變更預設狀態。

由於 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 權限都受到軟性限制,因此如果安裝程式未將應用程式加入許可清單,權限只能控制神經和視覺集合的存取權,無法存取 SD 卡。即使應用程式要求舊版儲存空間,也適用這項規定。如要進一步瞭解硬性限制和軟性限制,請參閱「 Android 10 中的硬性限制和軟性限制」。

如果安裝程式將權限加入許可清單,則以舊版模式執行的應用程式會取得非隔離權限行為。權限可控管 SD 卡存取權,以及聽覺和視覺收藏。如果應用程式指定 Android 9 或以下版本且未啟用隔離儲存空間,或指定 Android 10 並選擇不採用,就會發生這種情況。

許可清單狀態只能在安裝時指定,且必須先安裝應用程式才能變更。

如要進一步瞭解如何設定 READ_EXTERNAL_STORAGE 權限,請參閱 PackageInstaller.SessionParams 類別中的 setWhitelistedRestrictedPermissions()

Android 13 推出了精細的媒體權限,以便支援存取其他應用程式建立的媒體檔案的應用程式。應用程式必須要求「 精細媒體權限」中列出的其中一個或多個精細媒體權限,而非 READ_EXTERNAL_STORAGE 權限。

Android 14 以 精細媒體權限為基礎,可讓使用者在應用程式要求媒體權限時,授予視覺媒體資料庫的部分存取權。詳情請參閱「 授予相片和影片的部分存取權」。

執行階段權限

Android 6.0 推出了新的 執行階段權限模式,可讓應用程式在執行階段需要時要求功能。由於新模型包含 READ/WRITE_EXTERNAL_STORAGE 權限,因此平台需要動態授予儲存空間存取權,但不得終止或重新啟動已執行的應用程式。這項服務會維持所有已掛載儲存裝置的三種不同檢視畫面:

  • /mnt/runtime/default 會顯示給沒有特殊儲存空間權限的應用程式,以及 adbd 和其他系統元件所在的根命名空間。
  • /mnt/runtime/read 會顯示給具有 READ_EXTERNAL_STORAGE 的應用程式 (針對 Android 10 設定 LEGACY_STORAGE)
  • /mnt/runtime/write 會顯示給具有 WRITE_EXTERNAL_STORAGE 的應用程式

在 Zygote 分支時,我們會為每個執行中的應用程式建立掛載命名空間,並將適當的初始檢視畫面綁定掛載到適當位置。稍後,當授予執行階段權限時,vold 會跳至已執行應用程式的掛載點命名空間,並將升級的檢視畫面繫結至適當位置。請注意,權限降級一律會導致應用程式終止。

用於實作這項功能的 setns() 功能至少需要 Linux 3.8,但修補程式已成功回移至 Linux 3.4。您可以使用 PermissionsHostTest CTS 測試,驗證核心的正確行為。