貯存

Android 外部存儲 HAL 圖標

隨著時間的推移,Android 已經發展到支持各種存儲設備類型和功能。所有版本的Android支持設備的傳統存儲,其中包括便攜式和仿真的存儲。便攜式存儲可以通過物理介質來提供,像SD卡或USB,即臨時數據傳送/文件存儲。物理介質可能會在設備中保留較長時間,但不會綁定到設備並且可能會被移除。自 Android 1.0 以來,SD 卡已可用作便攜式存儲設備; Android 6.0 添加了 USB 支持。仿真的存儲是通過仿真層暴露內部存儲的一部分提供,並且由於Android 3.0已面世。

在的Android 6.0開始,Android支持可採用存儲,這是由物理媒體提供,像SD卡或USB,被加密和格式化的行為類似於內部存儲設備。可採用的存儲可以存儲所有類型的應用程序數據。

權限

對外部存儲的訪問受到各種 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權限,請與setWhitelistedRestrictedPermissions()PackageInstaller.SessionParams類。

運行時權限

在Android 6.0引入了一個新的運行時權限模型,其中需要在運行時應用要求的能力。因為新的模型包括READ/WRITE_EXTERNAL_STORAGE權限,平台需要動態授予存儲訪問沒有殺死或重新啟動已經運行的應用程序。它通過維護所有已安裝存儲設備的三個不同視圖來實現此目的:

  • /mnt/runtime/default被示為應用程序沒有特殊的存儲的權限,並根名稱空間,其中adbd和其它系統部件住。
  • /mnt/runtime/read被示為應用程序與READ_EXTERNAL_STORAGE (設置LEGACY_STORAGE為Android 10)
  • /mnt/runtime/write被示為與應用程序WRITE_EXTERNAL_STORAGE

在 Zygote fork 時,我們為每個正在運行的應用程序創建一個掛載命名空間,並將掛載適當的初始視圖綁定到位。後來,當運行權限授予, vold跳進已經運行的應用程序和綁定安裝升級後的視圖到位的安裝命名空間。請注意,權限降級總是會導致應用程序被終止。

setns()來實現此功能的功能至少需要Linux的3.8,但補丁已成功回遷到Linux 3.4。該PermissionsHostTest CTS測試可以用來驗證正確的內核行為。