Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

存儲

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 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跳入已運行的應用程序的mount命名空間,並bind將升級後的視圖安裝到位。請注意,權限降級始終會導致該應用被終止。

用於實現此功能的setns()功能至少需要Linux 3.8,但補丁程序已成功setns()移植到Linux 3.4。 PermissionsHostTest CTS測試可用於驗證正確的內核行為。