回顧 Android 11 中的存儲機制更新


此文轉載自:https://my.oschina.net/androiddevs/blog/4732584

Android 10 引入了對 外部存儲權限的更改,旨在更好地保護用戶數據以及降低應用的存儲空間。在 Android 11 開發者預覽版 的時候也加入了很多改進,以幫助開發者更好地適應這些權限修改。

在 Google Play 上發布的大部分應用都會 請求 (READ_EXTERNAL_STORAGE) 存儲權限,來做一些諸如在 SD 卡中存儲文件或者讀取多媒體文件等常規操作。這些應用可能會在磁盤中存儲大量文件,即使應用被卸載了還會依然存在。另外,這些應用還可能會讀取其他應用的一些敏感文件數據。

在 Android 10 中,我們調整了存儲權限的工作方式,僅為應用提供其所需的訪問權限。這也是在鼓勵應用在指定目錄下進行文件存儲以限制文件混亂。當應用被卸載后,這些相關的目錄也會被刪除。

Android 10 所帶來的關於存儲上的變更遵循了以下三個基本原則

  • 更好的從屬性: 系統知道哪些文件屬於哪些應用,這可以讓用戶更方便地管理他們的文件。當應用被卸載后,除非用戶需要,否則應用之前所創建的文件也不應該保留在設備上;
  • 保護應用數據: 當一個應用將 它所屬的文件 寫入外部存儲時,這些文件是不應該被其他應用所訪問的;
  • 保護用戶數據: 當用戶下載了一些文件,比如帶有敏感信息的郵件附件,這些文件應該對其他應用不可見。

目標 API 級別 (Target SDK Level) 設定為 Android 10 的應用無需請求 Storage 權限,就可以使用自己的外部存儲目錄並管理媒體集合 (音頻、視頻、圖片和下載數據)。Storage 權限僅允許讀取其他應用共享的音頻、視頻和圖片集合,但並不允許訪問非本應用創建的下載數據。在 Android 10 里唯一一種訪問其他應用創建的非媒體文件的途徑是使用 存儲訪問框架 (Storage Access Framework) 提供的文檔選擇器。

在 Android 11 中,通過下述的幾點來繼續優化分區存儲 (Scoped Storage) 的開發者體驗。

改進媒體存儲

Android 10 中要求所有應用都使用 MediaStore API 來訪問照片、視頻和音樂文件,我們也將繼續秉承這個原則。但是我們也知道,很多深度依賴基於原始文件路徑 API 的應用和第三方庫是很難切換到使用文件描述符 (File Descriptor) 的。因此在 Android 11 里,依賴原始文件路徑的 API 和庫 可以再次使用 了。您需要在應用的 Manifest 文件里添加 requestLegacyExternalStorage 屬性,以保證 Android 10 的用戶也可以使用該特性。

在實際的運行中,依賴原始文件路徑的 I/O 請求會被重定向到使用 MediaStore API,當使用這種方式訪問本應用存儲空間之外的文件時,這次重定向會造成性能影響。而且直接使用原始文件路徑,並不會比使用 MediaStore API 有更多優勢,因此我們強烈建議直接使用 MediaStore API。

在 Android 10 中,應用在對每一個文件請求編輯或刪除時都必須得到用戶的確認。而在 Android 11 中,應用可以一次請求 修改或者刪除多個媒體文件。系統的默認圖庫應用 (Gallery) 將不再展示這些對話框。我們希望這項改進能夠使用戶體驗更加順暢。

對 Storage Access Framework 的更新

當我們對廣泛的存儲訪問進行限制后,一些開發者試圖使用 Storage Access Framework (SAF) 遍歷整個文件系統。但是,SAF 並不適用於廣泛地訪問共享存儲內容。因此,我們 對其進行了更新,限制了它對某些路徑的可見性。

在 Android 11 中,將不再允許用戶授權訪問 Downloads 的根目錄、每個可用 SD 卡的根目錄以及其它應用的目錄。應用仍然可以通過 Storage Access Framework API 或者文件選擇器來幫助用戶從共享存儲中選取個別文件。

針對文件管理應用的特殊權限

針對文件管理器以及一些備份類的應用,它們需要獲得共享存儲的更廣泛的訪問權限。Android 11 里引入了一個特別的權限叫做 MANAGE _EXTERNAL_STORAGE,該權限將授權讀寫所有共享存儲內容,這也將同時包含非媒體類型的文件。但是獲得這個權限的應用還是無法訪問其他應用的應用專屬目錄 (app-specific directory),無論是外部存儲還是內部存儲。

我們希望繼續允許一些確實有廣泛訪問外部存儲文件需求的應用。在 Android 11 中,已獲得 MANAGE_EXTERNAL_STORAGE 權限的應用,可以將用戶引導至系統設置頁面,讓用戶選擇是否允許該應用 "訪問所有文件" (All Files Access)。下面的兩種應用示例是可以使用該權限的:

  • 文件管理器 —— 該類應用的主要功能是管理文件;
  • 備份和恢復 —— 該類應用需要訪問大批量的文件 (比如切換設備的時候進行數據遷移,或者將數據備份到雲端)。

如果您的應用需要訪問單個文件,比如文字處理應用,則應該使用 Storage Access Framework (SAF)。

如果您的應用需要 MANAGE_EXTERNAL_STORAGE 權限或者調用了依賴原始文件路徑的 API,那么您必須在 AndroidManifest 文件中添加 requestLegacyExternalStorage=true,這樣您的應用才能夠在搭載 Android 10 的設備上正常運行。

更多相關信息請查看我們在去年 Android 開發者峰會的分享視頻《准備好使用分區存儲》 或查看 Android 開發者文檔: 《Android 11 中的存儲更新》

我們非常重視您的反饋,您可以通過 issues tracker 向我們反饋 issue 或新特性需求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM