
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_STORAGE
和 WRITE_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 測試,驗證核心的正確行為。