儲存空間

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 fork 時,我們為每個正在執行的應用程式建立一個掛載命名空間,並將適當的初始視圖綁定掛載到位。稍後,當授予執行時間權限時, vold會跳到已執行的應用程式的掛載命名空間,並將升級後的視圖掛載到位。請注意,權限降級始終會導致應用程式被終止。

用於實作此功能的setns()功能至少需要 Linux 3.8,但修補程式已成功向後移植到 Linux 3.4。 PermissionsHostTest CTS 測試可用於驗證正確的核心行為。